SpringBoot统一日志输出

2,479 阅读4分钟

这是我参与8月更文挑战的第24天,活动详情查看:8月更文挑战

在开发SpringBoot项目的过程中,为了能够更好的记录项目的运行信息,以及定位跟踪问题,我们都会采取打日志的方式。SpringBoot的内部使用Jakarta Commons Logging API(JCL),默认配置提供了对常用日志的支持,可以通过配置使用控制台或文件输出日志内容。

SLF4J

SLF4J的定义

SLF4J,即Simple Logging Facade For Java,是SpringBoot中一个针对各类Java日志框架的统一Facade(门面)抽象,定义了统一的日志抽象接口,真正的日志实现则是在运行时决定的。在实际使用过程中,每个日志框架都是面向该接口开发,SLF4J为所有的日志统一了API接口,但是实现各不相同,这种模式称为门面模式。 SpringBoot默认实现的是logback日志框架。

SLF4J的使用规范

  • 在阿里巴巴开发手册中强制要求,在项目应用中不可以直接使用log4j、logback中的API,而是应该依赖于日志框架SLF4J的API,使用门面模式的日志框架。
  • 使用统一规范的SLF4J接口,有利于维护各个类、各模块不同日志框架时日志处理方式的统一。

SLF4J支持日志框架

从官网给出的SLF4J支持框架结构图中,可以看到,logback、log4j等日志框架都可以通过一定Jar包的转换在应用中实际使用SLF4J的统一接口。这样无论使用何种框架,只需要引入相关的Jar,对于使用的逻辑不需要做改变就可以适用。 image.png

SLF4J在应用中开发使用

SLF4J存在于SpringBoot启动类中,会自动加载。 image.png

实际使用时,只需要创建logger对象并使用即可。

Logger logger = LoggerFactory.getLogger(ControllerTestSLF4J.class);
logger.info("logger.info : hello!");

SLF4J对日志框架的适配

  • 以log4j框架来讲,在使用SLF4J作为门面时需要一层适配层,而log4j提供了slf4j-api.jar和slf-4j-log412.jar的依赖。
  • slf4j-api.jar用来做适配,在调用slf4j的api时其实是在调用slf4j-api.jar中的api,而其执行的是log4j中的具体方法。
  • 其他的日志框架也是如此,有了适配层,那么多有的日志框架都可以使用slf4j的api来进行日志操作了。

SpringBoot中日志相关配置

配置文件中配置日志

  • SpringBoot项目的application.properties配置文件中可以配置日志属性
  • logging.level.*:控制日志级别,*代表生效的包名,值可以设置为:TRACE<DEBUG<INFO<ERROR<TATAL,设置后低于当前级别的信息不会输出。
  • logging.pattern:自定义在console和file中的输出格式
  • 日志输出到文件
    • SpringBoot默认将日志输出到控制台,可以在配置文件中设置logging.file或logging.path属性来将日志输出到文件
    • logging.file:设置文件名称,绝对路径或相对路径,如 =my.log
    • logging.path:设置目录,如果会在该目录下创建日志文件
    • 如果只设置file属性,则会在项目当前路径下创建指定日志文件;如果只设置path属性,则会在指定目录下创建spring.log

使用命令设置日志级别

在运行Jar包时可以使用java -jar springTest.jar --debug命令来设置当前项目的日志输出级别。

使用单独的日志配置文件

  • 外部配置文件默认命名规则如下: image.png
  • SpringBoot官方推荐带-sprring的命名方式,此时SpringBoot可以自动添加一些配置项,配置文件默认放置在src/main/resources目录下。
  • 也可以用户自定义配置文件名称,但是此时要在SpringBoot配置文件中指定具体配置文件:logging.config=classpath:logging.xml

日志的具体使用

  • 如果使用了lombok插件,则可以使用注解@ slf4j后,可以直接使用log.error进行日志的输出。
  • 如果没有使用lombok插件,则需要创建logger对象,private static final Logger log = LoggerFactory.getLogger(Xxx.class);针对每个类创建一个静态对象,减少资源浪费。
  • 输出日志时,使用参数信息的方式进行输出,使用 [{}] 进行参数变量隔离,不要使用字符串拼接,会产生很多字符串对象,占用空间、影响性能\
  • 对于debug日志,要判断是否为dubug级别后,再进行使用\

最后

简单记录了一下项目中SLF4J日志门面的使用方式,在后续的业务中也会不断的学习和改进。