Springboot日志配置的實(shí)現(xiàn)示例
前言
Spring Boot 底層默認(rèn)使用 slf4j 和 logback 的方式記錄日志。工程中依賴(lài)了 spring-boot-starter-web,它又依賴(lài)了 spring-boot-starter-logging,所以不需要再手動(dòng)添加該依賴(lài)。在 Spring Boot 中,application.yml 支持部分 logback 的日志配置,但一些高級(jí)配置只能通過(guò)獨(dú)立的 xml 配置文件實(shí)現(xiàn),經(jīng)過(guò) Spring Boot 的整合后,可支持多環(huán)境配置,但 logback 配置文件需要命名為 logback-spring.xml。如果使用了自定義日志配置文件,application.yml中 logging 有關(guān)配置就會(huì)失效。
springboot 默認(rèn)的 logback 配置
SpringBoot 默認(rèn)提供了一套 logback 的配置文件,位于 spring-boot依賴(lài)中的 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>該文件引入了三個(gè) xml 文件,并設(shè)置了root的日志級(jí)別為 info。console-appender.xml 和 file-appender.xml 中定義了日志的追加器,分別是名為 CONSOLE 的控制臺(tái)追加器 和 名為 FILE 的文件追加器。org/springframework/boot/logging/logback/defaults.xml 定義了 logback 的轉(zhuǎn)換器、一些包的日志級(jí)別、日志顯示格式。
<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>默認(rèn)在控制臺(tái)中顯示彩色日志,就是因?yàn)槭褂昧宿D(zhuǎn)換器 ColorConverter,顯示的格式為 CONSOLE_LOG_PATTERN 中使用了該轉(zhuǎn)換器。在我們的自定義配置中可以復(fù)用這個(gè) default.xml 和 console-appender.xml。
自定義配置
在 src/main/resources/下創(chuàng)建配置文件 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 的默認(rèn)配置和 CONSOLE 追加器,并定義了 root 的日志級(jí)別為 info。
日志級(jí)別
日志有五個(gè)級(jí)別:trace、debug、info、warn、error,級(jí)別依次較高,配置了某個(gè)級(jí)別,就會(huì)輸出該級(jí)別及其以上的級(jí)別。如,配置日志級(jí)別為 warn,則日志會(huì)輸出 warn、error;如果配置日志級(jí)別為 debug,則會(huì)輸出 debug、info、warn、error。
@RequestMapping(value = "/testLogLevel", method = RequestMethod.GET)
public String testLogLevel() {
LOGGER.trace("hello,愛(ài)琴孩!");
LOGGER.debug("hello,愛(ài)琴孩!");
LOGGER.info("hello,愛(ài)琴孩!");
LOGGER.warn("hello,愛(ài)琴孩!");
LOGGER.error("hello,愛(ài)琴孩!");
return "Success";
}注意,引入的 Logger 和 LoggerFactory 兩個(gè)類(lèi)都是 slf4j 包下面的。上面的代碼分別輸出五個(gè)級(jí)別的日志。啟動(dòng)服務(wù),訪(fǎng)問(wèn) testLogLevel接口,控制臺(tái)輸出:

控制臺(tái)值輸出 info、warn、error,可以看出 SpringBoot 默認(rèn)輸出級(jí)別為 info。可通過(guò)配置細(xì)粒度調(diào)整日志的級(jí)別:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
...
<logger name="com.example.study.controller" level="trace" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
...
</configuration>上面按照包名更改了日志的顯示級(jí)別,com.example.study.controller 包下面的日志都是 trace 級(jí)別。上面配置選項(xiàng)"additivity",用于控制日志消息在日志層級(jí)之間的傳播方式。在Logback中,每個(gè)日志記錄器(logger)都有一個(gè)與之關(guān)聯(lián)的層級(jí)(level)。當(dāng)日志消息到達(dá)一個(gè)日志記錄器時(shí),Logback會(huì)將其傳播到所有具有相同或更高層級(jí)的日志記錄器。默認(rèn)情況下,Logback將日志消息傳播到所有父級(jí)日志記錄器。"additivity"的值可以是true或false。當(dāng)"additivity"設(shè)置為true時(shí),日志消息將被傳播到所有父級(jí)日志記錄器;當(dāng)"additivity"設(shè)置為false時(shí),日志消息將僅停留在當(dāng)前日志記錄器中,不會(huì)傳播到父級(jí)日志記錄器。通過(guò)配置"additivity",可以更細(xì)粒度地控制日志消息在應(yīng)用程序中的流動(dòng),避免在特定的日志記錄器中重復(fù)記錄日志消息,也可以提高日志記錄的性能。
重新訪(fǎng)問(wèn) testLogLevel接口,error、warn、info、debug、trace 都會(huì)全部打印出來(lái)。

