天天看点

spring boot项目07:日志

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) 使之正确输出日志。

spring boot项目07:日志

默认日志格式

输出的日志(下面是 一行):

分别是:时间、线程名、级别、完整类名、记录的信息,,各段使用 空格 分隔开。

日志级别:ERROR, WARN, INFO, DEBUG, TRACE,,严重性 从高到低(↓)。

改变默认格式:logging.pattern.*

试验配置 

效果:

spring boot项目07:日志

调试用

默认只输出 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:

spring boot项目07:日志

成功。

进一步:再配置 logging.file.name,启动项目。

结果:d:\\logging\\prj1 中 附加(append)了新的项目日志,,而my.log没有出现在这里!

那么,在哪里呢?项目根目录下(启动项目 的当前目录,Eclipse启动,则是在 项目根目录中)。

spring boot项目07:日志

按照 官文 的说明,这两个文件 配置一个即可。

再进一步:

不想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文件出现在 项目根目录下:

spring boot项目07:日志

注意,这个大小是 压缩后的,配置的max-file-size 是指 压缩前的log文件大小。

配置中修改日志记录器的日志级别

单个修改:

logging.level.<logger-name>=<level>

<logger-name> 可以简单理解为 包名,配置后,改包下,低于这个<level>的日志不再输出。

项目启动后,可以通过 Spring Environment对象 查询。

可以调高,可以降低。

日志分组:logging.group

上面是一个一个地修改,使用 日志分组功能,可以一组一组地修改。

先配置 分组,再统一设置 分组中 日志记录器 的级别。

S.B. 默认有 web、sql 两个日志分组。

spring boot项目07:日志

配置 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对象 中传来的值(官文 截图):

spring boot项目07:日志
spring boot项目07:日志

如果是 Logback,还有下面的:

spring boot项目07:日志

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、