前言
Spring Boot 底层默认使用 slf4j 和 logback 的方式记录日志。工程中依赖了 spring-boot-starter-web,它又依赖了 spring-boot-starter-logging,所以不需要再手动添加该依赖。在 Spring Boot 中,application.yml 支持部分 logback 的日志配置,但一些高级配置只能通过独立的 xml 配置文件实现,经过 Spring Boot 的整合后,可支持多环境配置,但 logback 配置文件需要命名为 logback-spring.xml。如果使用了自定义日志配置文件,application.yml中 logging 有关配置就会失效。
springboot 默认的 logback 配置
SpringBoot 默认提供了一套 logback 的配置文件,位于 spring-boot依赖中的 org/springframework/boot/logging/logback/base.xml。
<included>
<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/console-appender.xml" />
<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</included>
该文件引入了三个 xml 文件,并设置了root的日志级别为 info。console-appender.xml 和 file-appender.xml 中定义了日志的追加器,分别是名为 CONSOLE 的控制台追加器 和 名为 FILE 的文件追加器。org/springframework/boot/logging/logback/defaults.xml 定义了 logback 的转换器、一些包的日志级别、日志显示格式。
<included>
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{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}}"/>
<property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<appender name="DEBUG_LEVEL_REMAPPER" class="org.springframework.boot.logging.logback.LevelRemappingAppender">
<destinationLogger>org.springframework.boot</destinationLogger>
</appender>
<logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/>
<logger name="org.apache.catalina.util.LifecycleBase" level="ERROR"/>
<logger name="org.apache.coyote.http11.Http11NioProtocol" level="WARN"/>
<logger name="org.apache.sshd.common.util.SecurityUtils" level="WARN"/>
<logger name="org.apache.tomcat.util.net.NioSelectorPool" level="WARN"/>
<logger name="org.crsh.plugin" level="WARN"/>
<logger name="org.crsh.ssh" level="WARN"/>
<logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="ERROR"/>
<logger name="org.hibernate.validator.internal.util.Version" level="WARN"/>
<logger name="org.springframework.boot.actuate.autoconfigure.CrshAutoConfiguration" level="WARN"/>
<logger name="org.springframework.boot.actuate.endpoint.jmx" additivity="false">
<appender-ref ref="DEBUG_LEVEL_REMAPPER"/>
</logger>
<logger name="org.thymeleaf" additivity="false">
<appender-ref ref="DEBUG_LEVEL_REMAPPER"/>
</logger>
</included>
默认在控制台中显示彩色日志,就是因为使用了转换器 ColorConverter,显示的格式为 CONSOLE_LOG_PATTERN 中使用了该转换器。在我们的自定义配置中可以复用这个 default.xml 和 console-appender.xml。
自定义配置
在 src/main/resources/下创建配置文件 logback-spring.xml。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
</configuration>
上面的配置引入了 spring boot 中 logback 的默认配置和 CONSOLE 追加器,并定义了 root 的日志级别为 info。
日志级别
日志有五个级别:trace、debug、info、warn、error,级别依次较高,配置了某个级别,就会输出该级别及其以上的级别。如,配置日志级别为 warn,则日志会输出 warn、error;如果配置日志级别为 debug,则会输出 debug、info、warn、error。
@RequestMapping(value = "/testLogLevel", method = RequestMethod.GET)
public String testLogLevel() {
LOGGER.trace("hello,爱琴孩!");
LOGGER.debug("hello,爱琴孩!");
LOGGER.info("hello,爱琴孩!");
LOGGER.warn("hello,爱琴孩!");
LOGGER.error("hello,爱琴孩!");
return "Success";
}
注意,引入的 Logger 和 LoggerFactory 两个类都是 slf4j 包下面的。上面的代码分别输出五个级别的日志。启动服务,访问 testLogLevel接口,控制台输出:
控制台值输出 info、warn、error,可以看出 SpringBoot 默认输出级别为 info。可通过配置细粒度调整日志的级别:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
...
<logger name="com.example.study.controller" level="trace" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
...
</configuration>
上面按照包名更改了日志的显示级别,com.example.study.controller 包下面的日志都是 trace 级别。上面配置选项"additivity",用于控制日志消息在日志层级之间的传播方式。在Logback中,每个日志记录器(logger)都有一个与之关联的层级(level)。当日志消息到达一个日志记录器时,Logback会将其传播到所有具有相同或更高层级的日志记录器。默认情况下,Logback将日志消息传播到所有父级日志记录器。"additivity"的值可以是true或false。当"additivity"设置为true时,日志消息将被传播到所有父级日志记录器;当"additivity"设置为false时,日志消息将仅停留在当前日志记录器中,不会传播到父级日志记录器。通过配置"additivity",可以更细粒度地控制日志消息在应用程序中的流动,避免在特定的日志记录器中重复记录日志消息,也可以提高日志记录的性能。
重新访问 testLogLevel接口,error、warn、info、debug、trace 都会全部打印出来。
文件追加器
上面复用了 SpringBoot 自带的控制台追加器 CONSOLE,这里自定义文件追加器:
<appender name="ServiceLogRollingFileAppender"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_FILE}</file>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.log
</fileNamePattern>
</rollingPolicy>
</appender>
并在 root 中添加这个自定义 ServiceLogRollingFileAppender追加器:
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="ServiceLogRollingFileAppender" />
</root>
多环境日志
假设希望在 local 时,只输出控制台日志;在其他环境(dev、test等)输出控制台日志和文件日志。SpringBoot 提供了 springProfile 标签,通过该元素 name 属性指定环境。修改 root 元素:
<root level="INFO">
<springProfile name="local">
<appender-ref ref="CONSOLE" />
</springProfile>
<springProfile name="!local">
<appender-ref ref="CONSOLE" />
<appender-ref ref="ServiceLogRollingFileAppender" />
</springProfile>
</root>
分别使用 local 和 dev 启动服务,测试多环境是否生效。我们自定义的 logback-spring.xml 充分利用了 Spring Boot 官方提供的配置,最终完整配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<springProperty scop="context" name="LOG_SERVICE_NAME" source="logging.service.name" />
<property name="CONSOLE_LOG_PATTERN"
value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_SERVICE_NAME}){faint} %clr(${PID:- }){magenta} %clr([%15.15t]){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(%-40.40class{39} %5.5L){cyan}%clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}" />
<property name="FILE_LOG_PATTERN"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_SERVICE_NAME:-%5p} ${PID:- } [%t] ${LOG_LEVEL_PATTERN:-%5p} %-40.40class{39} %5.5L: %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}" />
<property name="LOG_FILE"
value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}" />
<include
resource="org/springframework/boot/logging/logback/console-appender.xml" />
<appender name="ServiceLogRollingFileAppender"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_FILE}</file>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.log
</fileNamePattern>
</rollingPolicy>
</appender>
<root level="INFO">
<springProfile name="local">
<appender-ref ref="CONSOLE" />
</springProfile>
<springProfile name="!local">
<appender-ref ref="CONSOLE" />
<appender-ref ref="ServiceLogRollingFileAppender" />
</springProfile>
</root>
<logger name="com.example.study.controller" level="trace" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
</configuration>
版权归原作者 爱琴孩 所有, 如有侵权,请联系我们删除。