使用Logback設置日志級別
Logback設置日志級別
使用Logback設置日志的設置方式現在已經有很多文章說明,本文重點說明不同設置方式的區別和用途。首先列舉常用的三種方式,接下來說明其區別。
appender中的LevelFilter:
級別過濾器,根據日志級別進行過濾。如果日志級別等於配置級別,過濾器會根據onMath 和 onMismatch接收或拒絕日志
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> ... </appender>
appender中的ThresholdFilter:
臨界值過濾器,過濾掉低於指定臨界值的日志。當日志級別等於或高於臨界值時,過濾器返回NEUTRAL。跟LevelFilter的區別在於一個是區間,一個是單點。
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <!-- 過濾掉 TRACE 和 DEBUG 級別的日志--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> ... </appender>
logger中的Level:
用來設置指定名稱的日志級別,如果不設定,那麼采用父類的level,最頂級的父類是ROOT,一般用來調整指定類的日志級別,其規則為等於或者高於設定level的日志才可能輸出(註意是可能,因為還要看appender的設置)
<logger level="TRACE" name="com.test.pk1"/>
那麼以上幾種應該如何使用,如何生效?
如何生效:可以這樣理解日志的處理流水線:
先判斷logger的level,如果不滿足直接丟棄不打印,如果滿足進入下一步
1、找到關聯的appender,根據appender的filter對日志進行過濾
2、如何應用:通過logger設置日志的level比較常見,也比較容易理解。既然已經能夠通過logger的level控制日志按照級別輸出,appender的filter什麼時候用?
主要應用的場景是:按照日志級別保存不同的文件。比如等於或高於error級別保存到log_error.log文件,等於或高於warn級別保存到log_warn.log文件(深究一下:為什麼要按照級別保存不同的文件?方便發現問題,因為實際應用中DEBUG級別的日志量往往很大,通過日志分級別保存,可以直接看error級別的日志,快速發現問題)。
Example:
<appender class="ch.qos.logback.core.rolling.RollingFileAppender" name="WarnLogFile"> ... <file>${LOGS_DIR}/log-warn.log</file> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>WARN</level> </filter> ... </appender> <appender class="ch.qos.logback.core.rolling.RollingFileAppender" name="InfoLogFile"> ... <file>${LOGS_DIR}/log-info.log</file> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> ... </appender> <appender class="ch.qos.logback.core.rolling.RollingFileAppender" name="DebugLogFile"> ... <file>${LOGS_DIR}/log-debug.log</file> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>DEBUG</level> </filter> ... </appender>
Logback日志-分日志等級別輸出
一 logback的介紹
Logback是由log4j創始人設計的另一個開源日志組件,官方網站: http://logback.qos.ch。它當前分為下面下個模塊:
logback-core
:其它兩個模塊的基礎模塊logback-classic
:它是log4j的一個改良版本,同時它完整實現瞭slf4j API使你可以很方便地更換成其它日志系統如log4j或JDK14 Logginglogback-access
:訪問模塊與Servlet容器集成提供通過Http來訪問日志的功能
二 logback的配置介紹
Logger、appender及layout
Logger作為日志的記錄器,把它關聯到應用的對應的context上後,主要用於存放日志對象,也可以定義日志類型、級別。
Appender主要用於指定日志輸出的目的地,目的地可以是控制臺、文件、遠程套接字服務器、 MySQL、PostreSQL、 Oracle和其他數據庫、 JMS和遠程UNIX Syslog守護進程等。
Layout 負責把事件轉換成字符串,格式化的日志信息的輸出。
logger context
各個logger 都被關聯到一個 LoggerContext,LoggerContext負責制造logger,也負責以樹結構排列各logger。其他所有logger也通過org.slf4j.LoggerFactory 類的靜態方法getLogger取得。 getLogger方法以 logger名稱為參數。用同一名字調用LoggerFactory.getLogger 方法所得到的永遠都是同一個logger對象的引用。
有效級別及級別的繼承
Logger 可以被分配級別。級別包括:TRACE、DEBUG、INFO、WARN 和 ERROR,定義於ch.qos.logback.classic.Level類。如果 logger沒有被分配級別,那麼它將從有被分配級別的最近的祖先那裡繼承級別。root logger 默認級別是 DEBUG。
打印方法與基本的選擇規則
打印方法決定記錄請求的級別。例如,如果 L 是一個 logger 實例,那麼,語句 L.info(“…”)是一條級別為 INFO的記錄語句。記錄請求的級別在高於或等於其 logger 的有效級別時被稱為被啟用,否則,稱為被禁用。記錄請求級別為 p,其 logger的有效級別為 q,隻有則當 p>=q時,該請求才會被執行。
該規則是 logback 的核心。級別排序為: TRACE < DEBUG < INFO < WARN < ERROR
分日志等級別輸出
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--定義日志文件的存儲地址 勿在 LogBack 的配置中使用相對路徑--> <property name="LOG_HOME" value="log"/> <property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{TRACE_ID}] %-5level %logger{20}[%L] - %msg%n"/> <!-- 控制臺輸出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符--> <pattern>${PATTERN}</pattern> <!-- 設置輸出字符集編碼 --> <charset>UTF-8</charset> </encoder> </appender> <!-- 按照每天生成日志文件 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <append>true</append> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件輸出的文件名--> <FileNamePattern>${LOG_HOME}/log.%d{yyyy-MM-dd}.log</FileNamePattern> <!--日志文件保留天數--> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符--> <pattern>${PATTERN}</pattern> <!-- 設置輸出字符集編碼 --> <charset>UTF-8</charset> </encoder> <!--日志文件最大的大小--> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>50MB</MaxFileSize> </triggeringPolicy> </appender> <!-- ERROR 文件輸出日志 --> <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>${LOG_HOME}/log_error.log</File> <append>true</append> <prudent>false</prudent> <!-- 日志文件rolling策略 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>${LOG_HOME}/log_error_%d{yyyy-MM-dd}.log.gz</FileNamePattern> <!-- 日志在磁盤上保留天數 --> <maxHistory>30</maxHistory> </rollingPolicy> <!-- 過濾器,隻ACCEPT接收ERROR級別的日志,其它日志級別都DENY拒絕 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <!-- 日志輸出格式 --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${PATTERN}</pattern> </encoder> </appender> <!-- INFO 文件輸出日志 --> <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>${LOG_HOME}/log_info.log</File> <append>true</append> <prudent>false</prudent> <!-- 日志文件rolling策略 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>${LOG_HOME}/log_info_%d{yyyy-MM-dd}.log.gz</FileNamePattern> <!-- 日志在磁盤上保留天數 --> <maxHistory>30</maxHistory> </rollingPolicy> <!-- 過濾器,隻ACCEPT接收ERROR級別的日志,其它日志級別都DENY拒絕 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <!-- 日志輸出格式 --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${PATTERN}</pattern> </encoder> </appender> <!-- DEBUG 文件輸出日志 --> <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>${LOG_HOME}/log_debug.log</File> <append>true</append> <prudent>false</prudent> <!-- 日志文件rolling策略 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>${LOG_HOME}/log_debug_%d{yyyy-MM-dd}.log.gz</FileNamePattern> <!-- 日志在磁盤上保留天數 --> <maxHistory>30</maxHistory> </rollingPolicy> <!-- 過濾器,隻ACCEPT接收ERROR級別的日志,其它日志級別都DENY拒絕 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>DEBUG</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <!-- 日志輸出格式 --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${PATTERN}</pattern> </encoder> </appender> <!-- 把日志異步輸出到磁盤文件中,避免每次都進行磁盤IO操作 --> <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"> <discardingThreshold>0</discardingThreshold> <queueSize>10000</queueSize> <appender-ref ref="FILE" /> </appender> <!-- 日志輸出級別 --> <root level="INFO"> <appender-ref ref="STDOUT"/> <!-- <appender-ref ref="ASYNC"/>--> <!-- <appender-ref ref="ERROR_FILE"/>--> <!-- <appender-ref ref="INFO_FILE"/>--> <!-- <appender-ref ref="DEBUG_FILE"/>--> </root> </configuration>
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- SpringBoot配置logback.xml 多環境的操作步驟
- Springboot內外部logback多環境配置詳解
- SpringBoot項目讀取外置logback配置文件的問題及解決
- 使用logback實現按自己的需求打印日志到自定義的文件裡
- Spring Boot console log 格式自定義方式