關於logback日志級別的配置


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以上的日志,被拋棄掉。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM