Logback中level属性写在<logger>或<root>标签上,大小写敏感,遵循继承与最低门槛原则;Appender内可用ThresholdFilter二次过滤,additivity="false"可避免日志重复输出;Spring Boot需用logback-spring.xml配合<springProfile>实现环境差异化配置。

Logback 中 level 属性写在哪、怎么生效
Logback 的日志级别控制不是全局开关,而是分层生效:Logger 有 level,Appender 也有 filter 或自身限制。最常见错误是只改了 root 的 level,但某个 <logger name="com.example.service" level="DEBUG"></logger> 被遗漏或覆盖,导致 DEBUG 日志不出现。
关键点:level 写在 <logger> 或 <root> 标签上,值为 TRACE/DEBUG/INFO/WARN/ERROR(大小写敏感),且遵循「继承+最低门槛」原则——Logger 自身 level 不设则继承父级,最终由 root 定义底线;但只要任一匹配的 Logger 设了 level,就以它为准。
-
<root level="INFO">是兜底,影响所有未显式声明的 Logger -
<logger name="com.example.dao" level="DEBUG" additivity="false">表示该包下只走这个 Logger,不向 root 传递 - 若同时存在
<logger name="com.example">和<logger name="com.example.service">,后者优先级更高
用 ThresholdFilter 在 Appender 里二次过滤日志级别
仅靠 Logger 的 level 有时不够——比如你希望 INFO 及以上进文件,但 DEBUG 也单独输出到控制台。这时不能只靠两个 Logger,得用 ThresholdFilter 在 Appender 内部做筛选。
它比 Logger 级别更“硬”:即使 Logger 发出了 DEBUG 日志,只要 Appender 的 ThresholdFilter 设为 INFO,这条日志就不会进入该 Appender。
立即学习“Java免费学习笔记(深入)”;
- 必须嵌套在
<appender>内,且顺序无关,但需放在<encoder>之前 - 写法固定:
<filter class="ch.qos.logback.core.filter.ThresholdFilter"><level>WARN</level></filter> - 注意:多个 Filter 会按顺序执行,
ThresholdFilter后接LevelFilter可实现“只让 ERROR 进来”,但别滥用,容易误拦
<appender name="FILE_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.core.filter.ThresholdFilter">
<level>WARN</level>
</filter>
<file>warn.log</file>
<encoder><pattern>%d %p %c - %m%n</pattern></encoder>
</appender>
additivity="false" 不加就可能重复输出
这是生产环境最常踩的坑:同一个日志语句,在控制台和文件里各打一遍,甚至三遍。根本原因是 Logger 默认 additivity="true",意味着它除了执行自己绑定的 Appender,还会把日志向上传递给 parent(最终到 root),而 root 通常也绑了 ConsoleAppender。
解决方式不是删 root,而是对需要独立输出的 Logger 显式关闭继承:
- 在自定义
<logger>标签里加上additivity="false" - 尤其适用于按模块/包切分日志文件的场景,例如
<logger name="com.example.payment" level="INFO" additivity="false"> - 一旦设为
false,该 Logger 下的日志就只走它自己<appender-ref>指定的 Appender,不再冒泡
不同环境用 springProfile 切换日志级别配置
开发时想看 DEBUG,上线后只留 INFO/WARN,硬编码改 XML 不现实。Logback 原生不支持 profile,但 Spring Boot 通过 <springProfile> 标签做了扩展(需使用 logback-spring.xml 替代 logback.xml)。
它不是 Logback 内置语法,所以名字、位置、嵌套规则都受限——只能作为顶层标签,且不能嵌套在 <appender> 或 <logger> 内部。
- 配置文件名必须是
logback-spring.xml,否则<springProfile>会被忽略 - 写法:
<springProfile name="dev">...</springProfile>,name 值对应spring.profiles.active - 可分别定义 dev 下的 DEBUG Logger 和 prod 下的 INFO + ThresholdFilter,避免手动切换
复杂点在于:profile 块内不能定义新变量(<define>),也不能跨块引用 Appender,每个 profile 最好完整定义自己的 logger + appender 组合。


















