首先,看一段真實的配置
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是基於事件的級別來過濾的,如果事件的級別與配置的級別相等,接受或者拒絕這個事件取決於onMatch和onMismatch配置。
2.2. ThresholdFilter
ThresholdFilter過濾器是基於threshold(閾值)過濾的。對於級別等於或者高於threshold的事件,當它的decide()方法被調用的時候ThresholdFilter過濾器將回復NEUTRAL。
級別低於threshold的事件將被拒絕。
2.3. EvaluatorFilter
EvaluatorFilter是EventEvaluator的一個封裝。EventEvaluator會計算給定的事件是否滿足指定的條件。
通過指定onMatch和onMismatch屬性,EvaluatorFilter將返回匹配還是不匹配。
注意,EventEvaluator是一個抽象類,你可以實現自己的邏輯。
JaninoEventEvaluator
JaninoEventEvaluator是EventEvaluator的一個具體實現。
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