Spring Boot Logback配置日志過程解析
這篇文章主要介紹了Spring Boot Logback配置日志過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
出于性能等原因,Logback 目前是springboot應(yīng)用日志的標(biāo)配; 當(dāng)然有時(shí)候在生產(chǎn)環(huán)境中也會(huì)考慮和三方中間件采用統(tǒng)一處理方式。
配置時(shí)考慮點(diǎn)
- 支持日志路徑,日志level等配置
- 日志控制配置通過application.yml下發(fā)
- 按天生成日志,當(dāng)天的日志>50MB回滾
- 最多保存10天日志
- 生成的日志中Pattern自定義
- Pattern中添加用戶自定義的MDC字段,比如用戶信息(當(dāng)前日志是由哪個(gè)用戶的請(qǐng)求產(chǎn)生),request信息。此種方式可以通過AOP切面控制,在MDC中添加requestID,在spring-logback.xml中配置Pattern。
- 根據(jù)不同的運(yùn)行環(huán)境設(shè)置Profile - dev,test,product
- 對(duì)控制臺(tái),Err和全量日志分別配置
- 對(duì)第三方包路徑日志控制
實(shí)現(xiàn)范例
如下兩個(gè)例子基本包含了上述的考慮點(diǎn):
綜合范例
application.yml
logging: level: root: debug path: C:/data/logs/springboot-logback-demo server: port: 8080 spring: application: name: springboot-logback-demo debug: false
Spring-logback.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 日志根目錄--> <springProperty scope="context" name="LOG_HOME" source="logging.path" defaultValue="/data/logs/springboot-logback-demo"/> <!-- 日志級(jí)別 --> <springProperty scope="context" name="LOG_ROOT_LEVEL" source="logging.level.root" defaultValue="DEBUG"/> <!-- 標(biāo)識(shí)這個(gè)"STDOUT" 將會(huì)添加到這個(gè)logger --> <springProperty scope="context" name="STDOUT" source="log.stdout" defaultValue="STDOUT"/> <!-- 日志文件名稱--> <property name="LOG_PREFIX" value="spring-boot-logback" /> <!-- 日志文件編碼--> <property name="LOG_CHARSET" value="UTF-8" /> <!-- 日志文件路徑+日期--> <property name="LOG_DIR" value="${LOG_HOME}/%d{yyyyMMdd}" /> <!--對(duì)日志進(jìn)行格式化--> <property name="LOG_MSG" value="- | [%X{requestUUID}] | [%d{yyyyMMdd HH:mm:ss.SSS}] | [%level] | [${HOSTNAME}] | [%thread] | [%logger{36}] | --> %msg|%n "/> <!--文件大小,默認(rèn)10MB--> <property name="MAX_FILE_SIZE" value="50MB" /> <!-- 配置日志的滾動(dòng)時(shí)間 ,表示只保留最近 10 天的日志--> <property name="MAX_HISTORY" value="10"/> <!--輸出到控制臺(tái)--> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!-- 輸出的日志內(nèi)容格式化--> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>${LOG_MSG}</pattern> </layout> </appender> <!--輸出到文件--> <appender name="0" class="ch.qos.logback.core.rolling.RollingFileAppender"> </appender> <!-- 定義 ALL 日志的輸出方式:--> <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--日志文件路徑,日志文件名稱--> <File>${LOG_HOME}/all_${LOG_PREFIX}.log</File> <!-- 設(shè)置滾動(dòng)策略,當(dāng)天的日志大小超過 ${MAX_FILE_SIZE} 文件大小時(shí)候,新的內(nèi)容寫入新的文件, 默認(rèn)10MB --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件路徑,新的 ALL 日志文件名稱,“ i ” 是個(gè)變量 --> <FileNamePattern>${LOG_DIR}/all_${LOG_PREFIX}%i.log</FileNamePattern> <!-- 配置日志的滾動(dòng)時(shí)間 ,表示只保留最近 10 天的日志--> <MaxHistory>${MAX_HISTORY}</MaxHistory> <!--當(dāng)天的日志大小超過 ${MAX_FILE_SIZE} 文件大小時(shí)候,新的內(nèi)容寫入新的文件, 默認(rèn)10MB--> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>${MAX_FILE_SIZE}</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!-- 輸出的日志內(nèi)容格式化--> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>${LOG_MSG}</pattern> </layout> </appender> <!-- 定義 ERROR 日志的輸出方式:--> <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 下面為配置只輸出error級(jí)別的日志 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <OnMismatch>DENY</OnMismatch> <OnMatch>ACCEPT</OnMatch> </filter> <!--日志文件路徑,日志文件名稱--> <File>${LOG_HOME}/err_${LOG_PREFIX}.log</File> <!-- 設(shè)置滾動(dòng)策略,當(dāng)天的日志大小超過 ${MAX_FILE_SIZE} 文件大小時(shí)候,新的內(nèi)容寫入新的文件, 默認(rèn)10MB --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件路徑,新的 ERR 日志文件名稱,“ i ” 是個(gè)變量 --> <FileNamePattern>${LOG_DIR}/err_${LOG_PREFIX}%i.log</FileNamePattern> <!-- 配置日志的滾動(dòng)時(shí)間 ,表示只保留最近 10 天的日志--> <MaxHistory>${MAX_HISTORY}</MaxHistory> <!--當(dāng)天的日志大小超過 ${MAX_FILE_SIZE} 文件大小時(shí)候,新的內(nèi)容寫入新的文件, 默認(rèn)10MB--> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>${MAX_FILE_SIZE}</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!-- 輸出的日志內(nèi)容格式化--> <layout class="ch.qos.logback.classic.PatternLayout"> <Pattern>${LOG_MSG}</Pattern> </layout> </appender> <!-- additivity 設(shè)為false,則logger內(nèi)容不附加至root ,配置以配置包下的所有類的日志的打印,級(jí)別是 ERROR--> <logger name="org.springframework" level="ERROR" /> <logger name="org.apache.commons" level="ERROR" /> <logger name="org.apache.zookeeper" level="ERROR" /> <logger name="com.alibaba.dubbo.monitor" level="ERROR"/> <logger name="com.alibaba.dubbo.remoting" level="ERROR" /> <!-- ${LOG_ROOT_LEVEL} 日志級(jí)別 --> <root level="${LOG_ROOT_LEVEL}"> <!-- 標(biāo)識(shí)這個(gè)"${STDOUT}"將會(huì)添加到這個(gè)logger --> <appender-ref ref="${STDOUT}"/> <!-- FILE_ALL 日志輸出添加到 logger --> <appender-ref ref="FILE_ALL"/> <!-- FILE_ERROR 日志輸出添加到 logger --> <appender-ref ref="FILE_ERROR"/> </root> </configuration>
Profile 相關(guān)的配置可以參考:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <include resource="org/springframework/boot/logging/logback/base.xml" /> <!-- roll by day --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logs/springboot-logback-demo.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender> <!-- dev --> <logger name="org.springframework.web" level="INFO"/> <root level="INFO"> <appender-ref ref="FILE" /> </root> <!-- test or production --> <springProfile name="test,prod"> <logger name="org.springframework.web" level="INFO"/> <logger name="com.pdai.springboot" level="INFO"/> <root level="INFO"> <appender-ref ref="FILE" /> </root> </springProfile> </configuration>
參考文檔
Logback官網(wǎng)
https://logback.qos.ch/manual/layouts.html#conversionWord
Logback官網(wǎng) 文檔
https://logback.qos.ch/manual/index.html
Logback中Encoder Pattern
<encoder> <pattern>%d{HH:mm:ss} [%thread][%X{traceId}] %-5level %logger{36} - %msg%n</pattern> </encoder>
https://logback.qos.ch/manual/layouts.html#conversionWord
代碼示例
@See https://github.com/realpdai/springboot-logback-demo
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)限定時(shí)間CountDownLatch并行場景
本文將結(jié)合實(shí)例代碼,介紹Java實(shí)現(xiàn)限定時(shí)間CountDownLatch并行場景,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07Mybatis-plus支持Gbase8s分頁的實(shí)現(xiàn)示例
本文主要介紹了Mybatis-plus支持Gbase8s分頁的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11spring注解 @PropertySource配置數(shù)據(jù)源全流程
這篇文章主要介紹了spring注解 @PropertySource配置數(shù)據(jù)源全流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03Java?數(shù)據(jù)結(jié)構(gòu)與算法系列精講之漢諾塔
漢諾塔是源于印度一個(gè)古老傳說的益智玩具。大梵天創(chuàng)造世界時(shí)做了三根石柱,在一根柱子上從下往上按大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規(guī)定,在小圓盤上不能放大圓盤,三根柱子之間一次只能移動(dòng)一個(gè)圓盤2022-02-02SpringBoot?Security使用MySQL實(shí)現(xiàn)驗(yàn)證與權(quán)限管理
安全管理是軟件系統(tǒng)必不可少的的功能。根據(jù)經(jīng)典的“墨菲定律”——凡是可能,總會(huì)發(fā)生。如果系統(tǒng)存在安全隱患,最終必然會(huì)出現(xiàn)問題,這篇文章主要介紹了SpringBoot安全管理Spring?Security基本配置2022-11-11java基礎(chǔ)之泛型知識(shí)點(diǎn)總結(jié)
這篇文章主要介紹了java基礎(chǔ)之泛型知識(shí)點(diǎn)總結(jié),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下2021-04-04