Logback配置

不要亂摸發表於2018-05-30

首先,看一段真實的配置

  1 <?xml version="1.0" encoding="UTF-8"?>
  2 <configuration debug="true">
  3     <springProperty scope="context" name="logLevel" source="log.level"/>
  4     <springProperty scope="context" name="logPath" source="log.path"/>
  5 
  6     <!-- 輸出格式 -->
  7     <property name="out.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] [%t] [%c][%L] - %m%n" />
  8     <!-- 活動檔案的大小 -->
  9     <property name="max.file.size" value="500MB"/>
 10     <!-- 保留的歸檔檔案的最大數量 -->
 11     <property name="max.history" value="30"/>
 12     <!-- 控制所有歸檔日誌檔案的總大小 -->
 13     <property name="total.size.cap" value="30GB"/>
 14 
 15     <!-- 控制檯 -->
 16     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
 17         <withJansi>true</withJansi>
 18         <encoder>
 19             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%highlight(%-5p)] [%t] [%cyan(%c)][%L] - %m%n</pattern>
 20         </encoder>
 21     </appender>
 22 
 23     <!-- DEBUG日誌 -->
 24     <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
 25         <file>${logPath}/debug.log</file>
 26         <filter class="ch.qos.logback.classic.filter.LevelFilter">
 27             <level>DEBUG</level>
 28             <onMatch>ACCEPT</onMatch>
 29             <onMismatch>DENY</onMismatch>
 30         </filter>
 31         <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
 32             <fileNamePattern>${logPath}/debug.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
 33             <maxFileSize>${max.file.size}</maxFileSize>
 34             <maxHistory>${max.history}</maxHistory>
 35             <totalSizeCap>${total.size.cap}</totalSizeCap>
 36         </rollingPolicy>
 37         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
 38             <pattern>${out.pattern}</pattern>
 39             <charset>UTF-8</charset>
 40         </encoder>
 41     </appender>
 42 
 43     <!-- INFO日誌 -->
 44     <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
 45         <file>${logPath}/info.log</file>
 46         <filter class="ch.qos.logback.classic.filter.LevelFilter">
 47             <level>INFO</level>
 48             <onMatch>ACCEPT</onMatch>
 49             <onMismatch>DENY</onMismatch>
 50         </filter>
 51         <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
 52             <fileNamePattern>${logPath}/info.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
 53             <maxFileSize>${max.file.size}</maxFileSize>
 54             <maxHistory>${max.history}</maxHistory>
 55             <totalSizeCap>${total.size.cap}</totalSizeCap>
 56         </rollingPolicy>
 57         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
 58             <pattern>${out.pattern}</pattern>
 59             <charset>UTF-8</charset>
 60         </encoder>
 61     </appender>
 62 
 63     <!-- ERROR日誌 -->
 64     <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
 65         <file>${logPath}/error.log</file>
 66         <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
 67             <level>ERROR</level>
 68         </filter>
 69         <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
 70             <fileNamePattern>${logPath}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
 71             <maxFileSize>${max.file.size}</maxFileSize>
 72             <maxHistory>${max.history}</maxHistory>
 73             <totalSizeCap>${total.size.cap}</totalSizeCap>
 74         </rollingPolicy>
 75         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
 76             <pattern>${out.pattern}</pattern>
 77             <charset>UTF-8</charset>
 78         </encoder>
 79     </appender>
 80 
 81     <!-- logger命中中包含Mapper的單獨輸出到一個檔案 -->
 82     <appender name="SQL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
 83         <file>${logPath}/sql.log</file>
 84         <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
 85             <evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
 86                 <expression>logger.contains("Mapper")</expression>
 87             </evaluator>
 88             <onMatch>ACCEPT</onMatch>
 89             <onMismatch>DENY</onMismatch>
 90         </filter>
 91         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
 92             <fileNamePattern>${logPath}/sql.%d{yyyy-MM-dd}.log</fileNamePattern>
 93             <maxHistory>${max.history}</maxHistory>
 94             <totalSizeCap>${total.size.cap}</totalSizeCap>
 95         </rollingPolicy>
 96         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
 97             <pattern>${out.pattern}</pattern>
 98         </encoder>
 99     </appender>
100 
101     <appender name="OTHER_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
102         <file>logFile.log</file>
103         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
104             <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
105             <maxHistory>${max.history}</maxHistory>
106             <totalSizeCap>${total.size.cap}</totalSizeCap>
107         </rollingPolicy>
108         <encoder>
109             <pattern>${out.pattern}</pattern>
110         </encoder>
111     </appender>
112 
113     <!-- com.ourhours.coupon.service包下的日誌都輸出到單獨一個檔案 -->
114     <logger name="com.ourhours.coupon.service" level="INFO">
115         <appender-ref ref="OTHER_FILE" />
116     </logger>
117 
118     <root level="${logLevel}">
119         <appender-ref ref="STDOUT" />
120         <appender-ref ref="DEBUG_FILE" />
121         <appender-ref ref="INFO_FILE" />
122         <appender-ref ref="ERROR_FILE" />
123         <appender-ref ref="SQL_FILE" />
124     </root>
125 
126 </configuration>

