首先,看一段真實的配置html
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>
輸出到控制檯spring
輸出到文件sql
RollingFileAppender繼承自FileAppender,並有滾動日誌文件的能力。express
RollingFileAppender有兩個重要的組件。第一個組件是RollingPolicy,它決定怎樣滾動;第二個組件是TriggeringPolicy,它決定何時執行滾動。app
從字面上也很好理解,觸發策略決定何時發生滾動,而滾動策略則定義當滾動發生的時候作什麼。所以,RollingPolicy就是what,TriggeringPolicy就是when。ide
Thus, RollingPolicy is responsible for the what and TriggeringPolicy is responsible for the when. flex
TimeBasedRollingPolicy是最受歡迎的rolling策略。它是基於時間的,例如:按天或者按月。ui
有時候你可能但願按天歸檔文件,與此同時還想限制每一個日誌文件的大小。爲了達到這個目的,可使用SizeAndTimeBasedRollingPolicylua
注意,TimeBasedRollingPolicy已經運行你限制總的日誌文件大小。經過設置totalSizeCap。spa
Both the %i and %d tokens are mandatory.
注意,%i和%d是強制的。每次當前日誌達到maxFileSize時將被歸檔,而且帶一個自增的從0開始的index。
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這些都是有效的值,並且它們等價的。
Filter有三種回覆,分別是ACCEPT(接受)、NEUTRAL(不接受也不拒絕)、DENY(拒絕)。
LevelFilter是基於事件的級別來過濾的,若是事件的級別與配置的級別相等,接受或者拒絕這個事件取決於onMatch和onMismatch配置。
ThresholdFilter過濾器是基於threshold(閾值)過濾的。對於級別等於或者高於threshold的事件,當它的decide()方法被調用的時候ThresholdFilter過濾器將回復NEUTRAL。
級別低於threshold的事件將被拒絕。
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代碼塊。例如,下面是一個有效的表達式:
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