
本文介绍如何通过 logback 的过滤器(thresholdfilter 和 levelfilter)精准分离 info 和 error 日志,使其各自写入 app.log 和 error.log,避免重复记录或级别错乱。
本文介绍如何通过 logback 的过滤器(thresholdfilter 和 levelfilter)精准分离 info 和 error 日志,使其各自写入 app.log 和 error.log,避免重复记录或级别错乱。
在 Logback 中,仅靠 <logger> 标签的 level 属性无法实现“同一 logger 向多个 appender 发送不同级别日志”的效果——因为 logger 的 level 是准入门槛(低于该级别的日志直接被丢弃),而非路由规则。若为同一包名(如 com)配置两个同名 logger(如分别设为 error 和 info),Logback 实际只会采用最后定义的那个,导致行为不可控,这也是原配置中“所有级别日志都写入两个文件”的根本原因。
正确的做法是:统一由 root logger 接收所有日志,再通过 appender 级别的过滤器决定是否接受当前日志事件。以下是推荐的、简洁可靠的配置方案:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- ERROR 日志专用 Appender:仅接收 ERROR 及更高级别(如 FATAL) -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.FileAppender">
<file>logs/Error.log</file>
<append>true</append>
<encoder>
<pattern>%d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<!-- INFO 日志专用 Appender:严格只接受 INFO 级别(不包含 WARN/ERROR) -->
<appender name="INFO_FILE" class="ch.qos.logback.core.FileAppender">
<file>logs/App.log</file>
<append>true</append>
<encoder>
<pattern>%d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 根 logger 设置为 INFO,确保 INFO 及以上(WARN、ERROR)均进入处理流程 -->
<root level="INFO">
<appender-ref ref="ERROR_FILE" />
<appender-ref ref="INFO_FILE" />
</root>
</configuration>✅ 关键说明:
- ThresholdFilter 是“门槛式”过滤:只要日志级别 ≥ 配置值(如 ERROR),即放行;因此 ERROR_FILE 会记录 ERROR 和 FATAL。若需仅限 ERROR(排除 FATAL),应改用 LevelFilter 并显式配置 onMismatch=DENY。
- LevelFilter 是“精确匹配式”过滤:必须完全等于指定级别才 ACCEPT,否则 DENY,适合严格隔离 INFO。
- additivity="false" 在此无需设置,因所有日志均由 root 统一调度,无父子 logger 冲突问题。
- 建议补充 <appender name="CONSOLE"> 并在 <root> 中引用,便于开发期实时查看;生产环境可按需移除。
? 注意事项:
- 确保 logs/ 目录存在且应用有写入权限,否则日志将静默失败;可在启动时添加 statusListener 调试:
<statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
- 若需同时记录 WARN 到另一文件(如 Warn.log),只需新增一个 LevelFilter 配置为 WARN 的 appender 即可,逻辑完全正交。
- 不要混用 ThresholdFilter 和 LevelFilter 在同一 appender 内——它们作用机制不同,叠加可能引发意料外行为。
通过这种基于 appender 过滤器的声明式路由,日志分发逻辑清晰、可维护性强,是 Logback 官方推荐的最佳实践。

