1. Appender

1.1. ConsoleAppender

輸出到控制檯

1.2. FileAppender

輸出到檔案

1.3. RollingFileAppender

RollingFileAppender繼承自FileAppender,並有滾動日誌檔案的能力。

RollingFileAppender有兩個重要的元件。第一個元件是RollingPolicy,它決定怎樣滾動;第二個元件是TriggeringPolicy,它決定什麼時候執行滾動。

從字面上也很好理解,觸發策略決定什麼時候發生滾動,而滾動策略則定義當滾動發生的時候做什麼。因此,RollingPolicy就是what,TriggeringPolicy就是when。

Thus, RollingPolicy is responsible for the what and TriggeringPolicy is responsible for the when. 

 

RollingPolicy

TimeBasedRollingPolicy

TimeBasedRollingPolicy是最受歡迎的rolling策略。它是基於時間的,例如:按天或者按月。

Size and time based rolling policy

有時候你可能希望按天歸檔檔案,與此同時還想限制每個日誌檔案的大小。為了達到這個目的,可以使用SizeAndTimeBasedRollingPolicy

注意,TimeBasedRollingPolicy已經執行你限制總的日誌檔案大小。通過設定totalSizeCap

Both the %i and %d tokens are mandatory.

注意,%i%d強制的。每次當前日誌達到maxFileSize時將被歸檔,並且帶一個自增的從0開始的index。

 

SizeBasedTriggeringPolicy

SizeBasedTriggeringPolicy只接受一個引數,引數的名字是maxFileSize,它的預設值是10MB

SizeBasedTriggeringPolicy accepts only one parameter, namely maxFileSize, with a default value of 10 MB. 

maxFileSize的單位可以是位元組,KB,MB,GB

例如:5000000,5000KB,5MB,2GB這些都是有效的值,而且它們等價的。

2. Filter

Filter有三種回覆,分別是ACCEPT(接受)、NEUTRAL(不接受也不拒絕)、DENY(拒絕)。

2.1. LevelFilter

LevelFilter是基於事件的級別來過濾的,如果事件的級別與配置的級別相等,接受或者拒絕這個事件取決於onMatchonMismatch配置。

2.2. ThresholdFilter

ThresholdFilter過濾器是基於threshold(閾值)過濾的。對於級別等於或者高於threshold的事件,當它的decide()方法被呼叫的時候ThresholdFilter過濾器將回復NEUTRAL。

級別低於threshold的事件將被拒絕。

2.3. EvaluatorFilter

EvaluatorFilterEventEvaluator的一個封裝。EventEvaluator會計算給定的事件是否滿足指定的條件。

通過指定onMatchonMismatch屬性,EvaluatorFilter將返回匹配還是不匹配。

注意,EventEvaluator是一個抽象類,你可以實現自己的邏輯。

JaninoEventEvaluator

JaninoEventEvaluatorEventEvaluator的一個具體實現。

JaninoEventEvaluator用任意的Java程式碼塊返回的一個boolean值作為條件計算的結果。我們把這種Java語音的boolean表示式稱之為“計算表示式”。計算表示式在計算過程中非常靈活。

JaninoEventEvaluator需要Janino庫。因此,為了使用JaninoEventEvaluator。我們需要引入一個jar包。

JaninoEventEvaluator taking an arbitrary Java language block returning a boolean value as the evaluation criteria.

We refer to such Java language boolean expressions as "evaluation expressions".

Evaluation expressions enable great flexibility in event filtering.

JaninoEventEvaluator requires the Janino library.

計算表示式在當前的日誌事件中被計算。為了能夠在計算表示式中訪問當前事件的屬性,Logback-classic自動將日誌事件的各種欄位匯出並作為變數以供計算表示式使用。

上面的計算表示式return message.contains("billing");返回一個boolean值。並且,給定的onMathch為DENY,onMismatch為NEUTRAL,那麼這個過濾器會丟棄所有message中包含billing的事件。

我發現,向上面這種貌似不用寫return也可以,就像下面這樣:

計算表示式可以是Java程式碼塊。例如,下面是一個有效的表示式:

3. Layout

3.1. 顏色

PatternLayout識別以下顏色:

"%black", "%red", "%green","%yellow","%blue", "%magenta","%cyan", "%white", "%gray", "%boldRed",

"%boldGreen", "%boldYellow", "%boldBlue", "%boldMagenta""%boldCyan", "%boldWhite","%highlight"

輸出效果如下

 

參考

https://logback.qos.ch/manual/layouts.html

https://logback.qos.ch/manual/appenders.html

https://logback.qos.ch/manual/filters.html

相關文章