SpringCloud Logback日志配置


轉自:https://www.jianshu.com/p/c889b8431b06

springboot logback的源碼分析請參考這篇,講的很好:https://juejin.im/post/5cd0cdcc6fb9a0323120a3f4

一、日志常規配置

直接貼出logback-spring.xml,基本滿足了對日志的常規需求:
1、控制台日志(帶顏色顯示)
2、全部日志文件(包括全別日志級別的日志,每天一個,自動壓縮)
3、錯誤日志文件(僅抽取ERROR級別日志,每天一個,自動壓縮)

說明:
a. 日志存放目錄需要在application.yml中配置: logging: path: /data/logs/${spring.application.name}
b. 此配置文件可以自行擴展,比如增加elk輸出、調整日志級別、增加日志過濾等。不在本文討論訪問內。

<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <!-- 參考SpringBoot默認的logback配置,增加了error日志文件 --> <!-- org/springframework/boot/logging/logback/base.xml --> <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="LOG_PATH" value="${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}"/> <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-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{${LOG_DATEFORMAT_PATTERN:-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="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${CONSOLE_LOG_PATTERN}</pattern> </encoder> </appender> <!-- 全量日志 --> <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender"> <encoder> <pattern>${FILE_LOG_PATTERN}</pattern> </encoder> <file>${LOG_PATH}/all.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_PATH}/all.log.%d{yyyy-MM-dd}.%i.gz</fileNamePattern> <maxFileSize>${LOG_FILE_MAX_SIZE:-50MB}</maxFileSize> <maxHistory>${LOG_FILE_MAX_HISTORY:-0}</maxHistory> </rollingPolicy> </appender> <!-- 錯誤日志 --> <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <encoder> <pattern>${FILE_LOG_PATTERN}</pattern> </encoder> <file>${LOG_PATH}/err.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_PATH}/err.log.%d{yyyy-MM-dd}.%i.gz</fileNamePattern> <maxFileSize>${LOG_FILE_MAX_SIZE:-50MB}</maxFileSize> <maxHistory>${LOG_FILE_MAX_HISTORY:-0}</maxHistory> </rollingPolicy> <!-- 過濾出ERROR級別的日志 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 日志總開關 --> <root level="INFO"> <appender-ref ref="CONSOLE" /> <appender-ref ref="FILE_ALL" /> <appender-ref ref="FILE_ERROR" /> </root> <!-- 日志過濾 --> <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.eclipse.jetty.util.component.AbstractLifeCycle" level="ERROR"/> <logger name="org.hibernate.validator.internal.util.Version" level="WARN"/> </configuration> 

二、引入sleuth zipkin是怎么輸出traceId的?

一直有個疑問,為什么引入sleuth+zipkin之后,日志中會輸出traceId和spanId:

2019-06-11 16:16:00.117 INFO [test-project,29ce39ac8a54f753,29ce39ac8a54f753,false] 1636 --- [http-nio-12001-exec-2] ... 2019-06-11 16:16:00.332 INFO [test-project,29ce39ac8a54f753,29ce39ac8a54f753,false] 1636 --- [http-nio-12001-exec-2] ... 

從上面logback的配置文件FILE_LOG_PATTERN並未發現相關配置,其中必有妖怪!
通過分析引入的sleuth依賴,終於發現在spring-cloud-sleuth-core-xxx.jar找到,請看這個類

org.springframework.cloud.sleuth.autoconfig.TraceEnvironmentPostProcessor 

這段代碼在項目啟動階段,把環境變量logging.pattern.level替換了,增加了spring.application.nameX-B3-TraceIdX-B3-SpanId。實際上就是替換了環境變量LOG_LEVEL_PATTERN,再回到logback的配置文件FILE_LOG_PATTERN

${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}} 

其中${LOG_LEVEL_PATTERN:-%5p}就是引用了這個環境變量。

到此為止,是不是就完了呢?No~~!增加的spring.application.nameX-B3-TraceIdX-B3-SpanId的值從哪里來呢?繼續看代碼

org.springframework.cloud.sleuth.log.Slf4jCurrentTraceContext

這個類中通過MDC ( Mapped Diagnostic Contexts )的方式把traceId、spanId插入到日志內容中。



作者:假程序猿
鏈接:https://www.jianshu.com/p/c889b8431b06
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM