JDK 8
spring boot 2.4.5
---
S.B. 使用 Apache Commons Logging 记录日志,但开放了 底层具体日志记录实现,默认的实现提供了 Java Util Logging、Log4j2、Logback。
日志记录 预先配置为 1)输出到控制台(Console),但可以选择2)输出到文件。
使用各种 starters 包时,默认使用 Logback记录日志;有些独立的包不使用Logback时,可以通过 Logback路由(Routing) 使之正确输出日志。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SZ2ETNjZDOyYDM1ITYwQDZ5UmMiJjN0YWMlZWN1MDNm9CX0EzLchDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL3M3Lc9CX6MHc0RHaiojIsJye.png)
默认日志格式
输出的日志(下面是 一行):
分别是:时间、线程名、级别、完整类名、记录的信息,,各段使用 空格 分隔开。
日志级别:ERROR, WARN, INFO, DEBUG, TRACE,,严重性 从高到低(↓)。
改变默认格式:logging.pattern.*
试验配置
效果:
调试用
默认只输出 INFO及以上级别 的日志,
命令行添加 --debug 可以输出 DEBUG及以上日志,更详细,如名所言,调试时可以使用,
还可以使用 --trace 输出 TRACE及以上 日志,包含内容非常多,,一定是非常特殊的时候才使用(看更具体细节时)。
以上 两个命令行配置 可以分别使用配置 debug=true、trace=true 替代。
注:实测发现 输出TRACE级别+ 日志时,配置在 命令行 和 配置文件中的效果不一致——输入内容或有差别(不再详细区分了)。
输出到文件(简单配置版本)
添加配置 logging.file.name 或 logging.file.path。
测试:Windows 10,,新建立 D:\logging 文件夹,配置 logging.file.path=d:\\logging。
结果:没有看到日志文件生产。
原因:盘符下顶级目录不可以处理(疑问,TODO)?
进一步:在 d:\\logging 下建立 prj1 文件夹,再配置 logging.file.path=d:\\logging\\prj1。
此时启动prj1项目,启动后,可以看到 新配置的目录下的配置文件了——spring.log:
成功。
进一步:再配置 logging.file.name,启动项目。
结果:d:\\logging\\prj1 中 附加(append)了新的项目日志,,而my.log没有出现在这里!
那么,在哪里呢?项目根目录下(启动项目 的当前目录,Eclipse启动,则是在 项目根目录中)。
按照 官文 的说明,这两个文件 配置一个即可。
再进一步:
不想my.log出现在 项目根目录下的话,如下配置即可实现:
上面两个肯定不够 生产使用 啊!生产还需要 更定制化的日志,比如,日志文件名动态变化、每天一个日志文件、不同级别日志输出到不同文件等。
日志归档
日志超过一定大小后,就压缩保存,压缩文件名称可以配置。
不同的日志实现组件 会有不同的、灵活的配置,比如,使用Logback的话(默认使用它),可以在 日志文件中使用下面的配置来实现 更复杂的 日志输出需求。
试验配置 logging.logback.rollingpolicy.file-name-pattern=${spring.application.name}.%d{yyyy-MM-dd}.%i.gz,但没有看到 任何 gz文件。
原来,上面的配置是用来归档使用的,日志超过某个限制了,就建立 gz 文件,而不是 log文本文件。
再添加下面的配置 logging.logback.rollingpolicy.max-file-size=100KB 就可以看到 各个gz文件了(开启输出 trace日志),这个配置默认 10MB。
gz文件出现在 项目根目录下:
注意,这个大小是 压缩后的,配置的max-file-size 是指 压缩前的log文件大小。
配置中修改日志记录器的日志级别
单个修改:
logging.level.<logger-name>=<level>
<logger-name> 可以简单理解为 包名,配置后,改包下,低于这个<level>的日志不再输出。
项目启动后,可以通过 Spring Environment对象 查询。
可以调高,可以降低。
日志分组:logging.group
上面是一个一个地修改,使用 日志分组功能,可以一组一组地修改。
先配置 分组,再统一设置 分组中 日志记录器 的级别。
S.B. 默认有 web、sql 两个日志分组。
配置 logging.level.web=warn 后,启动时看到更少日志了。
疑问:既然配置可以修改,是否可以动态修改呢?使用actuator。
日志关机钩子
logging.register-shutdown-hook=true
配置后,关闭项目时,只有一条日志输出,默认情况下,会有两条日志输出。
更多区别 说不上来了。
还有什么用呢?
定制文件配置(Logback)
使用 org.springframework.boot.logging.LoggingSystem 来选择不同的 日志实现系统,或者 关闭(none,输出了好多日志)。
这里介绍默认的 Logback 的定制文件配置。可用文件名:
建好文件,放到 classpath下即可——/src/main/resources。
日志配置文件中 可以使用一些 系统属性(System Properties),以下是从 Spring Environment对象 中传来的值(官文 截图):
如果是 Logback,还有下面的:
logback-spring.xml 配置技巧:
1、输出进出ID
${PID}
2、输出行号
%L
注:检查了一些 系统包的行号,不准确;自己的包下 还是能很好地定位的。
3、使用配置中的属性
配置文件配置 logging.file.name=${spring.application.name},会被转换为 LOG_FILE,
logback-spring.xml 中使用 ${LOG_FILE}。
搞定。记得之前看过另外的方法的。
4、%号后的 +、- 、数字 用于对齐
+ 右对齐,
- 左对齐。
下面是我自己的一份配置:
logback-spring.xml
更多 Logback 的日志配置,请参考其它文档,会更专业。
S.B.的Logback扩展项
特定Profile配置: <springProfile>标签
官文示例如下
环境变量的使用: <springProperty>标签
前面提到 logback-spring.xml 中使用 spring.application.name,用了特别的方式来处理。
而这里使用 <springProperty>标签 即可搞定。
疑问:
1)S.B. 默认使用Logback,对于其它 使用 非Logback 的 包,其日志输出 有什么问题?
2)日志配置生效时机:ApplicationContext 准备好之后吗?那么,之前的日志输出怎么弄的?
3)slf4j是什么?使用 lombok 时,会用到它的一个 lombok.extern.slf4j.Slf4j,直接就可以使用 log对象 记录日志了。
---全文完---
其实自己对 日志系统 其实是一知半解的,就知道这么用了能输出日志,输出到文件,知道配置格式。
所以,本文主要参考官文编写,过程中自己又做一些试验,尽量保证准确性。
继续前进方向:
1)Logback配置、2)日志怎么搞到ELK、3)日志怎么搞到Kafka做分析 等。
参考文档
0、Spring Boot官方手册
S.B.版本 2.4.5 的 4.4. Logging。
1、SpringBoot默认日志logback配置解析
2、Spring Boot 日志各种使用姿势,是时候捋清楚了!
3、logback日志详细解析
4、Logback 为日志配置颜色搭配
5、