logback學習

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章