SpringBoot 以slf4j门面模式使用日志(二)

410 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

三、Springboot底层日志关系

image.png 通过上图,我们可以得知

  1. SpringBoot底层也是使用slf4j+logback的方式进行日志记录
    1. logback桥接:logback-classic
  2. SpringBoot也把其他的日志都替换成了slf4j;
    1. log4j 适配: log4j-over-slf4j
    2. jul适配:jul-to-slf4j
    3. 这两个适配器都是为了适配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中的类 image.png

3-1-3、通过输出日志了解日志级别

如下可以看到,日志输出了info后的相关日志,可以推断出,当前项目使用的日志级别是info,因为项目中并未设置日志级别,因此info为springboot默认的日志级别 image.png

3-1-3-1、修改日志级别

如下通过在配置文件中添加配置即可修改日志级别。 image.png

3-1-3-2、查看官网修改教程

1、选择springboot

image.png

2、选择当前使用版本,查看文档

image.png

3、选择core features

image.png

4、再选择loggging

image.png

5、选择log levels,就可以看到如何配置了

image.png

3-1-3-3、修改固定包下的日志级别

我们将日志级别设为trace,就可以看到springboot启动的所有信息了

image.png

但在实际项目中,我们仅想看到我们自己研发代码的trace级别,该如何设置呢?

如下通过设置logging.level.com.jony就可以设置我们自己代码包下面的日志级别了,而此时springboot的默认日志级别仍然是info。 image.png

四、日志格式

上已经演示了日志的输出,那输出的信息代表什么意思呢?可以看一下官网的解释

image.png

4-1、日志的详细信息介绍

用下面这行日志来进行解析

2022-05-12 22:02:57.696 TRACE 80840 --- [ main] com.jony.Application : 跟踪

2022-05-12 22:02:57.696

  • 日期和时间:毫秒精度,易于排序。 TRACE
  • 日志级别:ERRORWARNINFODEBUGTRACE80840
  • 进程标识。 ---
  • ---用于区分实际日志消息开始的分隔符。 main
  • 线程名称:括在方括号中(可能会被截断以用于控制台输出)。
    main代表主线程,若果我们在main中new Thread,并且设置一个名称,此处就会显示子线程的名称 com.jony.Application
  • 记录器名称:这通常是源类名称(通常缩写)。 跟踪
  • 日志消息。

4-2、日志的格式

进入application properties中

image.png

可以找到logging.pattern.console

image.png

格式信息如下:

image.png

4-2-1、使用继续改日志格式

可以使用logging.pattern.console来配置日志格式

将官方提供的日志格式拷贝到配置文件,启动查看日志信息如下,可以看到和之前没有区别。

image.png

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}
官网中对颜色进行了相关说明如

image.png 可以使用如下颜色

image.png 如我们把测试项目中日期改为blue

image.png

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。

image.png

3、LOG_DATEFORMAT_PATTERN时间的设置
官网告诉我们可以通过logging.pattern.dateformat来设置LOG_DATEFORMAT_PATTERN的时间 image.png

测试项目中设置,测试如下:
可以看到通过

System.getProperty("LOG_DATEFORMAT_PATTERN")

获取到,同时日志的时间也改为yyyy-MM-dd image.png

4、通过源码查看LOG_DATEFORMAT_PATTERN的设置过程

通过ctrl+鼠标左键进入 image.png

可以看到实际上是一个listener。 image.png

再次进入initlalize

image.png

再次进入apply image.png

这样就可以看到所有的系统环境变量了,同时LOG_DATEFORMAT_PATTERN也在其中,并且还可以看到后面的propertyName对应的配置key image.png

小结:在配置文件中,只要是${}的配置,都为环境变量。

下面即为配置环境和系统属性的对应关系

配置环境系统属性评论
logging.exception-conversion-wordLOG_EXCEPTION_CONVERSION_WORD记录异常时使用的转换字。
logging.file.nameLOG_FILE如果已定义,它将在默认日志配置中使用。
logging.file.pathLOG_PATH如果已定义,它将在默认日志配置中使用。
logging.pattern.consoleCONSOLE_LOG_PATTERN在控制台上使用的日志模式 (stdout)。
logging.pattern.dateformatLOG_DATEFORMAT_PATTERN日志日期格式的附加模式。
logging.charset.consoleCONSOLE_LOG_CHARSET用于控制台日志记录的字符集。
logging.pattern.fileFILE_LOG_PATTERN在文件中使用的日志模式(如果LOG_FILE启用)。
logging.charset.fileFILE_LOG_CHARSET用于文件日志记录的字符集(如果LOG_FILE启用)。
logging.pattern.levelLOG_LEVEL_PATTERN呈现日志级别时使用的格式(默认%5p)。
PIDPID当前进程 ID(如果可能且尚未定义为 OS 环境变量时发现)。

5、%d logbak的日期显示方式: {-yyyy-MM-dd HH:mm:ss.SSS} 日期的格式,在logback官网中,可以看到date日期设置的格式,如下

image.png

4-2-1-1-2、日志级别设置

%clr(${LOG_LEVEL_PATTERN:-%5p})
以上级别日志级别的设置。

4-2-1-1-2-1、颜色的设置

%clr即为设置颜色,和时间一样。
可以看到日志级别未设置颜色,这是因为系统会自动根据日志级别设置不同的颜色进行显示

image.png 在测试项目中,我们也可以看到日志级别输出的日志颜色

image.png

如果想设置颜色也是可以的,只需要和设置时间一样加上{颜色}即可,当然,颜色也仅限官方提供的几个颜色。如:

%clr(${LOG_LEVEL_PATTERN:-%5p}){red}
可以看到测试项目中,设置了红色,这样所有日志级别的颜色就都变成了红色,一般情况下不推荐这样设置。使用系统默认即可。

4-2-1-1-2-2、日志的设置

${LOG_LEVEL_PATTERN:-%5p}同意也是使用了springboot的占位符+null表达式,使用了环境变量。同样在源码中,我们也可以看到如下配置

image.png 这样我们在配置文件中就可以通过使用logging.pattern.level来进行日志级别的设置了。

上方日志配置中,%5指当前内容所占字符长度,比如我们将测试项目中的字符长度改为10,可以看下结果

image.png

其中p就是输出当前日志的级别。比如输出的trace/debug/info/warn/error。

后面进程ID/线程名称/记录日志的类等和上面设置基本相同,就不一一介绍,感兴趣的同学,可以自己设置一下。