sl4j和logback - 是否可以以编程方式设置包的日志记录级别?

时间:2014-01-26 20:27:31

标签: java logging slf4j

我能够使用以下代码以编程方式在应用程序上设置日志记录级别,但是也可以在包级别上执行此 ,比如com.somepackage。*我想要的地方所述包装上的级别仅为ERROR而不是DEBUG或INFO?

// Sets the logging level to INFO
LoggerContext loggerContext = (LoggerContext)LoggerFactory.getILoggerFactory();
Logger rootLogger = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
rootLogger.setLevel(Level.INFO);

但我似乎找不到在包级别上设置它的方法......

4 个答案:

答案 0 :(得分:25)

您应将包名称设置为logger-name

// Sets the package level to INFO
LoggerContext loggerContext = (LoggerContext)LoggerFactory.getILoggerFactory();
Logger rootLogger = loggerContext.getLogger("com.somepackage");
rootLogger.setLevel(Level.INFO);

你应该能够让包名更优雅,但基本上就是这样。 这遵循Logger Context的树状层次结构: Logger Context

答案 1 :(得分:4)

您可以使用logback ..

Logger LOG = (Logger) org.slf4j.LoggerFactory.getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME);
LOG.setLevel(Level.WARN);

这解决了我的问题。

答案 2 :(得分:1)

您可以获取包的SLF4J记录器并将其转换为Logback记录器。少了@ dimitri-dewaele的代码。

((Logger) LoggerFactory.getLogger("com.somepackage")).setLevel(DEBUG)

@ nandu-prajapati的方法类似,只是它设置了根记录器级别,而不是所需的级别。

答案 3 :(得分:1)

如果您不想将logback-classic更改为编译时依赖项,则此处是一些使用反射设置此级别的代码,假设将logback用作slf4j运行时绑定。这里的 AbcClass 是您要将其记录器级别更改为 TRACE 的类:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SomeClass {
private static final Logger logger = LoggerFactory.getLogger(SomeClass .class);
    public static void beforeEachTest() throws Exception {
        final Logger loggerInterface = LoggerFactory.getLogger(AbcClass.class);
        String loggerLevelNew = "TRACE";
        if (!loggerInterface.isTraceEnabled()) {
            try {
                Class<?> levelLogBackClass = Class.forName("ch.qos.logback.classic.Level");
                Method toLevelMethod = levelLogBackClass.getDeclaredMethod("toLevel", String.class);
                Object traceLvel = toLevelMethod.invoke(null, loggerLevelNew);
                Method loggerSetLevelMethod= loggerInterface.getClass().getDeclaredMethod("setLevel", levelLogBackClass);
                loggerSetLevelMethod.invoke(loggerInterface, traceLvel);
            } catch (Exception e) {
                logger.warn("Problem setting logger level to:{}, msg: {}", loggerLevelNew, e.getMessage());
                throw e;
            }
        }
    }
}

对于log4j和JDK日志记录可以做类似的事情,以使该(某种)库不可知