这只会更改根记录器,当我尝试打印项目内任何类的日志级别时,它不是所需的日志级别
请注意Logger#getEffectiveLevel,而不是Logger#getLevel 是用于过滤日志的实际级别。
参考Effective Level aka Level Inheritance:
如果给定的记录器没有被分配一个级别,那么它会从它最近的祖先那里继承一个具有分配级别的记录器。更正式地说:
给定记录器 L 的有效级别等于其层次结构中的第一个非空级别,从 L 本身开始并在层次结构中向上移动到根记录器。
参考LoggersetLevel和handleParentLevelChange的源码,如果没有设置这些logger的日志级别,调用package logger的setLevel会设置内部logger的“Effective Level”。
如果这些记录器中已经设置了日志级别,Thibault Urien's answer 将完成这项工作。
上面的行为可以通过下面的例子来说明。
LoggerLevelNotSet 没有设置记录器级别的类
package com.logback.logger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LoggerLevelNotSet {
private static final Logger logger = LoggerFactory.getLogger(LoggerLevelNotSet.class);
public static void log() {
logger.trace("TRACE");
logger.debug("DEBUG");
logger.info("TRACE");
logger.warn("WARN");
logger.error("ERROR");
}
}
LoggerLevelNotSet 设置了记录器级别的类
package com.logback.logger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LoggerLevelSet {
private static final Logger logger = LoggerFactory.getLogger(LoggerLevelSet.class);
public static void log() {
logger.trace("TRACE");
logger.debug("DEBUG");
logger.info("TRACE");
logger.warn("WARN");
logger.error("ERROR");
}
}
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
<appender name="stdout"
class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%-5level %logger{36} - %msg%n</Pattern>
</layout>
</appender>
<logger name="com.logback.logger"
additivity="false" level="TRACE">
<appender-ref ref="stdout"/>
</logger>
<logger name="com.logback.logger.LoggerLevelSet"
additivity="false" level="WARN">
<appender-ref ref="stdout"/>
</logger>
<root>
<appender-ref ref="stdout"/>
</root>
</configuration>
TestSetLoggerLevel主类
package com.logback.logger;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.LoggerContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TestSetLoggerLevel {
private static final Logger logger = LoggerFactory.getLogger(TestSetLoggerLevel.class);
public static void main(String[] args) {
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
logger.error("Before set level");
logLevel(loggerContext.getLogger("com.logback.logger.LoggerLevelNotSet"));
logLevel(loggerContext.getLogger("com.logback.logger.LoggerLevelSet"));
LoggerLevelNotSet.log();
LoggerLevelSet.log();
loggerContext.getLogger("com.logback.logger").setLevel(Level.ERROR);
logger.error("After set level");
logLevel(loggerContext.getLogger("com.logback.logger.LoggerLevelNotSet"));
logLevel(loggerContext.getLogger("com.logback.logger.LoggerLevelSet"));
LoggerLevelNotSet.log();
LoggerLevelSet.log();
}
private static void logLevel(ch.qos.logback.classic.Logger log) {
logger.error("{} level: {} effective level:{}", log.getName(), log.getLevel(), log.getEffectiveLevel());
}
}
结果
ERROR c.logback.logger.TestSetLoggerLevel - Before set level
ERROR c.logback.logger.TestSetLoggerLevel - com.logback.logger.LoggerLevelNotSet level: null effective level:TRACE
ERROR c.logback.logger.TestSetLoggerLevel - com.logback.logger.LoggerLevelSet level: WARN effective level:WARN
TRACE com.logback.logger.LoggerLevelNotSet - TRACE
DEBUG com.logback.logger.LoggerLevelNotSet - DEBUG
INFO com.logback.logger.LoggerLevelNotSet - TRACE
WARN com.logback.logger.LoggerLevelNotSet - WARN
ERROR com.logback.logger.LoggerLevelNotSet - ERROR
WARN com.logback.logger.LoggerLevelSet - WARN
ERROR com.logback.logger.LoggerLevelSet - ERROR
ERROR c.logback.logger.TestSetLoggerLevel - After set level
ERROR c.logback.logger.TestSetLoggerLevel - com.logback.logger.LoggerLevelNotSet level: null effective level:ERROR
ERROR c.logback.logger.TestSetLoggerLevel - com.logback.logger.LoggerLevelSet level: WARN effective level:WARN
ERROR com.logback.logger.LoggerLevelNotSet - ERROR
WARN com.logback.logger.LoggerLevelSet - WARN
ERROR com.logback.logger.LoggerLevelSet - ERROR