背景
上一篇文章 Spring Boot 实战 —— 日志框架 Log4j2 SLF4J 的学习 中已经介绍了常用的日志框架的比较,本文介绍另外一个主流的日志框架 logback
展示
看懂日志
- 时间戳,精确到毫秒
- logback 日志级别:日志级别分为:TRACE、DEBUG、INFO、WARN、ERROR、FATAL
- 进程 ID:进程 ID 指的是当前应用对应的 PID
- 分隔符:用于区分实际日志消息的开始
- 线程名称:括在方括号中
- 记录器名称:一般使用类名
- 日志内容:日志输出的打印内容
日志依赖
1 | <dependency> |
实际开发中我们不需要直接添加该依赖 spring-boot-starter-logging
,因为 spring-boot-starter
其中包含了 spring-boot-starter-logging
,该依赖内容就是 Spring Boot 默认的日志框架 logback。
PS:上一篇文章 中说明了,如果要采用 log4j2,那么需要排除 Spring Boot 自带的日志:
1 | <dependencies> |
控制台输出
默认情况下, Spring Boot 只会记录 INFO、WARN、ERROR 级别的日志打印在控制台。Spring Boot 可以使用「调试模式」,会打印一些比较详细的额外信息,可以选用如下两种方式:
- 启动 JAR 模式时,加上
--debug
,例如:java -jar <app.jar> --debug
; - 在配置文件中配置属性
debug=true
;
日志级别设置
下面两种格式常用:
logging.level.root=WARN
root 日志以 WARN 级别输出信息;logging.level.com.michael.springbootlogback.congtroller=DEBUG
指定包下的类以 DEBUG 级别输出;
root
表示 root 节点,它是必选节点,用来指定最基础的日志输出级别,默认是 INFO 级别,所以,此时若是不修改默认值,你直接指定其他包下的日志界别为 DEBUG 级别,其实也不会生效的。
另外,也可以设置日志组来批量设置日志级别,比如设定 com.michael.controller
和 com.michael.service
为同一组(包和包之间用英文逗号分隔):
1 | logging.group.michael=com.michael.controller,com.michael.service |
设置完日志组之后,给 michael 组设定日志级别:
1 | logging.level.michael=INFO |
Spring Boot 默认提供两个日志组:
logging.group.web=org.springframework.core.codec,org.springframework.http,org.springframework.web
logging.group.sql=org.springframework.jdbc.core
日志文件输出
只需要在 Profile 配置文件,例如 application.properties
中设置 logging.file
或者 logging.path
属性即可:
logging.file
设置日志文件,可以设置文件的绝对路径也可以设置相对路径,相对路径的话是相对应用的根目录,比如logging.file=logs/demo.log
;logging.path
设置日志的路径,也是既支持绝对路径也支持相对路径,比如logging.path=logs
,日志文件默认会存为spring.log
;
如果上面两个属性同时配置了,只有 logging.file
会生效;在日志文件达到 10MB 时,Spring Boot 会自动分割日志,当然,这个大小是可以通过 logging.file.max-size
属性更改的,下面谈谈有哪些配置属性。
日志配置
除了上面介绍的配置属性外,还有其他一些属性,例如:
logging.config
日志配置;logging.file.max-size
最大日志文件大小;logging.file.max-history
最大归档文件数量;logging.pattern.console
控制台输出的日志模式;logging.pattern.dateformat
日志的日期格式;logging.pattern.file
默认使用日志模式logging.pattern.level
日志级别
XML 配置日志
Spring Boot 中的 logback 默认使用 src/main/resources
文件夹下的 logback.xml
或 logback-spring.xml
作为日志配置。Spring Boot 官方推荐优先使用带有 -spring
的文件名作为日志配置文件。因为如果命名为 logback-spring.xml
日志配置,就可以在日志输出的时候引入一些 Spring Boot 特有的配置项。也可以通过自定义的方式指定配置文件: logging.config=classpath:logback-confg.xml
application.properities
配置:
1 | # 日志配置信息 |
一个简单的控制台输出配置:
1 |
|
说明:
appender
的name
其实只是取的名字,你也可以叫它STDOUT
%d
表示时间,用%d{yyyy-MM-dd HH:mm:ss.SSS}
定义了格式化时间,也可以使用%date
%-5level
表示显示日志级别,并且用 5 个字符靠左对齐,也可以用%p
表示日志级别%thread
表示显示日志进程名字%logger{80}
表示日志输出者的名字,常常是类名%msg
日志消息%n
平台的换行符%c
用来在日志上输出类的全名%L
表示行号charset
设置日志编码格式为 UTF-8,避免中文乱码root
标签内设置日志级别level
,等同于在配置文件中设置logging.pattern.level
Logback 配置文件可以使用 property 标签自定义属性,然后在配置文件中使用。下面附上一个较复杂的配置:
1 |
|
输出到 console:
ConsoleAppender
需要设置这样的一个 apppender,否则日志不会打印到控制台;
输出到文件:
RollingFileAppender
可以实现日志的切分rollingPolicy
设置滚动切分的规则totalSizeCap
用来指定日志文件的上限大小,这个设置在maxFileSize
之后起效,也就是说,如果你文件上限设置的是 1MB,但是maxFileSize
设置的是 10MB,那么,这个日志文件也会保存为 10MB。假设你maxFileSize
设置的是 1MB,totalSizeCap
设置的是 2MB,那么你日志文件的个数最多也就 2 个;MaxHistory
可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每天滚动,且maxHistory是365,则只保存最近365天的文件。我还是喜欢这个设置,比totalSizeCap
意义更清晰;
<root>
可以包含零个或多个 <appender-ref>
元素,标识这个 appender 将会添加到这个 loger,logger 的属性:
- name: 用来指定受此 loger 约束的某一个包或者具体的某一个类,没写的时候会报错
- level:日志打印级别,如果未设置此属性,那么当前 logger 会继承上级的级别,也就是 root 的级别;
- addtivity:是否向上级 loger 传递打印信息。默认是 true。设置为 false 表示该日志打印设置(控制台打印还是文件打印等具体设置)不会向根 root 标签传递,也就是说该 logger 里怎么设置的那就会怎么打印,跟 root 无关
root 是根 logger,所以他两是一回事;只不过 root 中不能有 name 和 additivity 属性,是有一个 level。
appender 是一个日志打印的组件,这里组件里面定义了打印过滤的条件、打印输出方式、滚动策略、编码方式、打印格式等等。但是它仅仅是一个打印组件,如果我们不使用一个 logger 或者 root 的 appender-ref 指定某个具体的 appender 时,它就没有什么意义
打印日志的正确姿势
我通过 controller 中定义了一个接口,可以打印出各级别的错误:
1 | "/all") ( |
比较两种打印日志的方式,显示效果有何区别:
可以发现,通过 logger.error("xxx错误",e)
的方式打印的日志会有错误堆栈信息!这明显对应定位问题有更大的帮助!也可以使用 {}
占位符来拼接字符串,而不需要使用 +
来连接字符串。注意,我们这里也是采用的 slf4j 日志门面的接口方法。
如果采用一个参数,这里的 e 会被转为 String 类型(自动调用 toString
方法)
如果不怕麻烦,就这么写:
1 | private final Logger log = LoggerFactory.getLogger(this.getClass()); |
如果想省事,可以结合 lombok 插键,在类上使用 @SLF4J
注解,然后代码中直接使用 log.xxx
打印日志即可;
示例代码
- awesome-spring-boot-examples
参考
- 掘金-glmapper-看完这个不会配置 logback ,请你吃瓜! 这篇文章算是相当全了
- 嘟嘟独立博客-Spring Boot干货系列:(七)默认日志logback配置解析
- 博客园-springboot的logback.xml配置和日志记录