Logback 是一個基于 Java 的日志(zhi)框(kuang)(kuang)架(jia),被廣泛應用于 Java 應用程序中。它是 Log4j 框(kuang)(kuang)架(jia)的改進版,提供了高度可配置的日志(zhi)記(ji)錄(lu)功(gong)能(neng),具有靈活(huo)性和性能(neng)優(you)勢(shi)
Logback 包含(han)了三個主(zhu)要(yao)的組件:Logger、Appender 和(he) Layout。Logger 用(yong)于創建日志記(ji)錄器,Appender 用(yong)于定義日志輸出的目(mu)標,而 Layout 則定義了日志的格式(shi)。
以下是 Logback 的(de)一(yi)些主要特點(dian):
-
高度可配置(zhi):Logback 允許(xu)通過 XML 配置(zhi)文件或者編程方(fang)式進(jin)行靈(ling)活的(de)(de)配置(zhi)。你可以定義日(ri)志輸(shu)出的(de)(de)級(ji)別、輸(shu)出目標、格式等等。
-
繼承 Log4j:Logback 被設計為 Log4j 的直(zhi)接替代(dai)品,可(ke)以無縫遷移(yi)現(xian)有(you)的 Log4j 配置(zhi)文件到(dao) Logback。
-
低(di)開銷:Logback 在(zai)設計上盡量減少對(dui)系(xi)統(tong)性(xing)能的(de)影響,具有高(gao)效(xiao)的(de)異步日志記(ji)錄機(ji)制(zhi)和線程安(an)全性(xing)。
-
支持多(duo)種(zhong)輸出:Logback 提(ti)供了多(duo)種(zhong) Appender,包(bao)括 ConsoleAppender、FileAppender、SocketAppender 等,可以將日志輸出到控制臺、文件、網絡等不同(tong)目標。
-
靈活的過(guo)濾(lv)(lv)器:Logback 允許通過(guo)過(guo)濾(lv)(lv)器機制對日志(zhi)(zhi)進(jin)行過(guo)濾(lv)(lv)和(he)處理,你可以根據日志(zhi)(zhi)級別、關鍵字等條件(jian)來過(guo)濾(lv)(lv)日志(zhi)(zhi)記錄(lu)。
-
SLF4J 兼容(rong):Logback 與 SLF4J(Simple Logging Facade for Java)框(kuang)架無縫集成,SLF4J 提(ti)供了一(yi)個統(tong)一(yi)的日志門面,使(shi)得(de)應用程序(xu)可以方便(bian)地切換日志框(kuang)架而不需要修(xiu)改(gai)代碼。
下(xia)面(mian)是(shi)logba.xml配置文件引入java后臺的流(liu)程和配置詳解(jie):
1查找默認配置文件
logback默(mo)認(ren)會查找以下文件(jian)
logback-test.xml
logback.groovy
logback.xml
2 配置節點
2.1 根節點<configuration>
根節點包含以下屬性
- scan: 當此屬性設置為true時,配置文件如果發生改變,將會被重新加載,默認值為true。
- scanPeriod: 設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan為true時,此屬性生效。默認的時間間隔為1分鐘。
- debug: 當此屬性設置為true時,將打印出logback內部日志信息,實時查看logback運行狀態。默認值為false。
<?xml version="1.0" encoding="UTF-8"?><!-- scan : 當此屬性設置為true時,配置文件如果發生改變,將會被重新加載,默認值為true--><configuration scan="false" scanPeriod="60 seconds" debug="false"></configuration> |
2.2 子節點<appender>
負(fu)責寫日志的組件,它有兩個必(bi)要屬(shu)性name和class。name指(zhi)定appender名稱,class指(zhi)定appender的全(quan)限定名。
appender實現類有以下幾種。
1. ConsoleAppender 日志輸出到控制臺
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>stdout %d %p - %m%n</pattern> </encoder></appender> |
2. FileAppender 日志添加(jia)到(dao)文(wen)件(jian)(靜態(tai)文(wen)件(jian))
- <file>:被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創建,沒有默認值。
- <append>:如果是 true,日志被追加到文件結尾,如果是 false,清空現存文件,默認是true。
- <encoder>:對記錄事件進行格式化。(具體參數稍后講解 )
- <prudent>:如果是 true,日志會被安全的寫入文件,即使其他的FileAppender也在向此文件做寫入操作,效率低,默認是 false。
<appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>testFile.log</file> <append>true</append> <encoder> <pattern>%d %p - %m%n</pattern> </encoder></appender> |
3. RollingFileAppender(動態文件)
RollingFileAppender滾動記錄(lu)文(wen)件(jian)(jian),先將日志(zhi)記錄(lu)到指定文(wen)件(jian)(jian),當符(fu)合某個條件(jian)(jian)時,將日志(zhi)記錄(lu)到其(qi)他(ta)文(wen)件(jian)(jian)。
- <file>:被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創建,沒有默認值。
- <append>:如果是 true,日志被追加到文件結尾,如果是 false,清空現存文件,默認是true。
- <rollingPolicy>:當發生滾動時,決定RollingFileAppender的行為,涉及文件移動和重命名。屬性class定義具體的滾動策略類。
rollingPolicy有一些(xie)策略:
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy": 最(zui)常用的滾(gun)動策略,它根(gen)據時間來制(zhi)定滾(gun)動策略,既負責滾(gun)動也負責出發滾(gun)動。
- <fileNamePattern>:必要節點,包含文件名及“%d”轉換符,“%d”可以包含一個java.text.SimpleDateFormat指定的時間格式,如:%d{yyyy-MM}。
- <maxHistory>:日志文件保留天數
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy": 查看當前(qian)活動文(wen)件的大小,如果(guo)超(chao)過指定大小會(hui)告知RollingFileAppender 觸發當前(qian)活動文(wen)件滾動
- <maxFileSize>:這是活動文件的大小,默認值是10MB。
- <prudent>:當為true時,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有兩個限制,1不支持也不允許文件壓縮,2不能設置file屬性,必須留空。
- <triggeringPolicy >: 告知 RollingFileAppender 合適激活滾動。
class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy" 根據(ju)固(gu)定窗(chuang)口(kou)算法重命(ming)名文件的滾動策略
- <minIndex>:窗口索引最小值
- <maxIndex>:窗口索引最大值,當用戶指定的窗口過大時,會自動將窗口設置為12。
- <fileNamePattern>:必須包含“%i”例如,假設最小值和最大值分別為1和2,命名模式為 mylog%i.log,會產生歸檔文件mylog1.log和mylog2.log。還可以指定文件壓縮選項,例如,mylog%i.log.gz 或者 沒有log%i.log.zip
<appender name="STDFILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>log.txt</file><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- 每天一歸檔 --> <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern> <!-- 單個日志文件最多 100MB, 60天的日志周期,最大不能超過20GB,窗口大小是1到3,當保存了3個歸檔文件后,將覆蓋最早的日志 --> <maxFileSize>100MB</maxFileSize> <maxHistory>60</maxHistory> <totalSizeCap>20GB</totalSizeCap> <minIndex>1</minIndex> <maxIndex>3</maxIndex></rollingPolicy><encoder> <pattern>%msg%n</pattern></encoder></appender> |
2.3.root節點,必選節點
<root level="INFO"> <appender-ref ref="CONSOLE"/> <appender-ref ref="INFO_FILE"/> <appender-ref ref="WARN_FILE"/> <appender-ref ref="ERROR_FILE"/></root> |
2.4 logger節點,可選節點
name:用來(lai)指定(ding)受(shou)此(ci)logger約(yue)束(shu)的(de)某一個(ge)包或者具體的(de)某一個(ge)類。
level:用來設置打印級別,大小寫(xie)無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
additivity:是(shi)否繼承(cheng)root節點(dian),默認是(shi)true繼承(cheng)。默認情況下子(zi)Logger會繼承(cheng)父(fu)Logger的(de)appender,也就是(shi)說(shuo)子(zi)Logger會在(zai)(zai)父(fu)Logger的(de)appender里輸(shu)出(chu)(chu)。若(ruo)是(shi)additivity設(she)為false,則子(zi)Logger只(zhi)會在(zai)(zai)自己的(de)appender里輸(shu)出(chu)(chu),而不會在(zai)(zai)父(fu)Logger的(de)appender里輸(shu)出(chu)(chu)。
2.5. 子節點<property>
用(yong)來定義變(bian)量值,它有兩個(ge)屬性name和value,通過(guo)<property>定義的值會被插入到logger上下文中,可以使“${}”來使用(yong)變(bian)量。
<property name="log.path" value="logs"></property> |
2.6子節點<contextName>
用來(lai)設(she)置(zhi)上(shang)下(xia)(xia)文(wen)名稱(cheng),每個(ge)logger都關(guan)聯到logger上(shang)下(xia)(xia)文(wen),默認上(shang)下(xia)(xia)文(wen)名稱(cheng)為(wei)default。但可以使用<contextName>設(she)置(zhi)成其他名字,用于區分(fen)不(bu)同應(ying)用程序(xu)的記(ji)錄。一旦設(she)置(zhi),不(bu)能修改(gai)。
<configuration scan="true" scanPeriod="60 seconds" debug="false"> <contextName>myApp</contextName> <!--其他配置省略--></configuration> |
3.完整的Logback.xml
<?xml version="1.0" encoding="UTF-8"?><configuration scan="true" scanPeriod="60 seconds" debug="false"> <!-- 日志上下文名稱 --> <contextName>realtime-flink</contextName> <!-- 日志輸出編碼 --> <property name="log.charset" value="utf-8"/> <!-- 日志存放路徑 --> <property name="log.path" value="logs"/> <!-- 日志輸出格式 --> <property name="log.pattern" value="%black(%contextName-) %red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %gray(%msg%n)"/> <!-- 控制臺輸出 --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${log.pattern}</pattern> </encoder> </appender> <!-- 系統日志輸出 --> <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/info.log</file> <!-- 循環政策:基于時間創建日志文件 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 日志文件名格式 --> <fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern> <!-- 日志最大的歷史 180天 --> <maxHistory>180</maxHistory> </rollingPolicy> <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"> <providers> <pattern> <pattern>{"log":"%date{yyyy-MM-dd HH:mm:ss.SSS}[%thread] %level %logger:%method:%line - %message", "time":"%date{yyyy-MM-dd HH:mm:ss.SSS}", "stream":"file"}%n </pattern> </pattern> </providers> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!-- 過濾的級別 --> <level>INFO</level> <!-- 匹配時的操作:接收(記錄) --> <onMatch>ACCEPT</onMatch> <!-- 不匹配時的操作:拒絕(不記錄) --> <onMismatch>DENY</onMismatch> </filter> </appender> <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/error.log</file> <!-- 循環政策:基于時間創建日志文件 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 日志文件名格式 --> <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern> <!-- 日志最大的歷史 180天 --> <maxHistory>180</maxHistory> </rollingPolicy> <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"> <providers> <pattern> <pattern>{"log":"%date{yyyy-MM-dd HH:mm:ss.SSS}[%thread] %level %logger:%method:%line - %message", "time":"%date{yyyy-MM-dd HH:mm:ss.SSS}", "stream":"file"}%n </pattern> </pattern> </providers> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!-- 過濾的級別 --> <level>ERROR</level> <!-- 匹配時的操作:接收(記錄) --> <onMatch>ACCEPT</onMatch> <!-- 不匹配時的操作:拒絕(不記錄) --> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 系統模塊日志級別控制 TODO 生產改成info --> <logger name="cn.ctyun.bigdata" level="debug"/> <!-- Spring日志級別控制 --> <logger name="org.springframework" level="warn"/> <!--系統調試日志--> <root level="info"> <appender-ref ref="console"/> </root> <!--系統操作日志--> <root level="info"> <appender-ref ref="file_info"/> <appender-ref ref="file_error"/> </root> <!--監控sql日志輸出 TODO 生產可以改成OFF--> <logger name="jdbc.sqlonly" level="INFO" additivity="false"> <appender-ref ref="console"/> </logger> <logger name="jdbc.resultset" level="ERROR" additivity="false"> <appender-ref ref="console"/> </logger> <!-- 如想看到表格數據,將OFF改為INFO --> <logger name="jdbc.resultsettable" level="OFF" additivity="false"> <appender-ref ref="console"/> </logger> <logger name="jdbc.connection" level="OFF" additivity="false"> <appender-ref ref="console"/> </logger> <logger name="jdbc.sqltiming" level="OFF" additivity="false"> <appender-ref ref="console"/> </logger> <logger name="jdbc.audit" level="OFF" additivity="false"> <appender-ref ref="console"/> </logger></configuration> |