如何在logback.xml中单独控制文件appender开关不影响控制台输出
问题原因
你的配置存在两个核心问题导致无法单独控制文件输出:
root节点同时绑定了STDOUT和file两个appender,修改root日志级别会同时作用于两个appender,自然会导致控制台同步停输。- 你额外给
com.demo绑定了fileappender,但未移除root下的file引用,即便子logger级别设为OFF,root下的file appender依然会按照root的info级别输出日志。
解决方案
方案1:通过logger级别单独控制文件输出(无需额外依赖)
调整配置,root仅保留控制台appender,文件appender完全由子logger控制:
<configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n </pattern> </encoder> </appender> <appender name="file" class="ch.qos.logback.core.FileAppender"> <file>/tmp/logback.log</file> <append>true</append> <immediateFlush>true</immediateFlush> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n </pattern> </encoder> </appender> <!-- 要开启文件输出时将level改为info,关闭时设为OFF即可,不影响控制台 --> <logger name="com.demo" level="OFF" additivity="true"> <appender-ref ref="file" /> </logger> <!-- root仅绑定控制台appender,固定info级别保证控制台始终正常输出 --> <root level="info"> <appender-ref ref="STDOUT" /> </root> </configuration>
如果需要全量日志输出到文件,只需要将上述logger的name属性改为空字符串即可。
方案2:通过阈值过滤器单独控制文件输出
给file appender添加独立的阈值过滤器,日志级别仅作用于文件输出,和控制台完全隔离:
<configuration> <!-- 文件输出阈值,默认OFF关闭,需要开启时改为info --> <property name="fileLogLevel" value="OFF" /> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n </pattern> </encoder> </appender> <appender name="file" class="ch.qos.logback.core.FileAppender"> <!-- 仅作用于file appender的阈值过滤器 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>${fileLogLevel}</level> </filter> <file>/tmp/logback.log</file> <append>true</append> <immediateFlush>true</immediateFlush> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n </pattern> </encoder> </appender> <root level="info"> <appender-ref ref="file" /> <appender-ref ref="STDOUT" /> </root> </configuration>
方案3:通过环境变量动态开关文件输出
结合你的测试代码中读取的LOGFILE环境变量,可以实现启动时自动判断是否开启文件输出,无需修改配置文件:
<configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n </pattern> </encoder> </appender> <!-- 仅当设置LOGFILE环境变量时才加载文件appender --> <if condition='isDefined("LOGFILE")'> <then> <appender name="file" class="ch.qos.logback.core.FileAppender"> <file>${LOGFILE}</file> <append>true</append> <immediateFlush>true</immediateFlush> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n </pattern> </encoder> </appender> <logger name="com.demo" level="info" additivity="true"> <appender-ref ref="file" /> </logger> </then> </if> <root level="info"> <appender-ref ref="STDOUT" /> </root> </configuration>
注:使用条件判断需要引入janino依赖,Maven配置如下:
<dependency> <groupId>org.codehaus.janino</groupId> <artifactId>janino</artifactId> <version>3.1.9</version> </dependency>
内容的提问来源于stack exchange,提问作者keepmoving
相关产品推荐
相关产品推荐

