Logback是一個開源日誌組件
一 導入相關jar包
logback-core:是其它兩個模塊的基礎模塊;
logback-classic:直接實現了slf4j API,可以直接與slf4j記錄系統輕鬆切換,因此加上log4j-over-slf4j的jar包;
log4j-over-slf4j
logback-access:用於訪問模塊與Servlet容器集成提供通過Http來訪問日誌的功能。
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>1.2.3</version>
</dependency>
Logback默認配置的步驟::
嘗試在 classpath下查找文件logback-test.xml;
如果文件不存在,則查找文件logback.xml;
如果兩個文件都不存在,logback用BasicConfigurator自動對自己進行配置,這會導致記錄輸出到控制檯。
二 Logback體系結構
Logger、Appender、Layout
logback建立在三個主要的類之上:Logger、Appender和Layout。
這三個組件協調工作,使開發者可以按照消息的類型和級別記錄消息,還可以控制消息的輸出格式和輸出目的地。
Logger上下文
loggerback比System.out.println最重要的一個優點就是禁用特定語句的同時卻不會妨礙其它的語句。
在logback-classic裏,這種分類是是logger固有的,每個logger被關聯到一個loggerContext即上下文
二 logback.xml一個根節點和五個常用子節點
根節點
上下文名稱
變量定義
日誌打印
獲取日誌
logger的根節點
根節點
有三個屬性,均可以不設置。
scan: 當此屬性設置爲true時,配置文件如果發生改變,將會被重新加載,默認值爲true。
scanPeriod: 設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan爲true時,此屬性生效。默認的時間間隔爲1分鐘。
debug: 當此屬性設置爲true時,將打印出logback內部日誌信息,實時查看logback運行狀態。默認值爲false。
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!--其他配置省略-->
</configuration>
節點來設置上下文名稱,每個logger都關聯到logger上下文,默認上下文名稱爲default。但可以使設置成其他名字,用於區分不同應用程序的記錄。一旦設置,不能修改。
例如:
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>myAppName</contextName>
<!--其他配置省略-->
</configuration>
節點
有兩個屬性,爲鍵值對:
name:鍵作爲引用,引用方式爲${};
value:值作爲引用的內容;
<property name="normal-pattern" value="[%d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c:%L] [%thread] %m%n"/>
使用鍵值對實現代碼複用,修改起來也方便,主要用於日誌的輸出格式與輸出路徑。
節點
用於獲取日誌。有一個必須節點和兩個可選節點:
name:受此logger約束的包或者類,也就是日誌來源;
level:設置打印級別,約束的包中日誌級別高於此級別的才能被收集;若未設置則向上級繼承;
addtivity:是否向上級loger傳遞打印信息。默認是true。
logger是命了名的實體,大小寫敏感且遵循層次化的命名規則。
如果logger的名稱帶上一個點號是另外一個logger的名稱前綴,那麼前者就被稱爲後者的祖先。
l日誌級別:TRACE< DEBUG < INFO < WARN < ERROR 特俗值INHERITED或者同義詞NULL,代表強制執行上級的級別。
如果logger沒有被分配級別,那麼將從最近的祖先那裏繼承級別。
包含零個或多個元素,標識這個appender將會添加到這個loger。
節點
也是一個節點,爲根logger節點,只有一個level屬性。
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder 默認配置爲PatternLayoutEncoder -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- logback爲java中的包 -->
<logger name="logback"/>
<!--logback.LogbackDemo:類的全路徑 -->
<logger name="logback.LogbackDemo" level="INFO" additivity="false">
<appender-ref ref="STDOUT"/>
</logger>
<root level="ERROR">
<appender-ref ref="STDOUT" />
</root>
</configuration>
節點
輸出日誌。有兩個必要的屬性:
name:指定appender的名稱;
class:指定appender的類別,例如輸出到控制檯
1.ConsoleAppender:
將日誌輸出到控制檯,有2個節點:
:對日誌進行格式化;
:字符串 System.out 或者 System.err ,默認 System.out ; //一般直接省略
<configuration>
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
</configuration>
2.RollingFileAppender:
滾動記錄文件,先將日誌記錄到指定文件,當符合某個條件時,將日誌記錄到其他文件。有7個節點:
:被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創建,沒有默認值。
:如果是 true,日誌被追加到文件結尾,如果是 false,清空現存文件,默認是true。 // 一般使用默認值
:對記錄事件進行格式化。 // 重要,指出了輸出格式
:當發生滾動時,決定 RollingFileAppender 的行爲,涉及文件移動和重命名。 // 重要,指出了輸出的文件夾
: 告知 RollingFileAppender 何時激活滾動。
:當爲true時,日誌會被安全的寫入文件,即使其他的FileAppender也在向此文件做寫入操作,效率低,默認是 false。 // 一般使用默認值
:過濾器,過濾不需要的日誌。
滾動策略,常用有按時間滾動和按窗體大小滾動。
按時間滾動:每天生成一個日誌文件,保存30天的日誌文件
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
</root>
</configuration>
使用SizeAndTimeBasedFNATP 組件還可以按時間滾動的同時按大小滾動
<appender name="qmqConsumerAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>logFile.%d{yyyy-MM-dd}.log</FileNamePattern>
<maxHistory>30</maxHistory>
<!-- 按時間回滾的同時,按文件大小來回滾 -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<--省略代碼-->
</appender>
按文件大小滾動:當文件大於20MB時,生成新的日誌文件。窗口大小是1到3,當保存了3個歸檔文件後,將覆蓋最早的日誌。
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>test.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>tests.%i.log.zip</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>5MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
</root>
</configuration>
負責兩件事,一是把日誌信息轉換成字節數組,二是把字節數組寫入到輸出流。
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c:%L] [%thread] [taskNo=%X{taskNo}] QTraceId[%X{qtraceid}] %m%n"</pattern>
</encoder>
// %d{yyyy-MM-dd HH:mm:ss.SSS} 日誌輸出時當前時間
// %5p 記錄事件的級別,最多5個字符
// %c 日誌名稱(通常是構造函數的參數)
// %L 輸出執行記錄請求的行號
// %thread 輸出產生記錄事件的線程名
// %X{qtraceid} 輸出mdc.put();中鍵爲qtraceid的值。
//[2018-04-25 16:41:50.459 ERROR com.qunar.flight.shylock.service.impl.LogService:158] [main] [taskNo=] QTraceId[] 畫圖成功了
轉換符與修飾符
#模式符號 - 用途(附加說明);{可選附加選項}(附加選項說明)
# %c - 日誌名稱(通常是構造函數的參數);{數字}("ab.cd.e" 的名稱使用 %c{3} 會輸出 "a.c.e")
# %C - 調用者的類名(速度慢,不推薦使用);{數字}(同上)
# %d - 日誌時間;{SimpleDateFormat所能使用的格式}
# %F - 調用者的文件名(速度極慢,不推薦使用)
# %l - 調用者的函數名、文件名、行號(速度極其極其慢,不推薦使用)
# %L - 調用者的行號(速度極慢,不推薦使用)
# %m %msg %message - 日誌內容
# %M - 調用者的函數名(速度極慢,不推薦使用)
# %n - 換行符號
# %p %le %level - 日誌優先級別(DEBUG, INFO, WARN, ERROR)
# %r %relative - 輸出日誌所用毫秒數
# %t %thread - 調用者的進程名
# %X{key} - 輸出mdc.put()中鍵值對的值。
#模式修飾符 - 對齊 - 最小長度 - 最大長度
# %20c 右 20 ~
# %-20c 左 20 ~
# %.30c ~ ~ 30
# %20.30c 右 20 30
# %-20.30c 左 20 30
MDC
mdc是Mapped Diagnostic Context的縮寫,翻譯爲映射診斷環境。給客戶端的每一個記錄添加一個唯一戳(uniquely stamp)。用戶把環境信息放入MDC。
MDC類只有靜態方法,是基於每個線程進行管理的,開發者會向MDC插入恰當的環境信息,比如客戶端的id、ip地址、請求參數等。
看成是一個與當前線程綁定的哈希表,可以往其中添加鍵值對。
// 基本用法
MDC.put("userId",1000);
// 高級用法 服務器的每個線程都有自己獨立的MDC戳
MDC.put("qtraceid", QTraceClientGetter.getClient().getCurrentTraceId());
常規過濾器:自定義過濾器、級別過濾器、臨界值過濾器、求職過濾器;
TurboFilters:重複消息過濾器;
過濾器,執行一個過濾器會有返回個枚舉值,即DENY,NEUTRAL,ACCEPT其中之一。返回DENY,日誌將立即被拋棄不再經過其他過濾器;返回NEUTRAL,有序列表裏的下個過濾器過接着處理日誌;返回ACCEPT,日誌會被立即處理,不再經過剩餘過濾器。多個過濾器時,按照配置順序執行。
自定義過濾器
創建:需要繼承Fliter抽象類並重寫decide()方法。
使用:
package com.qunar.flight.shylock.utils;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
/**
* @Author: fanghao
* @Description:
* @Date: Create in 16:14 2018/4/26
* @Modified By:
*/
public class SampleFilter extends Filter<ILoggingEvent> {
@Override
public FilterReply decide(ILoggingEvent event) {
if (event.getMessage().contains("aaaa")) {
return FilterReply.ACCEPT;
} else {
return FilterReply.DENY;
}
}
}
// 使用自定義過濾器
<configuration>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<filter class="com.qunar.flight.shylock.utils.SampleFilter"/>
<--省略代碼-->
</appender>
</configuration>
LeverFilter
級別過濾器,根據日誌級別進行過濾。如果日誌級別等於配置級別,過濾器會根據onMath 和 onMismatch接收或拒絕日誌。有以下子節點:
:設置過濾級別
:用於配置符合過濾條件的操作
:用於配置不符合過濾條件的操作
例如:將過濾器的日誌級別配置爲INFO,所有INFO級別的日誌交給appender處理,非INFO級別的日誌,被過濾掉。
<configuration>
<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>
<--省略代碼-->
</configuration>
ThresholdFilter
臨界值過濾器,過濾掉低於指定臨界值的日誌。當日志級別等於或高於臨界值時,過濾器返回NEUTRAL;當日志級別低於臨界值時,日誌會被拒絕。
例如:過濾掉所有低於INFO級別的日誌。
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!-- 過濾掉 TRACE 和 DEBUG 級別的日誌-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<--省略代碼-->
</configuration>
EvaluatorFilter
需要添加一個jar包 janino
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
<version>3.0.8</version>
</dependency>
求值過濾器,含有一個節點:
鑑別器,常用的鑑別器是JaninoEventEvaluato,也是默認的鑑別器,它以任意的java布爾值表達式作爲求值條件,求值條件在配置文件解釋過成功被動態編譯,布爾值表達式返回true就表示符合過濾條件。evaluator有個子標籤,用於配置求值條件。
濾去消息中不含”billing”字符串的日誌
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator> <!-- 默認爲 ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
<expression>return message.contains("billing");</expression> // message 是日誌的原始消息,爲java代碼其它使用可見中文手冊
</evaluator>
<OnMatch>ACCEPT </OnMatch>
<OnMismatch>DENY</OnMismatch>
</filter>
<encoder>
<pattern>
%-4relative [%thread] %-5level %logger - %msg%n
</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
Logback-classic會自動幫我們導出logging event的屬性到evaluation 表達式中,所以我們可以直接使用以下屬性判斷:
三 其它的Appender
FileAppender:把日誌添加到文件,非滾動。功能少,使用少;
DBAppender:把日誌事件寫入數據庫;
SiftingAppender:它可以用來分割日誌文件根據任何一個給定的運行參數。如,SiftingAppender能夠區別日誌事件跟進用戶的Session,然後每個用戶會有一個日誌文件;
SMTPAppender:當輸出的日誌滿足條件時,就像某郵箱發送日誌通知;
<?xml version="1.0" encoding="UTF-8"?>
<!--
off->trace->debug->info->warn->error
scan:
當此屬性設置爲true時,配置文件如果發生改變,將會被重新加載,默認值爲true。
scanPeriod:
設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan爲true時,此屬性生效。默認的時間間隔爲1分鐘。
debug:
當此屬性設置爲true時,將打印出logback內部日誌信息,實時查看logback運行狀態。默認值爲false。
-->
<configuration scan="true" scanPeriod="60 seconds" debug="true">
<!--
這裏是屬性,我們可以定義很多的屬性,然後用這些健值對來代替直接的pattern string
使用這種方式能夠更好的統一管理不同的APPENDER
-->
<property name="log-name" value="homework-log"/>
<!--該段表示從mail.properties文件讀取配置文件,該文件路徑跟SRC目錄齊平-->
<!--
<property file="logbackconf/mail/mail.properties" />
-->
<contextName>${log-name}</contextName>
<!-- 要注意與property的區別 -->
<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>
<!--
每個logger都關聯到logger上下文,默認上下文名稱爲“default”。
但可以使用<contextName>設置成其他名字,用於區分不同應用程序的記錄。一旦設置,不能修改。
-->
<!--
<contextName>homework-log</contextName>
-->
<!--appender包含如下的子標籤:
<encoder>
<file>
<rollingPolicy>
<filter>
<triggeringPolicy>
等
-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!-- 這個appender是最基礎,也是最重要的了,主要我們用來在控制檯打印信息 -->
<encoder>
<pattern>%-4relative [%t] %-5level %logger{35} - %file %class %m%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--
TimeBasedRollingPolicy
FixedWindowRollingPolicy
根據固定窗口算法重命名文件的滾動策略。有以下子節點:
<minIndex>:窗口索引最小值
<maxIndex>:窗口索引最大值,當用戶指定的窗口過大時,會自動將窗口設置爲12。
<fileNamePattern >:必須包含“%i”例如,假設最小值和最大值分別爲1和2,
命名模式爲 mylog%i.log,會產生歸檔文件mylog1.log和mylog2.log。
還可以指定文件壓縮選項,例如,mylog%i.log.gz 或者 沒有log%i.log.zip
<triggeringPolicy> 告訴RollingFileAppender什麼時候激活滾動
SizeBasedTriggeringPolicy: 查看當前活動文件的大小,如果超過指定大小會告知
RollingFileAppender :觸發當前活動文件滾動。只有一個節點:
<maxFileSize>:這是活動文件的大小,默認值是10MB。
-->
<appender name="preAuthorization.warning" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${catalina.home}/logs/b2c.preAuthorization.warning.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${catalina.home}/logs/b2c.preAuthorization.warning.log.%d{yyyy-MM-dd}</fileNamePattern>
<append>true</append>
<maxHistory>30</maxHistory>
<!--月?日?要看你的fileNamePattern-->
</rollingPolicy>
<!-- 關於filter -->
<!--
過濾內容
過濾器,執行一個過濾器會有返回個枚舉值,即DENY,NEUTRAL,ACCEPT其中之一。
返回DENY,日誌將立即被拋棄不再經過其他過濾器;
返回NEUTRAL,有序列表裏的下個過濾器過接着處理日誌;
返回ACCEPT,日誌會被立即處理,不再經過剩餘過濾器
LevelFilter
<level>:設置過濾級別
<onMatch>:用於配置符合過濾條件的操作
<onMismatch>:用於配置不符合過濾條件的操作
ThresholdFilter:
臨界值過濾器,過濾掉低於指定臨界值的日誌。當日志級別等於或高於臨界值時,過濾器返回NEUTRAL;
當日志級別低於臨界值時,日誌會被拒絕。
EvaluatorFilter:
求值過濾器,評估、鑑別日誌是否符合指定條件。需要額外的兩個JAR包,
commons-compiler.jar和janino.jar有以下子節點:
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator> 默認爲 ch.qos.logback.classic.boolex.JaninoEventEvaluator
<expression>return message.contains("billing");</expression>
</evaluator>
<OnMatch>ACCEPT </OnMatch>
<OnMismatch>DENY</OnMismatch>
</filter>
-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARN</level>
</filter>
<!--必須匹配到INFO纔可以-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>%-4relative [%t] %-5level %logger{35} - %file %class %m%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>test.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>tests.%i.log.zip</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>300000</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>5MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%-4relative [%t] %-5level %logger{35} - %file %class %m%n</pattern>
</encoder>
</appender>
<!--
另外還有SocketAppender、SMTPAppender、DBAppender、SyslogAppender、SiftingAppender,
並不常用,這些就不在這裏講解了,大家可以參考官方文檔。當然大家可以編寫自己的Appender。
-->
<!--
encoder
負責兩件事,一是把日誌信息轉換成字節數組,二是把字節數組寫入到輸出流。
重要的如下:
(1)%c 輸出日誌的logger名,可有一個整形參數,功能是縮短logger名,設置爲0表示只輸入logger最右邊點符號之後的字符串。
Conversion specifier Logger name Result
(2)%class 輸出執行記錄請求的調用者的全限定名。參數與上面的一樣。儘量避免使用,除非執行速度不造成任何問題。
(3)%contextName 輸出上下文名稱。
(4)%date %d{dd MMM yyyy ;HH:mm:ss.SSS}
(5)%file 輸出執行記錄請求的java源文件名。儘量避免使用,除非執行速度不造成任何問題。
(6)m / msg / message 輸出應用程序提供的信息。logger.info(xxx);xxx信息
(7)M / method 輸出執行日誌請求的方法名。儘量避免使用,除非執行速度不造成任何問題。
(8)n 輸出平臺先關的分行符“\n”或者“\r\n”。
(9)p / le / level 輸出日誌級別。
(10)r / relative 輸出從程序啓動到創建日誌記錄的時間,單位是毫秒
(11)t / thread 輸出產生日誌的線程名。
(12)replace(p ){r, t} p 爲日誌內容,r 是正則表達式,將p 中符合r 的內容替換爲t 。例如, "%replace(%msg){'\s', ''}"
off trace debug info warn error
-->
<!--
additivity: 是否向上級loger傳遞打印信息。默認是true。
name: 限定類名字
level
-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder 默認配置爲PatternLayoutEncoder -->
<encoder>
<pattern>%-4relative [%t] %-5level %logger{35} - %file %class %m%n %M ${bySecond}</pattern>
</encoder>
</appender>
<!-- smtp -->
<appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
<smtpHost>mail.corp.qunar.com</smtpHost>
<to>[email protected]</to>
<!-- 可以定義更多的發送目標 -->
<!--
<to>[email protected]</to>
<to>[email protected]</to>
<to>[email protected]</to>
<to>[email protected]</to>-->
<!--
-->
<from>[email protected]</from>
<subject>報警郵件</subject>
<!-- 採用HTML渲染方式,可以自定義CSS -->
<layout class="ch.qos.logback.classic.html.HTMLLayout">
<!--不寫,採用默認格式 -->
<pattern>%date%level%thread%message</pattern>
</layout>
<!--
可以使用自定義格式
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%date %-5level %logger{35} - %message%n</pattern>
</layout>
-->
<!-- 這裏可以用來設定緩衝區 -->
<cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker">
<!-- send just one log entry per email -->
<bufferSize>64</bufferSize>
</cyclicBufferTracker>
<!--
可以自定義出觸發方式,默認的是遇到error警報就進行觸發
<evaluator class="chapters.appenders.mail.CounterBasedEvaluator" />
public class CounterBasedEvaluator extends ContextAwareBase implements EventEvaluator {
static int LIMIT = 1024;
int counter = 0;
String name;
public boolean evaluate(Object event) throws NullPointerException,
EvaluationException {
counter++;
if (counter == LIMIT) {
counter = 0;
return true;
} else {
return false;
}
}
}
-->
</appender>
<!-- 程序中使用logger有兩種方式:
(1)直接使用logger的名字來進行引用如下:
private final static Logger logger = LoggerFactory.getLogger("loggerName");
比如此時有一個logger:
<logger name="loggerName" level="INFO" additivity="trues">
<appender-ref ref="STDOUT"/>
</logger>
那麼就會使用該logger
(2)使用class.getName(),他會根據類的全限定名!注意是全限定名。比如此時有一個logger
private final static Logger logger = LoggerFactory.getLogger(MyClass.class);
比如MyClass是:com.qunar.fresh.MyClass
那麼
com
com.qunar
com.qunar.fresh
都是他的父親logger,都可以進行匹配。
com.qunar.fresh.MyClass則是對應的logger。
因此有如下:
果additivity==true,那麼會打印多次(logger會傳遞給父親。
最後的祖宗,就是root。如果什麼都找不到,則會匹配root
-->
<logger name="com" level="WARN" additivity="false">
<!-- 可以添加多個appender-ref,他找到對應的appender-->
<appender-ref ref="EMAIL"/>
<appender-ref ref="console"/>
</logger>
<!--
項目中如果調式數據庫,則可以打開這個註釋,不過要注意
對應的日誌太多了!!!
-->
<!--
<logger name="java.sql.Connection" level="DEBUG" />
<logger name="java.sql.Statement" level="DEBUG" />
<logger name="java.sql.PreparedStatement" level="DEBUG" />
<logger name="java.sql.ResultSet" level="DEBUG" />
-->
<!--
root中的level非常重要,他具有總控的功,如他設定爲error那麼無論子logger設定什麼,只有level爲error的
纔可以打印出來,默認爲debug,有時候你打不出日誌,檢查root設定的對不對。
-->
<root level="INFO">
<appender-ref ref="console"/>
<appender-ref ref="EMAIL"/>
</root>
</configuration>
<!--
更詳細的清參考源代碼和官方文檔:
http://logback.qos.ch/documentation.html
-->
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<SMTP name="Mail" subject="Error Log" to="[email protected]" from="[email protected]" replyTo="[email protected]"
smtpProtocol="smtp" smtpHost="smtp.163.com" smtpPort="25" bufferSize="50" smtpDebug="false"
smtpPassword="password" smtpUsername="[email protected]">
</SMTP>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Mail"/>
</Root>
</Loggers>
</Configuration>
https://wenku.baidu.com/view/71a056eb0975f46527d3e138.html?pn=50