Logback多级别日志多追加器配置问题:新增LogB不影响LogA
解决Logback新增DEBUG日志文件不干扰原有日志的问题
你遇到的问题核心是Logback的**日志传递性(additivity)**在搞鬼!默认情况下,子Logger的日志事件会向上传递给父Logger(包括root),而你的root已经绑定了logA,所以新增的DEBUG日志会顺着传递链再被logA写一遍。
解决方案:关闭新增Logger的日志传递性
只需要给你新增的<logger>标签加上additivity="false"属性,就能阻止它的日志向上传递,这样logB只会接收这些DEBUG日志,而logA完全不受影响。
完整配置示例
首先是logB的Appender配置(这里用最常用的滚动文件输出为例,你可以根据自己的需求调整):
<appender name="logB" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 日志文件路径 --> <file>logs/logB.log</file> <!-- 滚动策略:按时间+大小分割 --> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>logs/logB.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <maxFileSize>100MB</maxFileSize> <maxHistory>30</maxHistory> <totalSizeCap>1GB</totalSizeCap> </rollingPolicy> <!-- 日志格式 --> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> <!-- 可选:严格过滤只保留DEBUG级别日志(如果需要精准只存DEBUG) --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>DEBUG</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender>
然后是关键的Logger配置,加上additivity="false":
<logger name="A" level="DEBUG" additivity="false"> <appender-ref ref="logB" /> </logger>
为什么这样有效?
additivity="false":这个属性会关闭当前Logger的日志传递功能,它处理完的日志(输出到logB)不会再传递给父级Logger(包括root),自然就不会被logA重复写入了。- 原有logA的所有配置完全不需要修改:root Logger依然按照原来的规则收集日志,各个子Logger(A.B、A.C等)的级别设置也保持不变,不会受到logB的影响。
额外说明
如果你的需求是收集整个应用所有包的DEBUG日志,而不只是A包下的,只需要把Logger的name改为空字符串:
<logger name="" level="DEBUG" additivity="false"> <appender-ref ref="logB" /> </logger>
内容的提问来源于stack exchange,提问作者Avatar
相关产品推荐
相关产品推荐

