/** * This file is part of VITAM Project. * * Copyright 2009, Frederic Bregier, and individual contributors by the @author tags. See the * COPYRIGHT.txt in the distribution for a full listing of individual contributors. * * All VITAM Project is free software: you can redistribute it and/or modify it under the terms of * the GNU General Public License as published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * VITAM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * Public License for more details. * * You should have received a copy of the GNU General Public License along with VITAM . If not, see * <http://www.gnu.org/licenses/>. */ package org.waarp.common.logging; import java.io.OutputStream; import java.io.PrintStream; import java.io.UnsupportedEncodingException; import org.slf4j.LoggerFactory; import org.slf4j.helpers.NOPLoggerFactory; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; /** * logger factory using SLF4J from LOGBACK * * @author Frederic Bregier * */ public class WaarpSlf4JLoggerFactory extends WaarpLoggerFactory { static final String ROOT = Logger.ROOT_LOGGER_NAME; // Old versions: "root"; // LoggerContext.ROOT_NAME; // /** * * @param level */ public WaarpSlf4JLoggerFactory(final WaarpLogLevel level) { super(level); seLevelSpecific(currentLevel); } @Override protected void seLevelSpecific(final WaarpLogLevel level) { final Logger logger = (Logger) LoggerFactory.getLogger(ROOT); switch (level) { case TRACE: logger.setLevel(Level.TRACE); break; case DEBUG: logger.setLevel(Level.DEBUG); break; case INFO: logger.setLevel(Level.INFO); break; case WARN: logger.setLevel(Level.WARN); break; case ERROR: logger.setLevel(Level.ERROR); break; default: logger.setLevel(Level.WARN); break; } } @Override public WaarpLogger newInstance(final String name) { final Logger logger = (Logger) LoggerFactory.getLogger(name); return new WaarpSlf4JLogger(logger); } WaarpSlf4JLoggerFactory(final boolean failIfNOP) { super(null); assert failIfNOP; // Should be always called with true. // SFL4J writes it error messages to System.err. Capture them so that the user does not see such a message on // the console during automatic detection. final StringBuffer buf = new StringBuffer(); final PrintStream err = System.err; try { System.setErr(new PrintStream(new OutputStream() { @Override public void write(final int b) { buf.append((char) b); } }, true, "US-ASCII")); } catch (final UnsupportedEncodingException e) { throw new Error(e); } try { if (LoggerFactory.getILoggerFactory() instanceof NOPLoggerFactory) { throw new NoClassDefFoundError(buf.toString()); } else { err.print(buf.toString()); err.flush(); } } finally { System.setErr(err); seLevelSpecific(currentLevel); } } @Override protected WaarpLogLevel getLevelSpecific() { final Logger logger = (Logger) LoggerFactory.getLogger(ROOT); if (logger.isTraceEnabled()) { return WaarpLogLevel.TRACE; } else if (logger.isDebugEnabled()) { return WaarpLogLevel.DEBUG; } else if (logger.isInfoEnabled()) { return WaarpLogLevel.INFO; } else if (logger.isWarnEnabled()) { return WaarpLogLevel.WARN; } else if (logger.isErrorEnabled()) { return WaarpLogLevel.ERROR; } return null; } }