总览
配置加载优先级
Spring Boot 按以下顺序加载配置(后加载的覆盖前者):
logback-spring.xml
logback.xml
application.properties
中的日志配置@Configuration
类中的编程配置(需确保无冲突)
格式
默认日志格式
%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX} %highlight(%5level) %magenta(${PID}) --- [%15.15thread] %cyan(%-40.40logger{38}) : %msg%n
控制台输出如下
2024-08-10T21:08:52.362+08:00 INFO 18440 --- [ restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory
2024-08-10T20:59:55.664+08:00 INFO 18440 --- [ restartedMain] com.ainow.app.demo.DemoCommon : this is info log
2024-08-10T20:59:55.664+08:00 WARN 18440 --- [ restartedMain] com.ainow.app.demo.DemoCommon : this is warn log
2024-08-10T20:59:55.664+08:00 ERROR 18440 --- [ restartedMain] com.ainow.app.demo.DemoCommon : this is error log
2024-08-10T20:59:56.368+08:00 INFO 18440 --- [2)-172.20.208.1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet
推荐开发环境控制台日志格式
%d{mm:ss.SSS} %highlight(%5level) [%15.15thread] %cyan(%-40.40logger{38}) : %msg%n
转义符解释
%5 字符串长度,不足则用空格填充,居右
%-5 居左
%.15 若字符长度超过15,截去多余字符,
%15.15
%date{} %d{}:显示日期
%level %p 显示日志级别ERROR,WARN,INFO,DEBUG,TRACE;
%thread %t 显示产生该日志的线程名,这在Web应用以及异步任务处理中很有用
%msg %m 日志消息
%n 平台换行符
%method 方法名
%logger{n} 输出包名,n为保留的包名段数
%clr(表达式){颜色} %颜色(表达式):设置输出内容的颜色
blue 蓝色
cyan 青色
faint 淡灰色
green 绿色
magenta 品红色
red 红色
yellow 黄色
highlight 高亮色,会根据日志等级变化,但好像和默认的高亮不一样,
appender
filter
ThresholdFilter 阈值过滤器
- 功能:基于日志级别的阈值进行过滤,允许等于或高于指定级别的日志事件通过,拒绝更低的级别。
- 配置方式:仅需设置 参数,无需定义匹配后的动作(如 ACCEPT/DENY )。
- 示例:
<configuration ...其他配置>
...其他配置
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
...其他配置
</appender>
...其他配置
</configuration>
LevelFilter 精确级别过滤器
- 功能:精确匹配日志级别,可仅允许指定级别的日志事件通过,其他级别一律拒绝。需显式定义行为。
- 配置方式:除指定 level 外,还可通过 onMatch 和 onMismatch 明确匹配/不匹配时的动作。
- onMatch 和 onMismatch 都有三个属性值,分别为 Accept, DENY, NEUTRAL
- onMatch="ACCEPT" 表示匹配该级别及以上
- onMatch="DENY" 表示不匹配该级别及以上
- onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上
- onMismatch="ACCEPT" 表示匹配该级别以下
- onMismatch="DENY" 表示不匹配该级别以下的
- onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的
- 适用场景:
- 需要精确记录单一级别日志(如将 WARN 单独输出到文件)。
- 需要排除特定级别(如忽略 DEBUG 但保留其他级别)。
- 示例:
<configuration ...其他配置>
...其他配置
<appender name="FILE_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
...其他配置
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
...其他配置
</configuration>
root配置
- root 节点是对所有 appender 的管理,添加哪个 appender 就会打印哪个appender 的日志
- root 节点的 level 是总的日志级别控制,如果 appender 的日志级别设定比root的高,会按照 appender 的日志级别打印日志
- 如果 appender 的日志级别比 root 的低,会按照 root 设定的日志级别进行打印日志
- 也就是说 root 设定的日志级别是最低限制,如果 root 设定级别为最高 ERROR,那么所有 appender 只能打印最高级别的日志
logger
- 按需为特定包或类配置不同的日志级别
- name: 用来指定受此 logger 约束的某一个包或者具体的某一个类
- addtivity: 是否向上级 logger 传递打印信息。默认是true。
springProfile 多环境配置
- 可以在 application.properties 中配置选择哪个 profiles, 如 spring.profiles.active=dev 对应 name="dev"
- 配置了springProfile,最好就不要再配置根级别的 root, logger,否则会重复输出日志
- 示例
spring.profiles.active=dev 会激活 <springProfile name="dev">
spring.profiles.active=dev,prod 会激活 <springProfile name="dev">, <springProfile name="prod">
激活多个 springProfile 可能导致创建多个功能相等或相似的 appender ,从而导致日志重复输出
<configuration ...其他配置>
...其他配置
<springProfile name="dev">
<!-- debug 信息太多,非必要时别使用 -->
<root level="info">
<appender-ref ref="CONSOLE2"/>
</root>
<logger name="com.ainow.app111" level="error" additivity="false"/>
</springProfile>
<springProfile name="prod">
<root level="info">
<appender-ref ref="DEBUG_FILE"/>
<appender-ref ref="INFO_FILE"/>
<appender-ref ref="FILE_ERROR"/>
<appender-ref ref="FILE_WARN"/>
</root>
</springProfile>
...其他配置
</configuration>
注意
- root,logger,springProfile 配置必须在 appender 下边