
本文介绍如何通过 logback 的过滤器(thresholdfilter 和 levelfilter)精准分离 info 和 error 日志,使其各自写入 app.log 和 error.log,避免重复记录或级别错乱。
本文介绍如何通过 logback 的过滤器(thresholdfilter 和 levelfilter)精准分离 info 和 error 日志,使其各自写入 app.log 和 error.log,避免重复记录或级别错乱。
在 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><appender-ref ref="INFO_FILE"></appender-ref></root></configuration>
✅ 关键说明:
- ThresholdFilter 是“门槛式”过滤:只要日志级别 ≥ 配置值(如 ERROR),即放行;因此 ERROR_FILE 会记录 ERROR 和 FATAL。若需仅限 ERROR(排除 FATAL),应改用 LevelFilter 并显式配置 onMismatch=DENY。
- LevelFilter 是“精确匹配式”过滤:必须完全等于指定级别才 ACCEPT,否则 DENY,适合严格隔离 INFO。
- additivity="false" 在此无需设置,因所有日志均由 root 统一调度,无父子 logger 冲突问题。
- 建议补充
并在 中引用,便于开发期实时查看;生产环境可按需移除。
? 注意事项:
- 确保 logs/ 目录存在且应用有写入权限,否则日志将静默失败;可在启动时添加 statusListener 调试:
<statuslistener class="ch.qos.logback.core.status.OnConsoleStatusListener"></statuslistener>
- 若需同时记录 WARN 到另一文件(如 Warn.log),只需新增一个 LevelFilter 配置为 WARN 的 appender 即可,逻辑完全正交。
- 不要混用 ThresholdFilter 和 LevelFilter 在同一 appender 内——它们作用机制不同,叠加可能引发意料外行为。
通过这种基于 appender 过滤器的声明式路由,日志分发逻辑清晰、可维护性强,是 Logback 官方推荐的最佳实践。











