从零开始玩转logback
為什么80%的碼農都做不了架構師?>>> ??
概述
LogBack是一個日志框架,它與Log4j可以說是同出一源,都出自Ceki Gülcü之手。(log4j的原型是早前由Ceki Gülcü貢獻給Apache基金會的)下載地址:http://logback.qos.ch/download.html
LogBack、Slf4j和Log4j之間的關系
Slf4j是The Simple Logging Facade for?Java的簡稱,是一個簡單日志門面抽象框架,它本身只提供了日志Facade API和一個簡單的日志類實現,一般常配合Log4j,LogBack,java.util.logging使用。Slf4j作為應用層的Log接入時,程序可以根據實際應用場景動態調整底層的日志實現框架(Log4j/LogBack/JdkLog…)。
LogBack和Log4j都是開源日記工具庫,LogBack是Log4j的改良版本,比Log4j擁有更多的特性,同時也帶來很大性能提升。詳細數據可參照下面地址:Reasons to prefer logback over log4j。
LogBack官方建議配合Slf4j使用,這樣可以靈活地替換底層日志框架。
TIPS:為了優化log4j,以及更大性能的提升,Apache基金會已經著手開發了log4j 2.0, 其中也借鑒和吸收了logback的一些先進特性,目前log4j2還處于beta階段。
LogBack的結構
LogBack被分為3個組件,logback-core, logback-classic 和 logback-access。
其中logback-core提供了LogBack的核心功能,是另外兩個組件的基礎。
logback-classic則實現了Slf4j的API,所以當想配合Slf4j使用時,需要將logback-classic加入classpath。
logback-access是為了集成Servlet環境而準備的,可提供HTTP-access的日志接口。
配置詳解
根節點<configuration>包含的屬性
- scan:當此屬性設置為true時,配置文件如果發生改變,將會被重新加載,默認值為true.
- scanPeriod:設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan為true時,此屬性生效。默認的時間間隔為1分鐘.
- debug:當此屬性設置為true時,將打印出logback內部日志信息,實時查看logback運行狀態。默認值為false。
XML代碼:
| 1 2 3 | <configuration scan="true" scanPeriod="60 second" debug="false">? ??????<!-- 其他配置省略-->? </configuration> |
根節點<configuration>的子節點
LogBack的配置大概包括3部分:appender, logger和root。
設置上下文名稱<contextName>
每個logger都關聯到logger上下文,默認上下文名稱為“default”。但可以使用<contextName>設置成其他名字,用于區分不同應用程序的記錄。一旦設置,不能修改。
XML代碼:
| 1 2 3 4 | <configuration scan="true" scanPeriod="60 second" debug="false">? ??????<contextName>myAppName</contextName>? ??????<!-- 其他配置省略-->? </configuration> |
設置變量 <property>
用來定義變量值的標簽,<property> 有兩個屬性,name和value;其中name的值是變量的名稱,value的值時變量定義的值。通過<property>定義的值會被插入到logger上下文中。定義變量后,可以使“${}”來使用變量。
例如使用<property>定義上下文名稱,然后在<contentName>設置logger上下文時使用。
| 1 2 3 4 5 | <configuration scan="true" scanPeriod="60 second" debug="false">? ??????<property name="APP_Name" value="myAppName" />?? ??????<contextName>${APP_Name}</contextName>? ??????<!-- 其他配置省略-->? </configuration> |
獲取時間戳字符串 <timestamp>
兩個屬性 key:標識此<timestamp> 的名字;datePattern:設置將當前時間(解析配置文件的時間)轉換為字符串的模式,遵循Java.txt.SimpleDateFormat的格式。
例如將解析配置文件的時間作為上下文名稱:
| 1 2 3 4 5 | <configuration scan="true" scanPeriod="60 second" debug="false">? ??????<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>?? ??????<contextName>${bySecond}</contextName>? ??????<!-- 其他配置省略-->? </configuration> |
設置logger和root
<logger>
用來設置某一個包或者具體的某一個類的日志打印級別、以及指定<appender>。<logger>僅有一個name屬性,一個可選的level和一個可選的addtivity屬性。
- name:用來指定受此logger約束的某一個包或者具體的某一個類。
- level:用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,還有一個特殊值INHERITED或者同義詞NULL,代表強制執行上級的級別。
如果未設置此屬性,那么當前logger將會繼承上級的級別。 - addtivity:是否向上級logger傳遞打印信息。默認是true。
<logger>可以包含零個或多個<appender-ref>元素,標識這個appender將會添加到這個logger。
<root>
也是<logger>元素,但是它是根logger。只有一個level屬性,應為已經被命名為”root”.
- level:用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能設置為INHERITED或者同義詞NULL。默認是DEBUG。
<root>可以包含零個或多個<appender-ref>元素,標識這個appender將會添加到這個logger。
案例介紹
首先,Java類如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | package logback;? ? import org.slf4j.Logger;? import org.slf4j.LoggerFactory;? ? public class LogbackDemo {? ????private static Logger log = LoggerFactory.getLogger(LogbackDemo.class);? ????public static void main(String[] args) {? ????????log.trace("======trace");? ????????log.debug("======debug");? ????????log.info("======info");? ????????log.warn("======warn");? ????????log.error("======error");? ????}? } |
logback.xml配置文件
只配置root
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <configuration>?? ? ??<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">?? ????<!-- encoder 默認配置為PatternLayoutEncoder -->?? ????<encoder>?? ??????<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>?? ????</encoder>?? ??</appender>?? ? ??<root level="INFO">???????????? ????<appender-ref ref="STDOUT" />?? ??</root>???? ? ?</configuration> |
其中appender的配置表示打印到控制臺(稍后詳細講解appender )。<root level=”INFO”>將root的打印級別設置為“INFO”,指定了名字為“STDOUT”的appender。
當執行logback.LogbackDemo類的main方法時,root將級別為“INFO”及大于“INFO”的日志信息交給已經配置好的名為“STDOUT”的appender處理,“STDOUT”appender將信息打印到控制臺;
輸出結果:
| 1 2 3 | 13:30:38.484 [main] INFO? logback.LogbackDemo - ======info? 13:30:38.500 [main] WARN? logback.LogbackDemo - ======warn? 13:30:38.500 [main] ERROR logback.LogbackDemo - ======error |
帶有logger的配置,不指定級別,不指定appender
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <configuration>?? ? ??<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">?? ????<!-- encoder 默認配置為PatternLayoutEncoder -->?? ????<encoder>?? ??????<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>?? ????</encoder>?? ??</appender>?? ? ??<!-- logback為java中的包 -->?? ??<logger name="logback"/>?? ? ??<root level="DEBUG">???????????? ????<appender-ref ref="STDOUT" />?? ??</root>???? ? ?</configuration> |
其中appender的配置表示打印到控制臺。
輸出結果:
| 1 2 3 4 | 13:19:15.406 [main] DEBUG logback.LogbackDemo - ======debug? 13:19:15.406 [main] INFO? logback.LogbackDemo - ======info? 13:19:15.406 [main] WARN? logback.LogbackDemo - ======warn? 13:19:15.406 [main] ERROR logback.LogbackDemo - ======error |
<logger name=”logback” />將控制logback包下的所有類的日志的打印,但是并沒有設置打印級別,所以繼承他的上級<root>的日志級別“DEBUG”。
沒有設置addtivity,默認為true,將此logger的打印信息向上級傳遞。
沒有設置appender,此logger本身不打印任何信息。
<root level=”DEBUG”>將root的打印級別設置為“DEBUG”,指定了名字為“STDOUT”的appender。
當執行logback.LogbackDemo類的main方法時,因為LogbackDemo 在包logback中,所以首先執行<logger name=”logback” />,將級別為“DEBUG”及大于“DEBUG”的日志信息傳遞給root,本身并不打印。
root接到下級傳遞的信息,交給已經配置好的名為“STDOUT”的appender處理,“STDOUT”appender將信息打印到控制臺。
帶有多個logger的配置,指定級別,指定appender
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <configuration>?? ???<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">?? ????<!-- encoder 默認配置為PatternLayoutEncoder -->?? ????<encoder>?? ??????<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>?? ????</encoder>?? ??</appender>?? ? ??<!-- logback為java中的包 -->?? ??<logger name="logback"/>?? ??<!--logback.LogbackDemo:類的全路徑 -->?? ??<logger name="logback.LogbackDemo" level="INFO" additivity="false">? ????<appender-ref ref="STDOUT"/>? ??</logger>?? ? ??<root level="ERROR">???????????? ????<appender-ref ref="STDOUT" />?? ??</root>???? </configuration> |
輸出結果:
| 1 2 3 | 14:05:35.937 [main] INFO? logback.LogbackDemo - ======info? 14:05:35.937 [main] WARN? logback.LogbackDemo - ======warn? 14:05:35.937 [main] ERROR logback.LogbackDemo - ======error |
<logger name=”logback” />將控制logback包下的所有類的日志的打印,但是并沒用設置打印級別,所以繼承他的上級<root>的日志級別“DEBUG”。
沒有設置addtivity,默認為true,將此logger的打印信息向上級傳遞。
沒有設置appender,此logger本身不打印任何信息。
<logger name=”logback.LogbackDemo” level=”INFO” additivity=”false”>控制logback.LogbackDemo類的日志打印,打印級別為“INFO”。
additivity屬性為false,表示此logger的打印信息不再向上級傳遞,指定了名字為“STDOUT”的appender。
<root level=”DEBUG”>將root的打印級別設置為“ERROR”,指定了名字為“STDOUT”的appender。
當執行logback.LogbackDemo類的main方法時,先執行<logger name=”logback.LogbackDemo” level=”INFO” additivity=”false”>,將級別為“INFO”及大于“INFO”的日志信息交給此logger指定的名為“STDOUT”的appender處理,在控制臺中打出日志,不再向次logger的上級 <logger name=”logback”/> 傳遞打印信息。
<logger name=”logback”/>未接到任何打印信息,當然也不會給它的上級root傳遞任何打印信息。
如果將<logger name=”logback.LogbackDemo” level=”INFO” additivity=”false”>修改為 <logger name=”logback.LogbackDemo” level=”INFO” additivity=”true”>那打印結果將是什么呢?
沒錯,日志打印了兩次,想必大家都知道原因了,因為打印信息向上級傳遞,logger本身打印一次,root接到后又打印一次:
| 1 2 3 4 5 6 | 14:09:01.531 [main] INFO? logback.LogbackDemo - ======info? 14:09:01.531 [main] INFO? logback.LogbackDemo - ======info? 14:09:01.531 [main] WARN? logback.LogbackDemo - ======warn? 14:09:01.531 [main] WARN? logback.LogbackDemo - ======warn? 14:09:01.531 [main] ERROR logback.LogbackDemo - ======error? 14:09:01.531 [main] ERROR logback.LogbackDemo - ======error |
<appender>詳解
<appender>是<configuration>的子節點,是負責寫日志的組件。<appender>有兩個必要屬性name和class。name指定appender名稱,class指定appender的全限定名。
ConsoleAppender
把日志添加到控制臺,有以下子節點:
- <encoder>:對日志進行格式化。(具體參數稍后講解 )
- <target>:字符串 System.out 或者 System.err ,默認 System.out .
| 1 2 3 4 5 6 7 8 9 10 11 | <configuration>? ??<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">? ????<encoder>? ??????<pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>? ????</encoder>? ??</appender>? ? ??<root level="DEBUG">? ????<appender-ref ref="STDOUT" />? ??</root>? </configuration> |
FileAppender
把日志添加到文件,有以下子節點:
- <file>:被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創建,沒有默認值。
- <append>:如果是 true,日志被追加到文件結尾,如果是 false,清空現存文件,默認是true。
- <encoder>:對記錄事件進行格式化。(具體參數稍后講解 )
- <prudent>:如果是 true,日志會被安全的寫入文件,即使其他的FileAppender也在向此文件做寫入操作,效率低,默認是 false。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | <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
滾動記錄文件,先將日志記錄到指定文件,當符合某個條件時,將日志記錄到其他文件。有以下子節點:
- <file>:被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創建,沒有默認值。
- <append>:如果是 true,日志被追加到文件結尾,如果是 false,清空現存文件,默認是true。
- <encoder>:對記錄事件進行格式化。(具體參數稍后講解 )
- <rollingPolicy>:當發生滾動時,決定 RollingFileAppender 的行為,涉及文件移動和重命名。
- <triggeringPolicy >: 告知 RollingFileAppender 何時激活滾動。
- <prudent>:當為true時,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有兩個限制,1不支持也不允許文件壓縮,2不能設置file屬性,必須留空。
>>>>rollingPolicy
- TimeBasedRollingPolicy: 最常用的滾動策略,它根據時間來制定滾動策略,既負責滾動也負責觸發滾動。有以下子節點:
<fileNamePattern>: 必要節點,包含文件名及“%d”轉換符,%d”可以包含一個Java.text.SimpleDateFormat指定的時間格式,如:%d{yyyy-MM}。如果直接使用 %d,默認格式是 yyyy-MM-dd。RollingFileAppender 的file字節點可有可無,通過設置file,可以為活動文件和歸檔文件指定不同位置,當前日志總是記錄到file指定的文件(活動文件),活動文件的名字不會改變;如果沒設置file,活動文件的名字會根據fileNamePattern 的值,每隔一段時間改變一次?!?”或者“\”會被當做目錄分隔符。
<maxHistory>: 可選節點,控制保留的歸檔文件的最大數量,超出數量就刪除舊文件。假設設置每個月滾動,且<maxHistory>是6,則只保存最近6個月的文件,刪除之前的舊文件。注意,刪除舊文件是,那些為了歸檔而創建的目錄也會被刪除。
- FixedWindowRollingPolicy: 根據固定窗口算法重命名文件的滾動策略。有以下子節點:
<minIndex>:窗口索引最小值。
<maxIndex>:窗口索引最大值,當用戶指定的窗口過大時,會自動將窗口設置為12。
<fileNamePattern >: 必須包含“%i”例如,假設最小值和最大值分別為1和2,命名模式為 mylog%i.log,會產生歸檔文件mylog1.log和mylog2.log。還可以指定文件壓縮選項,例如,mylog%i.log.gz 或者 沒有log%i.log.zip
>>>>triggeringPolicy
- SizeBasedTriggeringPolicy: 查看當前活動文件的大小,如果超過指定大小會告知RollingFileAppender 觸發當前活動文件滾動。只有一個節點:
<maxFileSize>:這是活動文件的大小,默認值是10MB。
例如:每天生產一個日志文件,保存30天的日志文件
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <configuration>?? ??<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">?? ? ????<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">?? ??????<fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>?? ??????<maxHistory>30</maxHistory>??? ????</rollingPolicy>?? ? ????<encoder>?? ??????<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>?? ????</encoder>?? ??</appender>??? ? ??<root level="DEBUG">?? ????<appender-ref ref="FILE" />?? ??</root>?? </configuration> |
又例如:按照固定窗口模式生成日志文件,當文件大于20MB時,生成新的日志文件。窗口大小是1到3,當保存了3個歸檔文件后,將覆蓋最早的日志。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <configuration>?? ??<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">?? ????<file>test.log</file>?? ? ????<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">?? ??????<fileNamePattern>tests.%i.log.zip</fileNamePattern>?? ??????<minIndex>1</minIndex>?? ??????<maxIndex>3</maxIndex>?? ????</rollingPolicy>?? ? ????<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">?? ??????<maxFileSize>5MB</maxFileSize>?? ????</triggeringPolicy>?? ????<encoder>?? ??????<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>?? ????</encoder>?? ??</appender>?? ? ??<root level="DEBUG">?? ????<appender-ref ref="FILE" />?? ??</root>?? </configuration> |
另外還有SocketAppender、SMTPAppender、DBAppender、SyslogAppender、SiftingAppender,并不常用,這些就不在這里講解了,大家可以參考官方文檔。當然大家可以編寫自己的Appender。
<encoder>
負責兩件事,一是把日志信息轉換成字節數組,二是把字節數組寫入到輸出流。
目前PatternLayoutEncoder 是唯一有用的且默認的encoder ,有一個<pattern>節點,用來設置日志的輸入格式。使用“%”加“轉換符”方式,如果要輸出“%”,則必須用“\”對“\%”進行轉義。
例如:
| 1 2 3 | <encoder>?? ???<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>?? </encoder> |
格式修飾符,與轉換符共同使用:
可選的格式修飾符位于“%”和轉換符之間。第一個可選修飾符是左對齊 標志,符號是減號“-”;接著是可選的最小寬度 修飾符,用十進制數表示。如果字符小于最小寬度,則左填充或右填充,默認是左填充(即右對齊),填充符為空格。如果字符大于最小寬度,字符永遠不會被截斷。最大寬度 修飾符,符號是點號”.”后面加十進制數。如果字符大于最大寬度,則從前面截斷。點符號“.”后面加減號“-”在加數字,表示從尾部截斷。
例如:%-4relative 表示,將輸出從程序啟動到創建日志記錄的時間 進行左對齊 且最小寬度為4。
完整配置案例
最后附上相對比較完整的,涵蓋大部分配置的案例,案例中有解析。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 | <?xml version="1.0" encoding="UTF-8"?> <!-- -scan:當此屬性設置為true時,配置文件如果發生改變,將會被重新加載,默認值為true -scanPeriod:設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。 -?????????? 當scan為true時,此屬性生效。默認的時間間隔為1分鐘 -debug:當此屬性設置為true時,將打印出logback內部日志信息,實時查看logback運行狀態。默認值為false。 - - configuration 子節點為 appender、logger、root --> <configuration scan="true" scanPeriod="60 second" debug="false"> ? ????<!-- 負責寫日志,控制臺日志 --> ????<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> ? ????????<!-- 一是把日志信息轉換成字節數組,二是把字節數組寫入到輸出流 --> ????????<encoder> ????????????<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%5level] [%thread] %logger{0} %msg%n</Pattern> ????????????<charset>UTF-8</charset> ????????</encoder> ????</appender> ? ????<!-- 文件日志 --> ????<appender name="DEBUG" class="ch.qos.logback.core.FileAppender"> ????????<file>debug.log</file> ????????<!-- append: true,日志被追加到文件結尾; false,清空現存文件;默認是true --> ????????<append>true</append> ????????<filter class="ch.qos.logback.classic.filter.LevelFilter"> ????????????<!-- LevelFilter: 級別過濾器,根據日志級別進行過濾 --> ????????????<level>DEBUG</level> ????????????<onMatch>ACCEPT</onMatch> ????????????<onMismatch>DENY</onMismatch> ????????</filter> ????????<encoder> ????????????<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%5level] [%thread] %logger{0} %msg%n</Pattern> ????????????<charset>UTF-8</charset> ????????</encoder> ????</appender> ? ????<!-- 滾動記錄文件,先將日志記錄到指定文件,當符合某個條件時,將日志記錄到其他文件 --> ????<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"> ????????<File>info.log</File> ? ????????<!-- ThresholdFilter:臨界值過濾器,過濾掉 TRACE 和 DEBUG 級別的日志 --> ????????<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> ????????????<level>INFO</level> ????????</filter> ? ????????<encoder> ????????????<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%5level] [%thread] %logger{0} %msg%n</Pattern> ????????????<charset>UTF-8</charset> ????????</encoder> ? ????????<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> ????????????<!-- 每天生成一個日志文件,保存30天的日志文件 ????????????- 如果隔一段時間沒有輸出日志,前面過期的日志不會被刪除,只有再重新打印日志的時候,會觸發刪除過期日志的操作。 ????????????--> ????????????<fileNamePattern>info.%d{yyyy-MM-dd}.log</fileNamePattern> ????????????<maxHistory>30</maxHistory> ????????????<TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> ????????????????<maxFileSize>100MB</maxFileSize> ????????????</TimeBasedFileNamingAndTriggeringPolicy> ????????</rollingPolicy> ????</appender > ? ????<!--<!– 異常日志輸出 –>--> ????<!--<appender name="EXCEPTION" class="ch.qos.logback.core.rolling.RollingFileAppender">--> ????????<!--<file>exception.log</file>--> ????????<!--<!– 求值過濾器,評估、鑒別日志是否符合指定條件. 需要額外的兩個JAR包,commons-compiler.jar和janino.jar –>--> ????????<!--<filter class="ch.qos.logback.core.filter.EvaluatorFilter">--> ????????????<!--<!– 默認為 ch.qos.logback.classic.boolex.JaninoEventEvaluator –>--> ????????????<!--<evaluator>--> ????????????????<!--<!– 過濾掉所有日志消息中不包含"Exception"字符串的日志 –>--> ????????????????<!--<expression>return message.contains("Exception");</expression>--> ????????????<!--</evaluator>--> ????????????<!--<OnMatch>ACCEPT</OnMatch>--> ????????????<!--<OnMismatch>DENY</OnMismatch>--> ????????<!--</filter>--> ? ????????<!--<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">--> ????????????<!--<!– 觸發節點,按固定文件大小生成,超過5M,生成新的日志文件 –>--> ????????????<!--<maxFileSize>5MB</maxFileSize>--> ????????<!--</triggeringPolicy>--> ????<!--</appender>--> ? ????<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> ????????<file>error.log</file> ? ????????<encoder> ????????????<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%5level] [%thread] %logger{0} %msg%n</Pattern> ????????????<charset>UTF-8</charset> ????????</encoder> ? ????????<!-- 按照固定窗口模式生成日志文件,當文件大于20MB時,生成新的日志文件。 ????????-??? 窗口大小是1到3,當保存了3個歸檔文件后,將覆蓋最早的日志。 ????????-??? 可以指定文件壓縮選項 ????????--> ????????<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> ????????????<fileNamePattern>error.%d{yyyy-MM}(%i).log.zip</fileNamePattern> ????????????<minIndex>1</minIndex> ????????????<maxIndex>3</maxIndex> ????????????<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> ????????????????<maxFileSize>100MB</maxFileSize> ????????????</timeBasedFileNamingAndTriggeringPolicy> ????????????<maxHistory>30</maxHistory> ????????</rollingPolicy> ????</appender> ? ????<!-- 異步輸出 --> ????<appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender"> ????????<!-- 不丟失日志.默認的,如果隊列的80%已滿,則會丟棄TRACT、DEBUG、INFO級別的日志 --> ????????<discardingThreshold >0</discardingThreshold> ????????<!-- 更改默認的隊列的深度,該值會影響性能.默認值為256 --> ????????<queueSize>512</queueSize> ????????<!-- 添加附加的appender,最多只能添加一個 --> ????????<appender-ref ref ="ERROR"/> ????</appender> ? ????<!-- ????- 1.name:包名或類名,用來指定受此logger約束的某一個包或者具體的某一個類 ????- 2.未設置打印級別,所以繼承他的上級<root>的日志級別“DEBUG” ????- 3.未設置addtivity,默認為true,將此logger的打印信息向上級傳遞; ????- 4.未設置appender,此logger本身不打印任何信息,級別為“DEBUG”及大于“DEBUG”的日志信息傳遞給root, ????-? root接到下級傳遞的信息,交給已經配置好的名為“STDOUT”的appender處理,“STDOUT”appender將信息打印到控制臺; ????--> ????<logger name="ch.qos.logback" /> ? ????<!-- ????- 1.將級別為“INFO”及大于“INFO”的日志信息交給此logger指定的名為“STDOUT”的appender處理,在控制臺中打出日志, ????-?? 不再向次logger的上級 <logger name="logback"/> 傳遞打印信息 ????- 2.level:設置打印級別(TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF),還有一個特殊值INHERITED或者同義詞NULL,代表強制執行上級的級別。 ????-??????? 如果未設置此屬性,那么當前logger將會繼承上級的級別。 ????- 3.additivity:為false,表示此logger的打印信息不再向上級傳遞,如果設置為true,會打印兩次 ????- 4.appender-ref:指定了名字為"STDOUT"的appender。 ????--> ????<logger name="com.weizhi.common.LogMain" level="INFO" additivity="false"> ????????<appender-ref ref="STDOUT"/> ????????<!--<appender-ref ref="DEBUG"/>--> ????????<!--<appender-ref ref="EXCEPTION"/>--> ????????<!--<appender-ref ref="INFO"/>--> ????????<!--<appender-ref ref="ERROR"/>--> ????????<appender-ref ref="ASYNC"/> ????</logger> ? ????<!-- ????- 根logger ????- level:設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能設置為INHERITED或者同義詞NULL。 ????-?????? 默認是DEBUG。 ????-appender-ref:可以包含零個或多個<appender-ref>元素,標識這個appender將會添加到這個logger ????--> ????<root level="DEBUG"> ????????<appender-ref ref="STDOUT"/> ????????<!--<appender-ref ref="DEBUG"/>--> ????????<!--<appender-ref ref="EXCEPTION"/>--> ????????<!--<appender-ref ref="INFO"/>--> ????????<appender-ref ref="ASYNC"/> ????</root> </configuration> |
其他鏈接
1. Java Logging
2. logback 常用配置詳解(二) <appender>
轉載于:https://my.oschina.net/elain/blog/861118
總結
以上是生活随笔為你收集整理的从零开始玩转logback的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面向过程和面向对象编程的优缺点
- 下一篇: zabbix_get 命令介绍