Logback配置异常:无法按级别将日志分离到指定文件
Logback配置异常:无法按级别将日志分离到指定文件
嗨,我看到你遇到了Logback日志分离的问题——本来想把INFO级日志写到App.log,ERROR级写到Error.log,结果所有日志都跑到两个文件里去了,咱们来一步步解决它~
先提个小细节:你开头说用的是log4j,但给出的配置是Logback的,不过没关系,咱们就针对这个Logback配置来调整。
原配置的问题所在
你定义了两个同名的<logger name="com">节点,后一个会直接覆盖前一个的配置;更关键的是你的appender没有设置级别过滤规则,不管日志级别是啥,都会被appender接收,这就导致所有日志都被写入两个文件了。
正确的配置方案
我们需要给每个appender添加级别过滤规则,让它们只接收对应级别的日志,然后统一配置logger节点即可。下面是调整后的完整配置:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 控制台输出Appender --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <Pattern> %d{HH:mm:ss.SSS} [%t] %-15level %logger{36} - %msg%n </Pattern> </layout> </appender> <!-- Error.log Appender:只接收ERROR级别日志 --> <appender name="FILE1" class="ch.qos.logback.core.FileAppender"> <file>logs/Error.log</file> <append>true</append> <immediateFlush>true</immediateFlush> <encoder> <Pattern> %d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n </Pattern> </encoder> <!-- 添加级别过滤:只允许ERROR级别通过 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- App.log Appender:只接收INFO级别日志,排除ERROR --> <appender name="FILE2" class="ch.qos.logback.core.FileAppender"> <file>logs/App.log</file> <append>true</append> <immediateFlush>true</immediateFlush> <encoder> <Pattern> %d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n </Pattern> </encoder> <!-- 先过滤掉ERROR级别 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>DENY</onMatch> <onMismatch>NEUTRAL</onMismatch> </filter> <!-- 只接受INFO级别 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 配置com包下的日志级别,关联所有appender --> <logger name="com" level="info" additivity="false"> <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE1"/> <appender-ref ref="FILE2"/> </logger> </configuration>
配置说明
- FILE1(Error.log)的过滤规则:用
LevelFilter指定只接受ERROR级别日志,其他级别直接拒绝,这样只有ERROR日志会写入Error.log。 - FILE2(App.log)的过滤规则:先添加一个过滤器拒绝
ERROR级别,再添加一个过滤器只接受INFO级别,这样只有INFO日志会写入App.log。 - Logger节点:只保留一个
com包的logger,级别设为info(确保INFO及以上级别日志能被处理),additivity="false"避免日志向上传递到root logger重复输出。
这样调整后,就能实现你想要的:INFO级日志到App.log,ERROR级日志到Error.log啦~
备注:内容来源于stack exchange,提问作者Sayantan Maji
相关产品推荐
相关产品推荐