文件追加器
上面復(fù)用了 SpringBoot 自帶的控制臺(tái)追加器 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 中添加這個(gè)自定義 ServiceLogRollingFileAppender追加器:
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="ServiceLogRollingFileAppender" />
</root>多環(huán)境日志
假設(shè)希望在 local 時(shí),只輸出控制臺(tái)日志;在其他環(huán)境(dev、test等)輸出控制臺(tái)日志和文件日志。SpringBoot 提供了 springProfile 標(biāo)簽,通過(guò)該元素 name 屬性指定環(huán)境。修改 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 啟動(dòng)服務(wù),測(cè)試多環(huán)境是否生效。我們自定義的 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>到此這篇關(guān)于Springboot日志配置的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Springboot日志配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Spring Boot 日志級(jí)別及配置詳解
- springboot中l(wèi)ogback日志配置的詳細(xì)說(shuō)明
- 一文帶你搞定SpringBoot Log4j2日志配置文件
- SpringBoot日志配置SLF4J和Logback的方法實(shí)現(xiàn)
- Spring?Boot整合log4j2日志配置的詳細(xì)教程
- SpringBoot日志配置全過(guò)程
- Spring?Boot日志打印配置詳細(xì)介紹
- SpringBoot3配置Logback日志滾動(dòng)文件的方法
- 如何為?Spring?Boot?項(xiàng)目配置?Logback?日志
- Spring Boot配置日志的實(shí)現(xiàn)步驟
相關(guān)文章
Netty分布式ByteBuf使用的底層實(shí)現(xiàn)方式源碼解析
這篇文章主要為大家介紹了Netty分布式ByteBuf使用底層實(shí)現(xiàn)方式源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
解決spring cloud服務(wù)啟動(dòng)之后回到命令行會(huì)自動(dòng)掛掉問(wèn)題
這篇文章主要介紹了解決spring cloud服務(wù)啟動(dòng)之后回到命令行會(huì)自動(dòng)掛掉問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
MyBatis連接數(shù)據(jù)庫(kù)配置的基本步驟和機(jī)制
MyBatis 是一個(gè)流行的持久層框架,它通過(guò)使用XML或注解的方式將SQL語(yǔ)句、存儲(chǔ)過(guò)程和Java方法進(jìn)行綁定,從而避免了手寫(xiě)大量的JDBC代碼和手動(dòng)設(shè)置參數(shù)與結(jié)果集,本文給大家介紹了MyBatis連接數(shù)據(jù)庫(kù)配置的基本步驟和機(jī)制,需要的朋友可以參考下2024-05-05
Springboot?中的?Filter?實(shí)現(xiàn)超大響應(yīng)?JSON?數(shù)據(jù)壓縮的方法
這篇文章主要介紹了Springboot?中的?Filter?實(shí)現(xiàn)超大響應(yīng)?JSON?數(shù)據(jù)壓縮,定義GzipFilter對(duì)輸出進(jìn)行攔截,定義 Controller該 Controller 非常簡(jiǎn)單,主要讀取一個(gè)大文本文件,作為輸出的內(nèi)容,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10
Tomcat報(bào)錯(cuò):HTTP Status 500 (Wrapper cannot find servlet class)
這篇文章主要介紹了Tomcat報(bào)錯(cuò):HTTP Status 500 (Wrapper cannot find servlet class)解決辦法的相關(guān)資料,需要的朋友可以參考下2016-11-11
java多線(xiàn)程Synchronized實(shí)現(xiàn)可見(jiàn)性原理解析
這篇文章主要介紹了java多線(xiàn)程Synchronized實(shí)現(xiàn)可見(jiàn)性原理,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
spring boot aop 記錄方法執(zhí)行時(shí)間代碼示例
這篇文章主要介紹了spring boot aop 記錄方法執(zhí)行時(shí)間代碼示例,分享了相關(guān)代碼,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02
Java操作MongoDB事務(wù)未生效的常見(jiàn)場(chǎng)景及解決方案
在 Java 開(kāi)發(fā)中,使用 MongoDB 存儲(chǔ)數(shù)據(jù)時(shí),事務(wù)的正確使用至關(guān)重要,然而,在實(shí)際開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)遇到 MongoDB 事務(wù)沒(méi)有生效的情況,本文我將結(jié)合多年實(shí)踐經(jīng)驗(yàn),深入剖析事務(wù)未生效的常見(jiàn)場(chǎng)景,并給出詳細(xì)的解決方案,需要的朋友可以參考下2025-07-07

