Spring Boot:日志集成

时间:2022-06-01 18:48:04

Java日志框架

Java有好几个日志框架,我们有时在选择Java日志框架时会有点迷惑。下面几个是常用的日志框架

  • Common Logging:Apache最早提供的日志的门面接口。避免和具体的日志方案直接耦合。
  • SLF4J(Simple Logging Facade for JAVA):和Common Logging一样,是一个门面框架,是对不同日志框架提供的一个门面封装。可以在部署的时候不修改任何配置即可接入一种日志实现方案
  • Java Util Logging:JDK提供的日志方案
  • Log4j:不推荐使用。经典的日志解决方案。内部把日志系统抽象封装成Logger、appender、pattern等实现使用Log4j 2代替。
  • Log4j 2:Log4j的增强版。
  • Logback:SLF4默认的实现日志方案

这几种框架中,Common Logging和SLF4J为门面框架,抽象出日志的通用API供应用使用,它们会根据应用所依赖绑定具体的日志方案框架,这样应用和具体的日志方案实现了解耦。Java Util Logging,Log4j 2以及Logback为具体的日志方案。

Spring Boot日志

Spring Boot内部使用Common Logging作为门面日志框架。它会根据依赖包选择激活相应的日志实现。

支持的日志实现框架:Java Util Logging,Logback和Log4j 2。

预置配置:Spring Boot为这些日志实现框架预置了一份默认的配置,默认输出到控制台。

如果我们添加了“starter”依赖,那么默认是使用Logback作为实现。所有在没有添加其他的日志实现框架的情况下,我们不需要做额外的工作就可以使用日志了。

Spring Boot日志配置

Spring Boot预置了相关日志框架的默认配置,而application.properties有几个日志相关的配置,可以使用它们做有限度的定制。

logging.config= # 日志配置文件的路径,例如logback配置文件 `classpath:logback.xml`
logging.exception-conversion-word=%wEx # 异常记录的转换字
logging.file= # 日志文件,例如`myapp.log`
logging.level.*= # 日志级别的映射, 例如`logging.level.org.springframework=DEBUG`
logging.path= # 日志文件的路径,例如`/var/log`
logging.pattern.console= # 输出到控制台的模式。只支持默认的logback设置
logging.pattern.file= # 输出到文件的模式。 只支持默认的logback设置
logging.pattern.level= # 日志级别的输出模式 。 只支持默认的logback设置
logging.register-shutdown-hook=false # 初始化时是否注册shutdown hook

定制日志配置

除了使用Spring Boot在application.properties为我们提供的配置定制日志外,我们还可以集成相应的日志实现框架自身的配置文件。

有两种方式指定配置文件。

方式一:默认配置文件路径

  • Logback:logback-spring.xml, logback-spring.groovy, logback.xml 或 logback.groovy
  • Log4j2:log4j2-spring.xml 或log4j2.xml
  • JDK (Java Util Logging):logging.properties

方式二:使用logging.config指定配置文件

logging.config= # 日志配置文件的路径,例如logback配置文件 `classpath:logback.xml`

集成Log4j2

集成Log4j2有两种方式:手动添加日志依赖和starter方式。推荐使用spring-boot-starter-log4j2的starter方式。

添加starter需要排除Logback的starter:spring-boot-starter-logging,配置如下

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

手动添加Log4j2相关的依赖包,也必须添加jcl-over-slf4j依赖。

集成Logback

Spring Boot默认使用Logback作为日志实现框架。我们可以使用logback.xml或logback-spring.xml配置来定制Logback的使用。

集成Spring Boot预置的Logback配置

logback.xml 或logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
    <logger name="org.springframework.web" level="DEBUG"/>
</configuration>

base.xml可以让我们使用Spring Boot在application.properties里的配置属性:logging.config,logging.path,logging.exception-conversion-word。

配置输出文件

logback.xml 或logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/>
    <include resource="org/springframework/boot/logging/logback/file-appender.xml" />
    <root level="INFO">
        <appender-ref ref="FILE" />
    </root>
</configuration>

这里禁用了控制台输入,导入了file-appender.xml。

注意:使用logging.file指定输出文件