一文讀懂Logback的配置
前言
文本已收錄至我的GitHub倉(cāng)庫(kù),歡迎Star:https://github.com/bin392328206/six-finger
種一棵樹最好的時(shí)間是十年前,其次是現(xiàn)在
絮叨
為啥想著寫這個(gè)呢?是這樣,小六六每次搭建系統(tǒng)的時(shí)候,都會(huì)涉及到這塊的配置嘛,然后我發(fā)現(xiàn)我搭建了這么多次的系統(tǒng),大部分的情況下,竟然是copy來(lái)完成的,然后這次搭建的過(guò)程中,又對(duì)這些配置又了點(diǎn)理解,所以打算給大家分享分享一些關(guān)鍵的點(diǎn),讓大家多Java 項(xiàng)目的日志有一些更加深入的理解吧!當(dāng)然這邊文章也得給大家清晰的理解logback的配置吧!盡量寫的直白點(diǎn)!文章打算沖以下幾個(gè)方面來(lái)描述
- 官網(wǎng)文檔
- logback.xml常用配置詳解
- 一個(gè)小案例加深對(duì)配置的理解
- logback.xml的參考配置(實(shí)戰(zhàn))
- 開發(fā)時(shí),小六六自己的一些特殊的用法(實(shí)戰(zhàn))
參考的文檔
開始就先給大家給貼下參考的文檔吧!不過(guò)我覺(jué)得你應(yīng)該不會(huì)去看,哈哈。我也是一樣的,看不下去官方文檔
logback.xml常用配置詳解
常用節(jié)點(diǎn)結(jié)構(gòu)圖:
相信大家對(duì)這個(gè)圖應(yīng)該不陌生,就是我們?cè)賡pring-logback.xml里面要配置的文件就是這幾個(gè)配置,下面我先來(lái)給大家講講細(xì)節(jié)
根節(jié)點(diǎn) configuration
包含下面三個(gè)屬性
- scan: 當(dāng)此屬性設(shè)置為true時(shí),配置文件如果發(fā)生改變,將會(huì)被重新加載,默認(rèn)值為true。
- scanPeriod: 設(shè)置監(jiān)測(cè)配置文件是否有修改的時(shí)間間隔,如果沒(méi)有給出時(shí)間單位,默認(rèn)單位是毫秒。當(dāng)scan為true時(shí),此屬性生效。默認(rèn)的時(shí)間間隔為1分鐘。
- debug: 當(dāng)此屬性設(shè)置為true時(shí),將打印出logback內(nèi)部日志信息,實(shí)時(shí)查看logback運(yùn)行狀態(tài)。默認(rèn)值為false。
- <configuration scan="true" scanPeriod="60 seconds" debug="false">
- <!--其他配置省略-->
- </configuration>
子節(jié)點(diǎn) appender
它的作用是負(fù)責(zé)寫日志的組件,它有兩個(gè)必要屬性name和class。name指定appender名稱,class指定appender的全限定名。
下面小六六帶大家來(lái)看看我們常見(jiàn)的幾種appender吧!工作上肯定用的到的
ConsoleAppender 把日志輸出到控制臺(tái)
encoder:對(duì)日志進(jìn)行格式化。
- <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
- <encoder>
- <pattern>${CONSOLE_LOG_PATTERN}</pattern>
- </encoder>
- </appender>
FileAppender:把日志添加到文件
- file:被寫入的文件名,可以是相對(duì)目錄,也可以是絕對(duì)目錄,如果上級(jí)目錄不存在會(huì)自動(dòng)創(chuàng)建,沒(méi)有默認(rèn)值。
- append:如果是 true,日志被追加到文件結(jié)尾,如果是 false,清空現(xiàn)存文件,默認(rèn)是true。
- encoder:對(duì)記錄事件進(jìn)行格式化。
- prudent:如果是 true,日志會(huì)被安全的寫入文件,即使其他的FileAppender也在向此文件做寫入操作,效率低,默認(rèn)是 false。
- <configuration>
- <appender name="FILE" class="ch.qos.logback.core.FileAppender">
- <file>testFile.log</file>
- <append>true</append>
- <encoder>
- <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
- </encoder>
- </appender>
- <root level="DEBUG">
- <appender-ref ref="FILE" />
- </root>
- </configuration>
RollingFileAppender 滾動(dòng)記錄文件,先將日志記錄到指定文件,當(dāng)符合某個(gè)條件時(shí),將日志記錄到其他文件 這個(gè)小六六覺(jué)得是用的最多的一個(gè)了
- file:被寫入的文件名,可以是相對(duì)目錄,也可以是絕對(duì)目錄,如果上級(jí)目錄不存在會(huì)自動(dòng)創(chuàng)建,沒(méi)有默認(rèn)值。
- append:如果是 true,日志被追加到文件結(jié)尾,如果是 false,清空現(xiàn)存文件,默認(rèn)是true。
- rollingPolicy:當(dāng)發(fā)生滾動(dòng)時(shí),決定RollingFileAppender的行為,涉及文件移動(dòng)和重命名。屬性class定義具體的滾動(dòng)策略類
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy":最常用的滾動(dòng)策略,它根據(jù)時(shí)間來(lái)制定滾動(dòng)策略,既負(fù)責(zé)滾動(dòng)也負(fù)責(zé)出發(fā)滾動(dòng)。
- <appender name="BILogger_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${log.path}/dataBi.dat</file>
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <fileNamePattern>${log.path}/dataBi.dat.%d{yyyyMMdd}.gz</fileNamePattern>
- <maxHistory>30</maxHistory>
- </rollingPolicy>
- <encoder>
- <charset>UTF-8</charset>
- <pattern>%date|%msg%n</pattern>
- </encoder>
- </appender>
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy":查看當(dāng)前活動(dòng)文件的大小,如果超過(guò)指定大小會(huì)告知RollingFileAppender 觸發(fā)當(dāng)前活動(dòng)文件滾動(dòng)
- <appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${log.path}/debug.log</file>
- <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
- <fileNamePattern>${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
- <maxFileSize>50MB</maxFileSize>
- <maxHistory>30</maxHistory>
- </rollingPolicy>
- <encoder>
- <pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
- </encoder>
- </appender>
子節(jié)點(diǎn) logger
用來(lái)設(shè)置某一個(gè)包或具體的某一個(gè)類的日志打印級(jí)別、以及指定。
- logger僅有一個(gè)name屬性,一個(gè)可選的level和一個(gè)可選的addtivity屬性
- 可以包含零個(gè)或多個(gè)元素,標(biāo)識(shí)這個(gè)appender將會(huì)添加到這個(gè)logger。
- name: 用來(lái)指定受此loger約束的某一個(gè)包或者具體的某一個(gè)類。
- level: 用來(lái)設(shè)置打印級(jí)別,大小寫無(wú)關(guān):TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,還有一個(gè)特殊值INHERITED或者同義詞NULL,代表強(qiáng)制執(zhí)行上級(jí)的級(jí)別。如果未設(shè)置此屬性,那么當(dāng)前l(fā)oger將會(huì)繼承上級(jí)的級(jí)別。
- addtivity: 是否向上級(jí)logger傳遞打印信息。默認(rèn)是true??梢园銈€(gè)或多個(gè)appender-ref素,標(biāo)識(shí)這個(gè)appender將會(huì)添加到這個(gè)logger。
- <!-- logger name 和spring配置一致 -->
- <logger name="BILogger" level="INFO" additivity="true">
- <appender-ref ref="BILogger_FILE" />
- </logger>
像我們的bi日志,一般這種標(biāo)準(zhǔn)化,流程化的日志。
子節(jié)點(diǎn)root
它也是logger元素,但是它是根loger,是所有的上級(jí)。只有一個(gè)level屬性,因?yàn)閚ame已經(jīng)被命名為"root",且已經(jīng)是最上級(jí)了。
- <root level="INFO">
- <appender-ref ref="console"/>
- <appender-ref ref="debug"/>
- <appender-ref ref="error"/>
- </root>
好了,上面就是我們比較重要的幾個(gè)元素了,還有一兩個(gè)小元素的話,小六六這邊就沒(méi)給大家看了。
logback.xml配置示例
- <?xml version="1.0" encoding="UTF-8"?>
- <configuration debug="false">
- <!--定義日志文件的存儲(chǔ)地址 勿在 LogBack 的配置中使用相對(duì)路徑-->
- <property name="LOG_HOME" value="/home" />
- <!--控制臺(tái)日志, 控制臺(tái)輸出 -->
- <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
- <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
- <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級(jí)別從左顯示5個(gè)字符寬度,%msg:日志消息,%n是換行符-->
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
- </encoder>
- </appender>
- <!--文件日志, 按照每天生成日志文件 -->
- <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <!--日志文件輸出的文件名-->
- <FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
- <!--日志文件保留天數(shù)-->
- <MaxHistory>30</MaxHistory>
- </rollingPolicy>
- <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
- <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級(jí)別從左顯示5個(gè)字符寬度%msg:日志消息,%n是換行符-->
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
- </encoder>
- <!--日志文件最大的大小-->
- <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
- <MaxFileSize>10MB</MaxFileSize>
- </triggeringPolicy>
- </appender>
- <!-- show parameters for hibernate sql 專為 Hibernate 定制 -->
- <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
- <logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
- <logger name="org.hibernate.SQL" level="DEBUG" />
- <logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
- <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
- <!--myibatis log configure-->
- <logger name="com.apache.ibatis" level="TRACE"/>
- <logger name="java.sql.Connection" level="DEBUG"/>
- <logger name="java.sql.Statement" level="DEBUG"/>
- <logger name="java.sql.PreparedStatement" level="DEBUG"/>
- <!-- 日志輸出級(jí)別 -->
- <root level="DEBUG">
- <appender-ref ref="STDOUT" />
- <appender-ref ref="FILE"/>
- </root>
- </configuration>
一個(gè)小案例加深對(duì)配置的理解
- <?xml version="1.0" encoding="UTF-8"?>
- <configuration debug="false">
- <!--定義日志文件的存儲(chǔ)地址 勿在 LogBack 的配置中使用相對(duì)路徑-->
- <property name="LOG_HOME" value="/home" />
- <!--控制臺(tái)日志, 控制臺(tái)輸出 -->
- <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
- <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
- <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級(jí)別從左顯示5個(gè)字符寬度,%msg:日志消息,%n是換行符-->
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
- </encoder>
- </appender>
- <!--文件日志, 按照每天生成日志文件 -->
- <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <!--日志文件輸出的文件名-->
- <FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
- <!--日志文件保留天數(shù)-->
- <MaxHistory>30</MaxHistory>
- </rollingPolicy>
- <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
- <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級(jí)別從左顯示5個(gè)字符寬度%msg:日志消息,%n是換行符-->
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
- </encoder>
- <!--日志文件最大的大小-->
- <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
- <MaxFileSize>10MB</MaxFileSize>
- </triggeringPolicy>
- </appender>
- <!-- show parameters for hibernate sql 專為 Hibernate 定制 -->
- <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
- <logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
- <logger name="org.hibernate.SQL" level="DEBUG" />
- <logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
- <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
- <!--myibatis log configure-->
- <logger name="com.apache.ibatis" level="TRACE"/>
- <logger name="java.sql.Connection" level="DEBUG"/>
- <logger name="java.sql.Statement" level="DEBUG"/>
- <logger name="java.sql.PreparedStatement" level="DEBUG"/>
- <!-- 日志輸出級(jí)別 -->
- <root level="DEBUG">
- <appender-ref ref="STDOUT" />
- <appender-ref ref="FILE"/>
- </root>
- </configuration>
開發(fā)時(shí),小六六自己的一些特殊的用法(實(shí)戰(zhàn))
- 第一個(gè),就是在日志的時(shí)候加上traceId,這樣的好處就是可以把日志收集到日志平臺(tái)的時(shí)候,可以很好的查到整個(gè)流程
- <!--輸出到日志平臺(tái) -->
- <appender name="GELF" class="de.siegmar.logbackgelf.GelfUdpAppender">
- <graylogHost>${graylogHost}</graylogHost>
- <graylogPort>${graylogPort}</graylogPort>
- <encoder class="de.siegmar.logbackgelf.GelfEncoder">
- <originHost>${originHost}</originHost>
- <includeRawMessage>false</includeRawMessage>
- <includeMarker>true</includeMarker>
- <includeMdcData>true</includeMdcData>
- <includeCallerData>false</includeCallerData>
- <includeRootCauseData>false</includeRootCauseData>
- <includeLevelName>true</includeLevelName>
- <shortPatternLayout class="ch.qos.logback.classic.PatternLayout">
- <pattern>%m%nopex</pattern>
- </shortPatternLayout>
- <fullPatternLayout class="ch.qos.logback.classic.PatternLayout">
- <pattern>%m%n</pattern>
- </fullPatternLayout>
- <staticField>app_name:${appName}</staticField>
- <staticField>app_version:${appVersion}</staticField>
- <staticField>os_arch:${os.arch}</staticField>
- <staticField>os_name:${os.name}</staticField>
- <staticField>os_version:${os.version}</staticField>
- <staticField>uri:%X{uri}</staticField>
- <staticField>uid:%X{uid}</staticField>
- <staticField>ip:%X{ip}</staticField>
- <staticField>traceId:%X{traceId}</staticField>
- </encoder>
- </appender>
其中的原理是通過(guò)MDC實(shí)現(xiàn)的
- 第二個(gè)就是,我們一些格式話的日志,做到數(shù)倉(cāng)里面
- <!-- BI操作日志-->
- <appender name="BILogger_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${log.path}/dataBi.dat</file>
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <fileNamePattern>${log.path}/dataBi.dat.%d{yyyyMMdd}.gz</fileNamePattern>
- <maxHistory>30</maxHistory>
- </rollingPolicy>
- <encoder>
- <charset>UTF-8</charset>
- <pattern>%date|%msg%n</pattern>
- </encoder>
- </appender>
- <!-- DI操作日志-->
- <appender name="DILogger_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${log.path}/dataDi.dat</file>
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <fileNamePattern>${log.path}/dataDi.dat.%d{yyyyMMdd}.gz</fileNamePattern>
- <maxHistory>30</maxHistory>
- </rollingPolicy>
- <encoder>
- <charset>UTF-8</charset>
- <pattern>%date|%msg%n</pattern>
- </encoder>
- </appender>
類似于這種。。
結(jié)束
我是小六六,三天打魚,兩天曬網(wǎng),今天就到這了哈!