使用Logback設(shè)置日志級(jí)別
Logback設(shè)置日志級(jí)別
使用Logback設(shè)置日志的設(shè)置方式現(xiàn)在已經(jīng)有很多文章說明,本文重點(diǎn)說明不同設(shè)置方式的區(qū)別和用途。首先列舉常用的三種方式,接下來說明其區(qū)別。
appender中的LevelFilter:
級(jí)別過濾器,根據(jù)日志級(jí)別進(jìn)行過濾。如果日志級(jí)別等于配置級(jí)別,過濾器會(huì)根據(jù)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:
臨界值過濾器,過濾掉低于指定臨界值的日志。當(dāng)日志級(jí)別等于或高于臨界值時(shí),過濾器返回NEUTRAL。跟LevelFilter的區(qū)別在于一個(gè)是區(qū)間,一個(gè)是單點(diǎn)。
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!-- 過濾掉 TRACE 和 DEBUG 級(jí)別的日志-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
...
</appender>
logger中的Level:
用來設(shè)置指定名稱的日志級(jí)別,如果不設(shè)定,那么采用父類的level,最頂級(jí)的父類是ROOT,一般用來調(diào)整指定類的日志級(jí)別,其規(guī)則為等于或者高于設(shè)定level的日志才可能輸出(注意是可能,因?yàn)檫€要看appender的設(shè)置)
<logger level="TRACE" name="com.test.pk1"/>
那么以上幾種應(yīng)該如何使用,如何生效?
如何生效:可以這樣理解日志的處理流水線:
先判斷l(xiāng)ogger的level,如果不滿足直接丟棄不打印,如果滿足進(jìn)入下一步
1、找到關(guān)聯(lián)的appender,根據(jù)appender的filter對日志進(jìn)行過濾
2、如何應(yīng)用:通過logger設(shè)置日志的level比較常見,也比較容易理解。既然已經(jīng)能夠通過logger的level控制日志按照級(jí)別輸出,appender的filter什么時(shí)候用?
主要應(yīng)用的場景是:按照日志級(jí)別保存不同的文件。比如等于或高于error級(jí)別保存到log_error.log文件,等于或高于warn級(jí)別保存到log_warn.log文件(深究一下:為什么要按照級(jí)別保存不同的文件?方便發(fā)現(xiàn)問題,因?yàn)閷?shí)際應(yīng)用中DEBUG級(jí)別的日志量往往很大,通過日志分級(jí)別保存,可以直接看error級(jí)別的日志,快速發(fā)現(xiàn)問題)。
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日志-分日志等級(jí)別輸出
一 logback的介紹
Logback是由log4j創(chuàng)始人設(shè)計(jì)的另一個(gè)開源日志組件,官方網(wǎng)站: http://logback.qos.ch。它當(dāng)前分為下面下個(gè)模塊:
logback-core:其它兩個(gè)模塊的基礎(chǔ)模塊logback-classic:它是log4j的一個(gè)改良版本,同時(shí)它完整實(shí)現(xiàn)了slf4j API使你可以很方便地更換成其它日志系統(tǒng)如log4j或JDK14 Logginglogback-access:訪問模塊與Servlet容器集成提供通過Http來訪問日志的功能
二 logback的配置介紹
Logger、appender及l(fā)ayout
Logger作為日志的記錄器,把它關(guān)聯(lián)到應(yīng)用的對應(yīng)的context上后,主要用于存放日志對象,也可以定義日志類型、級(jí)別。
Appender主要用于指定日志輸出的目的地,目的地可以是控制臺(tái)、文件、遠(yuǎn)程套接字服務(wù)器、 MySQL、PostreSQL、 Oracle和其他數(shù)據(jù)庫、 JMS和遠(yuǎn)程UNIX Syslog守護(hù)進(jìn)程等。
Layout 負(fù)責(zé)把事件轉(zhuǎn)換成字符串,格式化的日志信息的輸出。
logger context
各個(gè)logger 都被關(guān)聯(lián)到一個(gè) LoggerContext,LoggerContext負(fù)責(zé)制造logger,也負(fù)責(zé)以樹結(jié)構(gòu)排列各logger。其他所有l(wèi)ogger也通過org.slf4j.LoggerFactory 類的靜態(tài)方法getLogger取得。 getLogger方法以 logger名稱為參數(shù)。用同一名字調(diào)用LoggerFactory.getLogger 方法所得到的永遠(yuǎn)都是同一個(gè)logger對象的引用。
有效級(jí)別及級(jí)別的繼承
Logger 可以被分配級(jí)別。級(jí)別包括:TRACE、DEBUG、INFO、WARN 和 ERROR,定義于ch.qos.logback.classic.Level類。如果 logger沒有被分配級(jí)別,那么它將從有被分配級(jí)別的最近的祖先那里繼承級(jí)別。root logger 默認(rèn)級(jí)別是 DEBUG。
打印方法與基本的選擇規(guī)則
打印方法決定記錄請求的級(jí)別。例如,如果 L 是一個(gè) logger 實(shí)例,那么,語句 L.info("…")是一條級(jí)別為 INFO的記錄語句。記錄請求的級(jí)別在高于或等于其 logger 的有效級(jí)別時(shí)被稱為被啟用,否則,稱為被禁用。記錄請求級(jí)別為 p,其 logger的有效級(jí)別為 q,只有則當(dāng) p>=q時(shí),該請求才會(huì)被執(zhí)行。
該規(guī)則是 logback 的核心。級(jí)別排序?yàn)椋?TRACE < DEBUG < INFO < WARN < ERROR
分日志等級(jí)別輸出
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定義日志文件的存儲(chǔ)地址 勿在 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"/>
<!-- 控制臺(tái)輸出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級(jí)別從左顯示5個(gè)字符寬度%msg:日志消息,%n是換行符-->
<pattern>${PATTERN}</pattern>
<!-- 設(shè)置輸出字符集編碼 -->
<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>
<!--日志文件保留天數(shù)-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級(jí)別從左顯示5個(gè)字符寬度%msg:日志消息,%n是換行符-->
<pattern>${PATTERN}</pattern>
<!-- 設(shè)置輸出字符集編碼 -->
<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>
<!-- 日志在磁盤上保留天數(shù) -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!-- 過濾器,只ACCEPT接收ERROR級(jí)別的日志,其它日志級(jí)別都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>
<!-- 日志在磁盤上保留天數(shù) -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!-- 過濾器,只ACCEPT接收ERROR級(jí)別的日志,其它日志級(jí)別都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>
<!-- 日志在磁盤上保留天數(shù) -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!-- 過濾器,只ACCEPT接收ERROR級(jí)別的日志,其它日志級(jí)別都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>
<!-- 把日志異步輸出到磁盤文件中,避免每次都進(jìn)行磁盤IO操作 -->
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>10000</queueSize>
<appender-ref ref="FILE" />
</appender>
<!-- 日志輸出級(jí)別 -->
<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>
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Boot Jar 包部署腳本的實(shí)例講解
在本篇文章里小編給大家整理的是一篇關(guān)于Spring Boot Jar 包部署腳本的實(shí)例講解內(nèi)容,對此有興趣的朋友們可以跟著學(xué)習(xí)下。2021-12-12
關(guān)于Java父類沒有無參構(gòu)造方法子類處理方法
父類無參構(gòu)造方法,子類不寫,其實(shí)會(huì)默認(rèn)調(diào)用父類的無參構(gòu)造方法也就是用super(),編譯運(yùn)行后,會(huì)打印出"子類會(huì)調(diào)用Father的第一個(gè)構(gòu)造方法,這篇文章給大家介紹關(guān)于Java父類沒有無參構(gòu)造方法子類處理方法,感興趣的朋友一起看看吧2024-01-01
SpringBoot自定義注解之實(shí)現(xiàn)AOP切面日志詳解
這篇文章主要為大家詳細(xì)介紹了SpringBoot自定義注解之實(shí)現(xiàn)AOP切面統(tǒng)一打印出入?yún)⑷罩?,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09
spring?boot集成WebSocket日志實(shí)時(shí)輸出到web頁面
這篇文章主要為大家介紹了spring?boot集成WebSocket日志實(shí)時(shí)輸出到web頁面展示的詳細(xì)操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
javaweb中ajax請求后臺(tái)servlet(實(shí)例)
下面小編就為大家?guī)硪黄猨avaweb中ajax請求后臺(tái)servlet(實(shí)例)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06
通過實(shí)例解析spring bean之間的關(guān)系
這篇文章主要介紹了通過實(shí)例解析spring bean之間的關(guān)系,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
剖析Java中HashMap數(shù)據(jù)結(jié)構(gòu)的源碼及其性能優(yōu)化
這篇文章主要介紹了Java中HashMap數(shù)據(jù)結(jié)構(gòu)的源碼及其性能優(yōu)化,文中以Java 8后HashMap的性能提升來討論了HashMap的一些優(yōu)化點(diǎn),需要的朋友可以參考下2016-05-05
ThreadLocal數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)原理解析
這篇文章主要為大家介紹了ThreadLocal數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
java通過反射創(chuàng)建對象并調(diào)用方法
這篇文章主要介紹了java通過反射創(chuàng)建對象并調(diào)用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01

