Springboot日志配置的实现示例
前言
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>
到此这篇关于Springboot日志配置的实现示例的文章就介绍到这了,更多相关Springboot日志配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Intellij idea 代码提示忽略字母大小写和常用快捷键及设置步骤
这篇文章主要介绍了Intellij idea 代码提示忽略字母大小写和常用快捷键及设置步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-02-02@ConfigurationProperties绑定配置信息至Array、List、Map、Bean的实现
这篇文章主要介绍了@ConfigurationProperties绑定配置信息至Array、List、Map、Bean的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-05-05Spring MVC 更灵活的控制 json 返回问题(自定义过滤字段)
本篇文章主要介绍了Spring MVC 更灵活的控制 json 返回问题(自定义过滤字段),具有一定的参考价值,感兴趣的小伙伴们可以参考一下。2017-02-02详解spring security之httpSecurity使用示例
这篇文章主要介绍了详解spring security之httpSecurity使用示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-08-08Java链表(Linked List)基本原理与实现方法入门示例
这篇文章主要介绍了Java链表(Linked List)基本原理与实现方法,结合实例形式分析了Java链表(Linked List)的功能、原理、实现方法与操作注意事项,需要的朋友可以参考下2020-03-03
最新评论