Springboot日志配置的實現(xiàn)示例
前言
Spring Boot 底層默認使用 slf4j 和 logback 的方式記錄日志。工程中依賴了 spring-boot-starter-web,它又依賴了 spring-boot-starter-logging,所以不需要再手動添加該依賴。在 Spring Boot 中,application.yml 支持部分 logback 的日志配置,但一些高級配置只能通過獨立的 xml 配置文件實現(xiàn),經(jīng)過 Spring Boot 的整合后,可支持多環(huán)境配置,但 logback 配置文件需要命名為 logback-spring.xml。如果使用了自定義日志配置文件,application.yml中 logging 有關(guān)配置就會失效。
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 文件,并設(shè)置了root的日志級別為 info。console-appender.xml 和 file-appender.xml 中定義了日志的追加器,分別是名為 CONSOLE 的控制臺追加器 和 名為 FILE 的文件追加器。org/springframework/boot/logging/logback/defaults.xml 定義了 logback 的轉(zhuǎn)換器、一些包的日志級別、日志顯示格式。
<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>
默認在控制臺中顯示彩色日志,就是因為使用了轉(zhuǎn)換器 ColorConverter,顯示的格式為 CONSOLE_LOG_PATTERN 中使用了該轉(zhuǎn)換器。在我們的自定義配置中可以復(fù)用這個 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 的默認配置和 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 包下面的。上面的代碼分別輸出五個級別的日志。啟動服務(wù),訪問 testLogLevel接口,控制臺輸出:
控制臺值輸出 info、warn、error,可以看出 SpringBoot 默認輸出級別為 info。可通過配置細粒度調(diào)整日志的級別:
<?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)都有一個與之關(guān)聯(lián)的層級(level)。當日志消息到達一個日志記錄器時,Logback會將其傳播到所有具有相同或更高層級的日志記錄器。默認情況下,Logback將日志消息傳播到所有父級日志記錄器。"additivity"的值可以是true或false。當"additivity"設(shè)置為true時,日志消息將被傳播到所有父級日志記錄器;當"additivity"設(shè)置為false時,日志消息將僅停留在當前日志記錄器中,不會傳播到父級日志記錄器。通過配置"additivity",可以更細粒度地控制日志消息在應(yīng)用程序中的流動,避免在特定的日志記錄器中重復(fù)記錄日志消息,也可以提高日志記錄的性能。
重新訪問 testLogLevel接口,error、warn、info、debug、trace 都會全部打印出來。
文件追加器
上面復(fù)用了 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>
多環(huán)境日志
假設(shè)希望在 local 時,只輸出控制臺日志;在其他環(huán)境(dev、test等)輸出控制臺日志和文件日志。SpringBoot 提供了 springProfile 標簽,通過該元素 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 啟動服務(wù),測試多環(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日志配置的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)Springboot日志配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Netty分布式ByteBuf使用的底層實現(xiàn)方式源碼解析
這篇文章主要為大家介紹了Netty分布式ByteBuf使用底層實現(xiàn)方式源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-03-03解決spring cloud服務(wù)啟動之后回到命令行會自動掛掉問題
這篇文章主要介紹了解決spring cloud服務(wù)啟動之后回到命令行會自動掛掉問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09MyBatis連接數(shù)據(jù)庫配置的基本步驟和機制
MyBatis 是一個流行的持久層框架,它通過使用XML或注解的方式將SQL語句、存儲過程和Java方法進行綁定,從而避免了手寫大量的JDBC代碼和手動設(shè)置參數(shù)與結(jié)果集,本文給大家介紹了MyBatis連接數(shù)據(jù)庫配置的基本步驟和機制,需要的朋友可以參考下2024-05-05Springboot?中的?Filter?實現(xiàn)超大響應(yīng)?JSON?數(shù)據(jù)壓縮的方法
這篇文章主要介紹了Springboot?中的?Filter?實現(xiàn)超大響應(yīng)?JSON?數(shù)據(jù)壓縮,定義GzipFilter對輸出進行攔截,定義 Controller該 Controller 非常簡單,主要讀取一個大文本文件,作為輸出的內(nèi)容,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2022-10-10Tomcat報錯:HTTP Status 500 (Wrapper cannot find servlet class)
這篇文章主要介紹了Tomcat報錯:HTTP Status 500 (Wrapper cannot find servlet class)解決辦法的相關(guān)資料,需要的朋友可以參考下2016-11-11java多線程Synchronized實現(xiàn)可見性原理解析
這篇文章主要介紹了java多線程Synchronized實現(xiàn)可見性原理,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-12-12spring boot aop 記錄方法執(zhí)行時間代碼示例
這篇文章主要介紹了spring boot aop 記錄方法執(zhí)行時間代碼示例,分享了相關(guān)代碼,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-02-02Java操作MongoDB事務(wù)未生效的常見場景及解決方案
在 Java 開發(fā)中,使用 MongoDB 存儲數(shù)據(jù)時,事務(wù)的正確使用至關(guān)重要,然而,在實際開發(fā)過程中,經(jīng)常會遇到 MongoDB 事務(wù)沒有生效的情況,本文我將結(jié)合多年實踐經(jīng)驗,深入剖析事務(wù)未生效的常見場景,并給出詳細的解決方案,需要的朋友可以參考下2025-07-07