Logback 多个记录器不遵守级别
Logback multiple loggers not honouring level
我将 logback.xml 定义为:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<jmxConfigurator />
<appender name="ROOT_FILE_APPENDER"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<fieldNames>
<timestamp>timestamp</timestamp>
<version>[ignore]</version>
<levelValue>[ignore]</levelValue>
</fieldNames>
</encoder>
<file>root.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>root.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>0MB</maxFileSize>
<totalSizeCap>1GB</totalSizeCap>
<maxHistory>7</maxHistory>
</rollingPolicy>
</appender>
<appender name="basic-text" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%X{Logging-CorrelationId} %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
<file>text.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>text.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<totalSizeCap>1GB</totalSizeCap>
<maxHistory>7</maxHistory>
</rollingPolicy>
</appender>
<root level="ERROR">
<appender-ref ref="ROOT_FILE_APPENDER" />
</root>
<logger name="it.pkg.testpkg.service" additivity="true" level="INFO">
<appender-ref ref="basic-text"/>
</logger>
</configuration>
请注意,"root" 记录器级别已设置为 "ERROR",另一个记录器级别已设置为 "INFO",additivity=true。
我的 java class 的代码如下所示:
private static final Logger LOGGER = LoggerFactory.getLogger(it.pkg.testpkg.service.EchoService.class);
现在,问题是,当我将日志记录为:
LOGGER.info("Test Log");
日志条目进入两个日志文件,即使根记录器级别已设置为 "ERROR"。但是,此刻,我摆脱了 "it.pkg.testpkg.service" 记录器(通过注释掉或删除它),该条目停止进入根记录器。我不太确定这里发生了什么。
目前,我通过在 "ROOT_FILE_APPENDER" 中添加以下条目找到了一个临时解决方案:
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
但是,我不希望我的 appender 与特定的日志级别相关联。这是 Logback 的错误,还是我在这里做错了什么。
我正在使用以下 pom 依赖项:
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
如有任何帮助,我们将不胜感激。
谢谢。
通过 additivity
达到的祖先记录器的行为跳过日志级别检查。
如果你的记录器
<logger name="it.pkg.testpkg.service" additivity="true" level="INFO">
<appender-ref ref="basic-text"/>
</logger>
接受日志语句
LOGGER.info("Test Log");
那么无论那个记录器的日志级别如何,相应的输出都会被发送到它的祖先记录器。
您始终可以将 additivity
设置为 false
并将根文件附加程序添加到您的记录器
<logger name="it.pkg.testpkg.service" additivity="false" level="INFO">
<appender-ref ref="basic-text"/>
<appender-ref ref="ROOT_FILE_APPENDER" />
</logger>
我将 logback.xml 定义为:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<jmxConfigurator />
<appender name="ROOT_FILE_APPENDER"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<fieldNames>
<timestamp>timestamp</timestamp>
<version>[ignore]</version>
<levelValue>[ignore]</levelValue>
</fieldNames>
</encoder>
<file>root.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>root.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>0MB</maxFileSize>
<totalSizeCap>1GB</totalSizeCap>
<maxHistory>7</maxHistory>
</rollingPolicy>
</appender>
<appender name="basic-text" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%X{Logging-CorrelationId} %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
<file>text.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>text.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<totalSizeCap>1GB</totalSizeCap>
<maxHistory>7</maxHistory>
</rollingPolicy>
</appender>
<root level="ERROR">
<appender-ref ref="ROOT_FILE_APPENDER" />
</root>
<logger name="it.pkg.testpkg.service" additivity="true" level="INFO">
<appender-ref ref="basic-text"/>
</logger>
</configuration>
请注意,"root" 记录器级别已设置为 "ERROR",另一个记录器级别已设置为 "INFO",additivity=true。
我的 java class 的代码如下所示:
private static final Logger LOGGER = LoggerFactory.getLogger(it.pkg.testpkg.service.EchoService.class);
现在,问题是,当我将日志记录为:
LOGGER.info("Test Log");
日志条目进入两个日志文件,即使根记录器级别已设置为 "ERROR"。但是,此刻,我摆脱了 "it.pkg.testpkg.service" 记录器(通过注释掉或删除它),该条目停止进入根记录器。我不太确定这里发生了什么。
目前,我通过在 "ROOT_FILE_APPENDER" 中添加以下条目找到了一个临时解决方案:
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
但是,我不希望我的 appender 与特定的日志级别相关联。这是 Logback 的错误,还是我在这里做错了什么。
我正在使用以下 pom 依赖项:
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
如有任何帮助,我们将不胜感激。
谢谢。
通过 additivity
达到的祖先记录器的行为跳过日志级别检查。
如果你的记录器
<logger name="it.pkg.testpkg.service" additivity="true" level="INFO">
<appender-ref ref="basic-text"/>
</logger>
接受日志语句
LOGGER.info("Test Log");
那么无论那个记录器的日志级别如何,相应的输出都会被发送到它的祖先记录器。
您始终可以将 additivity
设置为 false
并将根文件附加程序添加到您的记录器
<logger name="it.pkg.testpkg.service" additivity="false" level="INFO">
<appender-ref ref="basic-text"/>
<appender-ref ref="ROOT_FILE_APPENDER" />
</logger>