logback如果需要靈活的配置日志級別,需要結合過濾器,<filter></fiter>這個標簽。需要注意的是,過濾器過濾的基礎是在root標簽的配置基礎上進行的。
過濾器可以寫在appender標簽內,可以寫一個或多個,順序執行。過濾器會對每個級別的日志設置枚舉值,表示對日志的處理方式。
DENY:日志將立即被拋棄不再經過其他過濾器;
NEUTRAL:有序列表里的下個過濾器過接着處理日志;(該級別既不處理,也不拋棄,相當於沒有任何處理,日志會被保存下來並在本appender被執行)
ACCEPT:日志會被立即處理,不再經過剩余過濾器。
下面講述兩個常用的filter:
1、級別過濾器
LevelFilter: 級別過濾器,對特定某個級別的日志進行過濾。
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!-- 控制台輸出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!-- 1格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符--> <pattern></pattern> <charset>utf-8</charset> </encoder> <!-- 過濾掉非info的日志 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 日志級別排序為: TRACE < DEBUG < INFO < WARN < ERROR --> <!-- 日志輸出級別 --> <root level="DEBUG"> <appender-ref ref="STDOUT" /> <appender-ref ref="FILE" /> </root> </configuration>
level:日志級別。
onMatch:對符合過濾級別的日志的操作。(DENY,NEUTRAL,ACCEPT)
onMismatch:對不符合過濾級別的日志的操作。(DENY,NEUTRAL,ACCEPT)
測試代碼:
package com.dbzx.controller; import java.util.Date; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.dbzx.common.ResultModel; @Controller public class HelloController { Logger logger = LoggerFactory.getLogger(HelloController.class); @ResponseBody @RequestMapping("/hello") public ResultModel hello() { logger.trace("*****************trace**********"); logger.debug("*************debug*************"); logger.info("**************info****************"); logger.warn("****************warn***************"); logger.error("****************error*************"); return ResultModel.ok("hello,dbzx"+new Date().getTime()); } }
結果:
2019-05-30 17:21:19.413 [http-nio-8888-exec-1] INFO com.dbzx.controller.HelloController - **************info****************
過濾器的配置在配置級別的基礎上過濾,即root標簽的配置級別。本例中,是對大於等於debug級別的日志過濾。
ps:如果修改onMismatch參數為NEUTRAL。
<filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>NEUTRAL</onMismatch> </filter>
結果:
2019-05-30 17:25:08.045 [http-nio-8888-exec-1] DEBUG com.dbzx.controller.HelloController - *************debug*************
2019-05-30 17:25:08.045 [http-nio-8888-exec-1] INFO com.dbzx.controller.HelloController - **************info****************
2019-05-30 17:25:08.045 [http-nio-8888-exec-1] WARN com.dbzx.controller.HelloController - ****************warn***************
2019-05-30 17:25:08.046 [http-nio-8888-exec-1] ERROR com.dbzx.controller.HelloController - ****************error*************
結果就是:出了info級別,debug、warn、error級別的日志也會被打印,即不符合配置級別的日志,同樣被執行。
2、臨界值過濾器
ThresholdFilter: 臨界值過濾器,過濾掉低於指定臨界值的日志。
它沒有過多的參數,只有默認配置。當日志級別等於或高於臨界值時,過濾器返回NEUTRAL;當日志級別低於臨界值時,日志返回DENY。
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!-- 控制台輸出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!-- 1格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符--> <pattern></pattern> <charset>utf-8</charset> </encoder> <!--臨界值日志過濾級別配置 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"><!-- 只打印DEBUG日志 --> <!-- 在日志配置級別的基礎上過濾掉info級別以下的日志 --> <level>INFO</level> </filter> </appender> </appender> <!-- 日志級別排序為: TRACE < DEBUG < INFO < WARN < ERROR --> <!-- 日志輸出級別 --> <root level="DEBUG"> <appender-ref ref="STDOUT" /> <appender-ref ref="FILE" /> </root> </configuration>
結果:
2019-05-30 17:26:42.755 [http-nio-8888-exec-1] INFO com.dbzx.controller.HelloController - **************info****************
2019-05-30 17:26:42.755 [http-nio-8888-exec-1] WARN com.dbzx.controller.HelloController - ****************warn***************
2019-05-30 17:26:42.756 [http-nio-8888-exec-1] ERROR com.dbzx.controller.HelloController - ****************error*************
在debug配置級別的基礎上,過濾掉info一下的日志。最終,info及大於info級別的日志打印的控制台,info以下,debug及debug以上的日志,被拋棄掉。