持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
三、Springboot底层日志关系
通过上图,我们可以得知
- SpringBoot底层也是使用slf4j+logback的方式进行日志记录
- logback桥接:logback-classic
- SpringBoot也把其他的日志都替换成了slf4j;
- log4j 适配: log4j-over-slf4j
- jul适配:jul-to-slf4j
- 这两个适配器都是为了适配Spring的默认日志:jc
3-1、Springboot日志使用
3-1-1、日志级别
可以设置TRACE,DEBUG,INFO,WARN,ERROR,FATAL或OFF之一
在配置文件中设置日志级别,大于的则会显示,小于的则不显示,如设置Debug,则包括debug及后面的info warn error 等日志信息都会显示出来。
同时也可以根据日志级别,将日志分别输出到不同的日志文件中,比如warn日志级别,我们就输出到warn的日志文件中,error就输出到error的日志文件中,这样我们就可以有针对性的查看日志了。
3-1-2、日志的声明
3-1-2-1、使用Lombok声明日志
1、首先需要引入Lombok的依赖
2、在类上添加@Slf4j注解
优点 1、使用相对便捷\
缺点 1、需要idea支持lombok,如不支持还需要安装插件 2、侵入性较强,如果团队中有一个人员使用,其他人员在使用的时候,在idea不支持的情况下,都得安装插件、 3、lombok依赖jdk,后期如果jdk升级,而lombok不支持,就尴尬了
因此团队开发项目不建议使用lombok
3-1-2-2、使用变量初始化
需要注意的是,一定要使用slf4j中的类
3-1-3、通过输出日志了解日志级别
如下可以看到,日志输出了info后的相关日志,可以推断出,当前项目使用的日志级别是info,因为项目中并未设置日志级别,因此info为springboot默认的日志级别
3-1-3-1、修改日志级别
如下通过在配置文件中添加配置即可修改日志级别。
3-1-3-2、查看官网修改教程
1、选择springboot
2、选择当前使用版本,查看文档
3、选择core features
4、再选择loggging
5、选择log levels,就可以看到如何配置了
3-1-3-3、修改固定包下的日志级别
我们将日志级别设为trace,就可以看到springboot启动的所有信息了
但在实际项目中,我们仅想看到我们自己研发代码的trace级别,该如何设置呢?
如下通过设置logging.level.com.jony就可以设置我们自己代码包下面的日志级别了,而此时springboot的默认日志级别仍然是info。
四、日志格式
上已经演示了日志的输出,那输出的信息代表什么意思呢?可以看一下官网的解释
4-1、日志的详细信息介绍
用下面这行日志来进行解析
2022-05-12 22:02:57.696 TRACE 80840 --- [ main] com.jony.Application : 跟踪
2022-05-12 22:02:57.696
- 日期和时间:毫秒精度,易于排序。 TRACE
- 日志级别:
ERROR、WARN、INFO、DEBUG或TRACE。 80840 - 进程标识。 ---
---用于区分实际日志消息开始的分隔符。 main- 线程名称:括在方括号中(可能会被截断以用于控制台输出)。
main代表主线程,若果我们在main中new Thread,并且设置一个名称,此处就会显示子线程的名称 com.jony.Application - 记录器名称:这通常是源类名称(通常缩写)。 跟踪
- 日志消息。
4-2、日志的格式
进入application properties中
可以找到logging.pattern.console
格式信息如下:
4-2-1、使用继续改日志格式
可以使用logging.pattern.console来配置日志格式
将官方提供的日志格式拷贝到配置文件,启动查看日志信息如下,可以看到和之前没有区别。
4-2-1-1、解析日志配置信息
%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
看上去很乱,其实也是有规律的,每一块都是以"%"来进行开头的,我们将上面配置信息进行拆分理解。
4-2-1-1-1、时间解析
%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint}
显示日志的日期和时间:毫秒精度,易于排序
4-2-1-1-1-1、颜色的设置
%clr显示内容的颜色{faint}
官网中对颜色进行了相关说明如
可以使用如下颜色
如我们把测试项目中日期改为blue
4-2-1-1-1-2、时间的设置
括号中就是要显示的内容(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}})
显示的内容为:
%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}
1、日期格式的设置
其中 ${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}使用了springboot中的占位符${value:value2}+null条件的表达式,就是springboot去系统环境变量中去取LOG_DATEFORMAT_PATTERN,如果这个值为null则会使用-yyyy-MM-dd HH:mm:ss.SSS
LOG_DATEFORMAT_PATTERN: 系统环境变量中的值, springboot底层会根据对应的配置项将值设置到对应的环境变量中
如:LOG_DATEFORMAT_PATTERN=logging.pattern.dateformat 可以在官网4.8章节中看到对应的关系。或者去源码中看
2、LOG_DATEFORMAT_PATTERN时间的获取\
我们可以通过System获得LOG_DATEFORMAT_PATTERN的值,如下:可以看到值为null。
3、LOG_DATEFORMAT_PATTERN时间的设置
官网告诉我们可以通过logging.pattern.dateformat来设置LOG_DATEFORMAT_PATTERN的时间
测试项目中设置,测试如下:
可以看到通过
System.getProperty("LOG_DATEFORMAT_PATTERN")
获取到,同时日志的时间也改为yyyy-MM-dd
4、通过源码查看LOG_DATEFORMAT_PATTERN的设置过程
通过ctrl+鼠标左键进入
可以看到实际上是一个listener。
再次进入initlalize
再次进入apply
这样就可以看到所有的系统环境变量了,同时LOG_DATEFORMAT_PATTERN也在其中,并且还可以看到后面的propertyName对应的配置key
小结:在配置文件中,只要是${}的配置,都为环境变量。
下面即为配置环境和系统属性的对应关系
| 配置环境 | 系统属性 | 评论 |
|---|---|---|
logging.exception-conversion-word | LOG_EXCEPTION_CONVERSION_WORD | 记录异常时使用的转换字。 |
logging.file.name | LOG_FILE | 如果已定义,它将在默认日志配置中使用。 |
logging.file.path | LOG_PATH | 如果已定义,它将在默认日志配置中使用。 |
logging.pattern.console | CONSOLE_LOG_PATTERN | 在控制台上使用的日志模式 (stdout)。 |
logging.pattern.dateformat | LOG_DATEFORMAT_PATTERN | 日志日期格式的附加模式。 |
logging.charset.console | CONSOLE_LOG_CHARSET | 用于控制台日志记录的字符集。 |
logging.pattern.file | FILE_LOG_PATTERN | 在文件中使用的日志模式(如果LOG_FILE启用)。 |
logging.charset.file | FILE_LOG_CHARSET | 用于文件日志记录的字符集(如果LOG_FILE启用)。 |
logging.pattern.level | LOG_LEVEL_PATTERN | 呈现日志级别时使用的格式(默认%5p)。 |
PID | PID | 当前进程 ID(如果可能且尚未定义为 OS 环境变量时发现)。 |
5、%d logbak的日期显示方式: {-yyyy-MM-dd HH:mm:ss.SSS} 日期的格式,在logback官网中,可以看到date日期设置的格式,如下
4-2-1-1-2、日志级别设置
%clr(${LOG_LEVEL_PATTERN:-%5p})
以上级别日志级别的设置。
4-2-1-1-2-1、颜色的设置
%clr即为设置颜色,和时间一样。
可以看到日志级别未设置颜色,这是因为系统会自动根据日志级别设置不同的颜色进行显示
在测试项目中,我们也可以看到日志级别输出的日志颜色
如果想设置颜色也是可以的,只需要和设置时间一样加上{颜色}即可,当然,颜色也仅限官方提供的几个颜色。如:
%clr(${LOG_LEVEL_PATTERN:-%5p}){red}
可以看到测试项目中,设置了红色,这样所有日志级别的颜色就都变成了红色,一般情况下不推荐这样设置。使用系统默认即可。
4-2-1-1-2-2、日志的设置
${LOG_LEVEL_PATTERN:-%5p}同意也是使用了springboot的占位符+null表达式,使用了环境变量。同样在源码中,我们也可以看到如下配置
这样我们在配置文件中就可以通过使用
logging.pattern.level来进行日志级别的设置了。
上方日志配置中,%5指当前内容所占字符长度,比如我们将测试项目中的字符长度改为10,可以看下结果
其中p就是输出当前日志的级别。比如输出的trace/debug/info/warn/error。
后面进程ID/线程名称/记录日志的类等和上面设置基本相同,就不一一介绍,感兴趣的同学,可以自己设置一下。