Logback學習筆記1

 

Logback介紹 html

Logback 分爲三個模塊:CoreClassic AccessCore模塊是其餘兩個模塊的基礎。 Classic模塊擴展了core模塊。 Classic模塊至關於log4j的顯著改進版。Logback-classic 直接實現了 SLF4J API java

要引入logback,因爲Logback-classic依賴slf4j-api.jarlogback-core.jar,因此要把slf4j-api.jarlogback-core.jarlogback-classic.jar添加到要引入Logbac日誌管理的項目的class path. 算法

 

Logback的配置 數據庫

LoggerAppender Layout api

Logback創建於三個主要類之上:LoggerAppender LayoutLogger類是logback-classic模塊的一部分,而AppenderLayout接口來自logback-core。做爲一個多用途模塊,logback-core 不包含任何 logger 數組

Logger做爲日誌的記錄器,把它關聯到應用的對應的context上後,主要用於存放日誌對象,也能夠定義日誌類型、級別。Appender主要用於指定日誌輸出的目的地,目的地能夠是控制檯、文件、遠程套接字服務器、 MySQL PostreSQL Oracle和其餘數據庫、 JMS和遠程UNIX Syslog守護進程等。Layout 負責把事件轉換成字符串,格式化的日誌信息的輸出。 緩存

 

Logger context tomcat

各個logger 都被關聯到一個 LoggerContextLoggerContext負責製造logger,也負責以樹結構排列各 logger 服務器

若是 logger的名稱帶上一個點號後是另一個 logger的名稱的前綴,那麼,前者就被稱爲後者的祖先。若是 logger與其後代 logger之間沒有其餘祖先,那麼,前者就被稱爲子logger 之父。好比,名爲 "com.foo"" logger 是名爲"com.foo.Bar"之父。root logger 位於 logger 等級的最頂端,root logger 能夠經過其名稱取得,以下所示: app

Logger rootLogger = LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);

其餘全部logger也經過org.slf4j.LoggerFactory 類的靜態方法getLogger取得。 getLogger方法以 logger 名稱爲參數。用同一名字調用LoggerFactory.getLogger 方法所獲得的永遠都是同一個logger對象的引用。

    

有效級別與級別繼承

Logger 能夠被分配級別。級別包括:TRACEDEBUGINFOWARN 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

 

LoggerAppenderslayouts的關係

一個 logger 能夠被關聯多個 appender 方法 addAppender() 爲指定的 logger 添加一個 appender 對於 logger 的每一個啓用了的記錄請求,都將被髮送到 logger 裏的所有 appender 及更高等級的 appender。換句話說,appender疊加性地繼承了 logger 的層次等級。

Logger L的記錄語句的輸出會發送給 L及其祖先的所有 appender。若是 logger L的某個祖先 P設置疊加性標識爲 false,那麼,L的輸出會發送給L P之間(含P)的全部 appender,但不會發送給P的任何祖先的appender

Logger 的疊加性默認爲 true。若是但願定製輸出格式。這時爲 appender 關聯一個 layout 便可。Layout 負責根據用戶意願對記錄請求進行格式化,appender 負責將格式化化後的輸出發送到目的地。

例如,轉換模式"%-4relative [%thread] %-5level %logger{32} - %msg%n" PatternLayout裏會輸出形如:

176 [main] DEBUG manual.architecture.HelloWorld2 - Hello world.

第一個字段是自程序啓動以來的逝去時間,單位是毫秒。

第二個地段發出記錄請求的線程。

第三個字段是記錄請求的級別。

第四個字段是與記錄請求關聯的 logger 的名稱。

"-"以後是請求的消息文字。

 

Logback的默認配置

若是配置文件 logback-test.xml logback.xml 都不存在,那麼 logback 默認地會調用BasicConfigurator ,建立一個最小化配置。最小化配置由一個關聯到根 logger ConsoleAppender 組成。輸出用模式爲%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n PatternLayoutEncoder 進行格式化。root logger 默認級別是 DEBUG

logback配置文件

Logback 配置文件的語法很是靈活。正由於靈活,因此沒法用 DTD XML schema 進行定義。儘管如此,能夠這樣描述配置文件的基本結構:以<configuration>開頭,後面有零個或多個<appender>元素,有零個或多個<logger>元素,有最多一個<root>元素。

 

Logback默認配置的採用的步驟

1. 嘗試在 classpath 下查找文件 logback-test.xml

2. 若是文件不存在,則查找文件 logback.xml

3. 若是兩個文件都不存在,logback Bas icConfigurator 自動對本身進行配置,這會致使記錄輸出到控制檯。

 

假設配置文件 logback-test.xml logback.xml 都不存在,那麼 logback 默認地會調用BasicConfigurator ,建立一個最小化配置。最小化配置由一個關聯到根 logger ConsoleAppender 組成。輸出用模式爲%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n PatternLayoutEncoder 進行格式化。還有,根 logger 默認級別是 DEBUG

最簡單的配置方法就是使用默認配置。 如下是logbackBasicConfigurator 配置的簡單例子:

package com.ttpod.chapters.configuration;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

public class MyApp1 {

final static Logger logger = LoggerFactory.getLogger(MyApp1.class);

public static void main(String[] args) {

logger.info("Entering application.");    //進行另外一個application

Foo foo = new Foo();

foo.doIt();        //執行其它中的日誌輸出方法

logger.info("Exiting application.");    //退出另外一個application

}

}

該類定義了一個靜態變量 logger,而後實例化一個 Foo 對象。Foo 類以下

package com.ttpod.chapters.configuration;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

public class Foo {

static final Logger logger = LoggerFactory.getLogger(Foo.class);

public void doIt() {

logger.debug("Did it again!");    //定義一個debug級別的日誌輸出

}

    …………

}

 

自動打印警告和錯誤消息

當解析配置文件有警告或出錯時,logback 會在控制檯上自動打印狀態數據。若是沒有警告或錯誤,仍是想檢查 logback 的內部狀態的話, 能夠調用 StatusPrinter print()方法。示例以下:

final static Logger logger = LoggerFactory.getLogger(MyApp2.class);

public static void main(String[] args) {

// 在當前環境中假設 SLF4J 已經被綁定到logback

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();

// 打印logback的內部狀態

StatusPrinter.print(lc);

…………

}

}

對應的配置文件:

<?xml version="1.0" encoding="UTF-8" ?>

<configuration>

<!--定義一個名爲STDOUTappender,並將其關聯到ch.qos.logback.core.ConsoleAppender-->

<appender name="STDOUT"

class="ch.qos.logback.core.ConsoleAppender">

<!-- encoders 做用是將logger事件轉換成字節數組,並將字節數組寫入到輸出流-->

<encoder>

    <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度

%msg:日誌消息,%n是換行符-->

<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>

</encoder>

</appender>

<root level="debug">    <!-- root logger,定義級別爲debug-->

<appender-ref ref="STDOUT" />    <!--將名爲STDOUTappender添加到root logger-->

</root>

</configuration>

控制檯輸出結果以下:

…………

20:12:33,359 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]

20:12:33,359 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]

20:12:33,359 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/D:/Workspaces/MyEclipse%208.5/logback_test/WebRoot/WEB-INF/classes/logback.xml]

20:12:33,484 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]

20:12:33,484 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]

20:12:33,500 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property

20:12:33,593 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG

20:12:33,593 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]

20:12:33,593 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.

20:12:33,593 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@cb6009 - Registering current configuration as safe fallback point

…………

 

Logback自定義配置

配置root logger

<root>元素配置根 logger。該元素有一個 level屬性。沒有 name 屬性,由於已經被命名爲"ROOT" Level 屬性的值大小寫無關,其值爲下面其中一個字符串:TRACEDEBUGINFOWARNERRORALL OFF。注意不能設置爲"INHERITED" "NULL" <logger>元素能夠包含零個或多個<appender-ref>元素。<logger>元素相似,聲明<root>元素後,會先關閉而後移除所有當前 appender,只引用聲明瞭的 appender。若是 root 元素沒有引用任何 appender,就會失去全部 appender

假設咱們不想看到"com.ttpod.file"包裏的任何組件的任何 DEBUG 信息,能夠設置以下:

<?xml version="1.0" encoding="UTF-8" ?>

<configuration>

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">

<encoder>

<pattern>

%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n

     </pattern>

</encoder>

    </appender>

    <!-- 設置configuration下的logger的級別爲INFO,默認是繼承root loggerdebug級別 -->

    <logger name="chapters.configuration" level="INFO" />

    <!-- 嚴格來講, root logger level屬性沒有必要設置,由於 -->

    <!-- root logger的級別被默認設置爲DEBUG -->

    <root level="DEBUG">

        <!--

         root標籤內沒有引入chapters.configuration,全部在此包下不會

        顯示任何組件的任何 DEBUG 信息

        -->

        <appender-ref ref="STDOUT" />    <!-- appender引入到root logger -->

    </root>

</configuration>

注意:由名爲"chapters.configuration.Foo" logger 生成的 DEBUG 級別的信息都被屏蔽了.一樣,也能夠爲任意數量的 logger 設置級別。

配置 Appenders

Appender <appender>元素配置,該元素必要屬性 name class name 屬性指定 appender 的名稱,class 屬性指定 appender 類的全限定名。 <appender>元素能夠包含零個或多個<layout>元素、零個或多個<encoder>元素和零個或多個<filter>元素。除了這三個經常使用元素以外,還能夠包含 appender 類的任意數量的 javabean

屬性。下圖演示了經常使用結構,注意對 javabean 屬性的支持在圖中不可見。

 

記錄輸出到多個 appender 很簡單,先定義各類 appender,而後在 logger 裏進行引用,就好了。以下面的配置文件所示:

<configuration>

    <appender name="FILE" class="ch.qos.logback.core.FileAppender">

        <file>myApp.log</file>

<!-- encoders are assigned by default the type

ch.qos.logback.classic.encoder.PatternLayoutEncoder -->

<encoder>

            <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>

</encoder>

    </appender>

 

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">

<encoder>

<pattern>%msg%n</pattern>

</encoder>

    </appender>

 

    <root level="debug">

        <appender-ref ref="FILE" />

        <appender-ref ref="STDOUT" />

    </root>

</configuration>

該配置文件定義了兩個 appender,分別是"FILE"和"STDOUT"。 "FILE" 這個 appender 把記錄輸 出到文件 "myapp.log " ,它的 encoder PatternLayoutEncoder,輸出了日期、級別、線程名、logger 名、文件名及記錄請求的行號、消息和行分隔符。 "STDOUT"這個 appender 把記錄輸出到控制檯,它的 encoder 只是輸出消息和行分隔符。 myApp.log文件內容以下:

2011-12-25 16:56:48,593 INFO [main] c.t.c.c.MyApp3 [MyApp3.java:48] Entering application.

2011-12-25 16:56:48,593 DEBUG [main] c.t.c.c.Foo [Foo.java:24] Did it again!

2011-12-25 16:56:48,593 INFO [main] c.t.c.c.MyApp3 [MyApp3.java:52] Exiting application.

    注意每一個 appender 都有本身的 encoderEncoder 一般不能被多個 appender 共享,layout也是。因此,logback 的配置文件裏沒有共享 encoder layout 的語法。

Appender累積

默認狀況下,appender 是可累積的:logger 會把記錄輸出到它自身的 appender 和它全部祖先的 appender。所以,把同一 appender 關聯到多個 logger 會致使重複輸出,以下面的配置文件會致使重複的輸出:

<configuration>

    <appender name="STDOUT"

        class="ch.qos.logback.core.ConsoleAppender">

        <encoder>

            <pattern>

                %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n

            </pattern>

</encoder>

    </appender>

    <logger name="chapters.configuration">

        <appender-ref ref="STDOUT" />

    </logger>

    <root level="debug">

        <appender-ref ref="STDOUT" /> <!—這會致使重複輸出-->

    </root>

</configuration>

輸出結果以下:

20:53:29.328 [main] INFO c.t.chapters.configuration.MyApp2 - Entering application.

20:53:29.328 [main] INFO c.t.chapters.configuration.MyApp2 - Entering application.

20:53:29.328 [main] DEBUG com.ttpod.chapters.configuration.Foo - Did it again!

20:53:29.328 [main] DEBUG com.ttpod.chapters.configuration.Foo - Did it again!

20:53:29.328 [main] INFO c.t.chapters.configuration.MyApp2 - Exiting application.

20:53:29.328 [main] INFO c.t.chapters.configuration.MyApp2 - Exiting application.

 

覆蓋默認的累積行爲

若是你以爲默認的累積行爲不合適,能夠設置疊加性標識爲 false 以關閉它。 這樣的話,logger 樹裏的某個分支能夠輸出到與其餘 logger 不一樣的 appender

示例:疊加性標識

<configuration>

    …………

    <logger name="com.ttpod.chapters.configuration.Foo" additivity="false">

        <appender-ref ref="FILE" />

    </logger>

    <root level="debug">

        <appender-ref ref="STDOUT" />

    </root>

</configuration>

輸出結果:

Entering application.

Exiting application.

此例中,logger"chapters.configuration.Foo"關聯 appender"FILE",它的疊加性標記爲false,這樣它的記錄輸出僅會被髮送到 appender"FILE",不會被髮送到更高 logger 等級關聯的 appender。其餘 logger 不受此影響。 additivityFlag.xml 配置 MyApp3 由"chapters.configuration.MyApp3"產生的記錄。而 logger" chapters.configuration.Foo"將且僅僅將輸出到文件 foo.log

Layout格式化輸出日誌

配置自定義 layout

配置自定義layout與配置其餘layout是同樣的。 FileAppender和其子類須要一個encoder。如連接中的例子:http://logback.qos.ch/xref/chapters/layouts/MySampleLayout.html

    此類中定義了一個處理格式的輸出類,爲了知足自定義的格式化的輸出,把包裹了 MySampleLayout LayoutWrappingEncoder 實例傳遞給FileAppender。下面是配置文件:

<configuration debug="true">

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">

<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">

     <!—自定義的格式化輸出處理類-->

<layout class="com.ttpod.chapters.layouts.MySampleLayout" />

</encoder>

</appender>

<root level="DEBUG">

<appender-ref ref="STDOUT" />

</root>

</configuration>

輸出結果以下:

250 DEBUG [main] com.ttpod.chapters.introduction.HelloWorld1 - Hello world.

 

layout轉換符

它和C語言的printf方法很是相似。格式轉換由普通字符和轉換字符組合而成。轉換字符由%開始,緊跟着的是可選的格式修飾符和轉換字符標示。使用%前綴的表示符號將被轉換到實際的內容。如name, level, date, thread name.可用的轉換符有:

轉換符

描述

c 

調用日誌事件的所在記錄器的名字,如一個logger的名字是my.test.bbb.ccc,調用的是WARN級別的日誌輸出,那麼輸出的是輸出my.test.bbb.ccc,能夠在其右邊指定了精度,如%c{2}那麼輸出的是bbb.ccc

C 

調用日誌事件的所在的類名,和c轉換符同樣,能夠在右邊指定寬度,如%C{2}輸出%C{2}

d 

日誌調用所發生的時間,日期格式在其後跟着的大括號內的格式指定如%d{yyyy-MM-dd HH:mm:ss},我如今輸出的結果是2011-07-11 21:05:22,推薦使用的是log4j自己提供的日期格式,如%d{ISO8601}%d{ABSOLUTE}%d{DATE}

F 

所處所在文件名,如上面說C轉換符的例子,輸出結果是LayoutTest.java

l 

是的日誌事件發生的位置信息,這個和虛擬機的實現有點關係,通常境況下能獲得類,方法,行數源文件等信息,

L 

只是輸出觸發日誌事件代碼所在的行號,性能損耗會小不少。

m 

顯示應用給日誌提供的其餘信息,如消息。logger.warn("Message 2");那麼%m將獲得的是Message 2

M 

輸出調用者所在的方法名

n 

換行,和\r \r\n有相同功能,能識別系統的換行符,自動轉換成\r或者\r\nlog4j推薦使用這個轉換符,而不是\r或者\r\n

p 

輸出調用的日誌的級別,如我是調用logger.debug方法,那麼級別就是debug

r 

輸出自應用啓動後第一次調用logger的日誌輸出方法,到輸出該log信息耗費的毫秒數

t 

輸出所在線程的名字

x 

輸出產生的日誌事件的線程的NDC(嵌套診斷上下文)

X 

輸出與生成的日誌事件的線程關聯的MDC(映射診斷上下文)。X轉換符括號之間放置了一個key,就像在%X {clientNumber}中的clientNumberkey 同樣。在MDC correspondingvalue將被輸出。

% 

寫上%%後將直接輸出一個%符號

 

layout格式修飾符

如給定的一個格式:%-5p [%t]: %m%n中,並無明確的分隔轉換字符和普通文本的字符存在。PatternLayout能本身區分普通文本和轉換字符。其中%-5p是日誌的調用級別。事件是左對齊的,5個字符寬度。

格式修飾符,放在%和轉換符之間。 第一個可選的格式修飾符是左對齊(-);第二個可選的格式修飾符是字段最小寬度。一個整數。表示輸出的最小字符數。若是數據未達到指定最小大小,那麼它將以左填充(默認)或者右填充方式(左對齊狀況下只能使用右填充了)。用空格填充,直到達到最小寬度。若是大於指定最小寬度,不會被截斷 。固然能夠指定最大字符數,使用.符號加數字表示最大字符數。若是大於指定長度,多餘的字符會被刪除。它是從前面刪除,而不是從後面刪除的。如最大字符是8個,數據有10個字符,那麼前面兩個字符會被刪除。 

%20c 右對齊,最少20字符,沒有左邊用空格填充 

%-20c 左對齊,最少20字符,沒有右邊用空格填充 

%.30c 右對齊,最多30字符,超過左邊的截取掉 

%20.30c 右對齊,最少20字符,最多30字符,填充或截取規則略

%-20.30c 左對齊,最少20字符,最多30字符,填充或截取規則略 

 

在程序裏啓用logback記錄

三個必須步驟:

1. 配置 logback 環境。

2. 在每一個須要執行記錄的類裏,調用 org.slf4j.LoggerFactory 類的 getLogger()方法獲

取一個 Logger 實例,以當前類名或類自己做爲參數。

3. 調用取得的 logger 實例的打印方法,即 debug()info()warn() error(),把記錄

輸出到配置裏的各 appender

直接調用JoranConfigurator

Logback 依賴JoranJoran logback-core 的一部分,是個配置類庫。Logback 的默認配置機制是調用JoranConfiguratorclasspath上的默認配置文件進行處理。 無論出於什麼理由,若是你想從新實現 logback 的默認配置機制的話,你能夠直接調用 JoranConfigurator。下面程序 MyApp1 就調用了 JoranConfigurator 對做爲參數傳入的配置文件進行處理。

示例1

(com/ttpod/file/ MyApp1.java)

package com.ttpod.file;

import org.slf4j.Logger;                //用於聲明Logger

import org.slf4j.LoggerFactory;     //用於獲取Logger以及LoggerContext

import ch.qos.logback.classic.LoggerContext;         //用於聲明LoggerContext

import ch.qos.logback.classic.joran.JoranConfigurator; //用於定義Logback的配置機制

import ch.qos.logback.core.joran.spi.JoranException; //用於定義JoranException

import ch.qos.logback.core.util.StatusPrinter; //用於打印logback的內部狀態

public class MyApp1 {

final static Logger logger = LoggerFactory.getLogger(MyApp1.class);    //定義一個全局的記錄器,經過LoggerFactory獲取

public static void main(String[] args) {

    //經過getILoggerFactory()方法獲得logger上下文件環境,logback默認得到當前應用的logger context

LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();    //獲得當前應用中logger上下文

try {

JoranConfigurator configurator = new JoranConfigurator();    //定義一個(JoranConfigurator)配置器

configurator.setContext(context);    //將當前應用的logger context的關聯到到configurator對象

context.reset();                        //清除之前的配置器中的全部內容

//configurator.doConfigure(args[0]);    //接收從命令行傳入的參數,加載配置文件,並設置到配置器

configurator.doConfigure("src/com/ttpod/file/MyApp1Config.xml");

//配置文件的路徑:src/com/ttpod/file/MyApp1Config.xml

} catch (JoranException je) {

logger.error("JoranException occur at:"+je.getMessage());    //將此處異常也記錄到日誌

je.printStackTrace();    //在控制打印出異常跟蹤信息

}

//打印出logger context中的error和供氣ing,在此處做用至關於catch中的je.printStackTrace();

StatusPrinter.printInCaseOfErrorsOrWarnings(context);    

//流程進入有日誌生成的類中

logger.info("Entering application.demo class Foo >>>");    

Foo foo = new Foo();

foo.doIt();    //執行foo中的一個生成了日誌的方法,輸出日誌

logger.info("Exiting application. demo class Foo <<<");

}

}

其它類Foo類,代碼以下:

(com/ttpod/file/ Foo.java)

package com.ttpod.file;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

public class Foo {

static final Logger logger = LoggerFactory.getLogger(Foo.class);

public void doIt() {

logger.debug("test logger in other class!");

}

public void createLoggingRequest() {

     subMethodToCreateRequest();

     }

     //這個方法執行後建立一條異常信息

private void subMethodToCreateRequest() {

logger.error("error-level request", new Exception("test exception"));

}

}

此程序經過參數傳配置文件的名字,對程序的日誌輸出配置,本例以下:

(com/ttpod/file/ MyApp1Config.xml)

<configuration>

<!-- 指定屬性文件路徑 -->

<property file="src/com/ttpod/file/variables.properties" />

 

<!-- 指定日誌輸出到文件-->

<appender name="FILE" class="ch.qos.logback.core.FileAppender">

<file>${destination}</file>

<encoder>

<!-- %msg表示日誌信息,%n表示換行 -->

<pattern>%msg%n</pattern>

</encoder>

</appender>

 

<root level="debug">

<appender-ref ref="FILE" /><!—添加到根logger-->

</root>

</configuration>

對應的properties文件,嵌套的設置了日誌文件的輸出路徑及文件名,以下:

(com/ttpod/file/ variables.properties)

#指定USER_HOME目錄

USER_HOME=./log

 

#指定日誌文件名

fileName=myApp.log

 

#生成日誌文件的目的地

destination=${USER_HOME}/${fileName}

配置好後,右鍵MyApp3 -> run as… -> run configurations -> 選擇MyApp3,arguments ->

配置program Agumentssrc/com/ttpod/MyApp1Config.xml,以指定配置文件,而後運行便可,便可在當前就應用的/log文件夾下生成myApp.log ,輸出以下:

Entering application.demo class Foo >>>

test logger in other class!

Exiting application. demo class Foo <<<

 

運用滾動策略與觸發策略

RollingFileAppender 繼承 FileAppender,可以滾動記錄文件。例如,RollingFileAppender能先記錄到文件"log.txt",而後當符合某個條件時,變成記錄到其餘文件。 RollingFileAppender 有兩個與之互動的重要子組件。第一個是RollingPolicy,負責滾動。第二個是 TriggeringPolicy,決定是否以及什麼時候進行滾動。因此,RollingPolicy 負責"什麼", TriggeringPolicy 負責"什麼時候"。

要想 RollingFileAppender 起做用,必須同時設置 RollingPolicy TriggeringPolicy。不過,若是 RollingPolicy 也實現了 TriggeringPolicy 接口,那麼只須要設置 RollingPolicy

示例2

以下測試程序應用滾動與觸發策略,來處理日誌文件。

com/ttpod/file/MyApp2.java

package com.ttpod.file;

import java.util.Date;

public class MyApp2 {

    static Timer t;

    public static void main(String[] args) {

        // 調用LoggerFactory 類的靜態方法getLogger取得一個Logger實例,

        final Logger logOut = LoggerFactory.getLogger("SystemOut"); // 定義一個名爲SystemOutlogger

        final Logger logErr = LoggerFactory.getLogger("SystemErr"); // 定義一個名爲SystemErrlogger

        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();

        try {

            JoranConfigurator configurator = new JoranConfigurator();

            configurator.setContext(lc);

            lc.reset();

            //configurator.doConfigure(args[0]);

            configurator.doConfigure("src/com/ttpod/file/logback.xml");

        } catch (JoranException je) {

            je.printStackTrace();

        }

        // 打印logback的內部狀態

        StatusPrinter.print(lc);    //固定部分

        t = new Timer(); // 定義一個定時器

        TimerTask tt = new TimerTask() { // 用定義器執行計劃(schedule),並定義一個繼承了TimerTask的匿名內部類

            @Override

            public void run() {

                for (int i = 100; i > 0; i--) {

                    // Timer t=null;

                    MyApp2.t.cancel();

                    logOut.info("測試Logback日誌的使用"); // 定義了一個info級別的日誌消息

                    logErr.error("發生錯誤"); // 定義了一個error級別的日誌消息

                }

                System.out.println("~~~~~~~~~~~~~ ");

            }

        };

        t.schedule(tt, new Date(), 50); // 從當前系統時間開始,每50毫秒執行一次計劃

    }

}

 

// 沒有自定義它的logback所需的配置文件,程序啓動時會自動加載classpath目錄下的查找

// logback-test.xml;若是沒找到則logback-test.xml,則繼續在classpath下查找lobback.xml

此測試類,在定時器中定義了一個執行計劃,按照執行計劃生成日誌文件。在file包中添加相的logback配置文件,以下:

(com/ttpod/file/logback.xml)

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE configuration>

<configuration>

<jmxConfigurator />

<!-- 配置文件路徑 -->

<property file="src/com/ttpod/file/variables.properties" />

<!--logback的版本必須是0.9.21以上才支持-->

<timestamp key="byDay" datePattern="yyyyMMdd"/>

<!-- 控制檯輸出日誌 -->

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">

<layout class="ch.qos.logback.classic.PatternLayout">

<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>

</layout>

</appender>

<!-- 文件輸出日誌 (文件大小策略進行文件輸出,超過指定大小對文件壓縮(.zip)備份)-->

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

    <!-- 文件的路徑及文件名 -->

<File>${USER_HOME}/SystemOut.log</File>

<!-- 定義窗口滾動策略 -->

<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">

    <!-- 每觸發一次,自動壓縮日誌文件,%i1-3之間循環變化 -->

<FileNamePattern>${USER_HOME}/SystemOut_%i.log.zip</FileNamePattern>

<MinIndex>1</MinIndex> <!-- %i的最小值爲1-->

<MaxIndex>3</MaxIndex> <!-- %i的最大值爲3-->

</rollingPolicy>

<!-- 觸發策略,一般rollingPolicytriggeringPolicy聯合使用 -->

<triggeringPolicy

class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">

<MaxFileSize>10KB</MaxFileSize>

</triggeringPolicy>

<!-- 格式化輸出 -->

<!-- %d表示日期,格式爲:yyyy-MM-dd HH:mm:ss.SSS ;%thread:線程名;

    %-5level:從左邊以5個字符的寬度顯示級別; %logger:顯示logger;%msg:日誌消息;%n:換行

<layout class="ch.qos.logback.classic.PatternLayout">

<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>

</layout>

-->

<!-- 或者用下面的形式格式(推薦)-->

<encoder>

        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}%relative%thread%mdc%level%logger%msg</pattern>

        </encoder>

<!-- html文件輸出 -->

<!--

<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">

    <layout class="ch.qos.logback.classic.html.HTMLLayout">

            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}%relative%thread%mdc%level%logger%msg</pattern>

        </layout>

        </encoder>

-->

</appender>

<!-- 輸出ERROR級別的日誌到文件(一樣採用文件大小策略進行文件輸出,超過指定大小對文件壓縮(.zip)備份) -->

<appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">

<filter class="ch.qos.logback.classic.filter.LevelFilter">

<level>ERROR</level> <!-- 指定要對級別爲ERROR日誌信息過濾 -->

<OnMismatch>DENY</OnMismatch>     <!-- 若是不匹配,則拒絕處理 -->

<OnMatch>ACCEPT</OnMatch>         <!-- 若是匹配,則當即處理 -->

</filter>

<File>${USER_HOME}/SystemErr.log</File> <!-- 文件名即路徑 -->

<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">

<FileNamePattern>${USER_HOME}/SystemErr_%i.log.zip</FileNamePattern>

<MinIndex>1</MinIndex>

<MaxIndex>3</MaxIndex>

</rollingPolicy>

<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">

<MaxFileSize>10KB</MaxFileSize>

</triggeringPolicy>

<!-- 格式化輸出 -->

<!--

<layout class="ch.qos.logback.classic.PatternLayout">

<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>

</layout>

-->

<encoder>

        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}%relative%thread%mdc%level%logger%msg</pattern>

        </encoder>

</appender>

<!--這裏指定logger name 是爲jmx設置日誌級別作鋪墊 -->

<!-- 分別將STDOUTFILE appender都添加到自定義的logger中,不然將不會輸出到appender指定的 目的地-->

<logger name="SystemOut" level="INFO">

<appender-ref ref="STDOUT" />

<appender-ref ref="FILE" />

</logger>

<logger name="SystemErr" level="INFO">

<appender-ref ref="STDOUT" />

<appender-ref ref="FILE-ERROR" />

</logger>

</configuration>

執行以上程序,在控制檯也會不斷的輸出如下日誌信息:

14:42:34.875 [Timer-0] INFO SystemOut - 測試Logback日誌的使用

14:42:34.875 [Timer-0] ERROR SystemErr - 發生錯誤

14:42:34.937 [Timer-0] INFO SystemOut - 測試Logback日誌的使用

14:42:34.937 [Timer-0] ERROR SystemErr - 發生錯誤

14:42:35.000 [Timer-0] INFO SystemOut - 測試Logback日誌的使用

14:42:35.000 [Timer-0] ERROR SystemErr - 發生錯誤

14:42:35.062 [Timer-0] INFO SystemOut - 測試Logback日誌的使用

14:42:35.062 [Timer-0] ERROR SystemErr - 發生錯誤

生成的日誌文件以下圖:

 

FixedWindowRollingPolicy當發生滾動時,FixedWindowRollingPolicy 根據以下固定窗口(window)算法重命名文件。 選項"fileNamePattern"表明歸檔(滾動)記錄文件的文件名模式。該選項是必需的,且必需在模式的某處包含標誌"%i"。如示例3中的MyApp3-RollingFixedWindow.xml

TimeBasedRollingPolicy 或許是最受流行的滾動策略。它根據時間來制定滾動策略,例如根據日或月。TimeBasedRollingPolicy 既負責滾動也負責觸發滾動。實際上,TimeBasedRollingPolicy 同時實現了 RollingPolicy 接口和 TriggeringPolicy 接口。和 FixedWindowRollingPolicy同樣,TimeBasedRollingPolicy 也支持自動壓縮文件。若是"fileNamePattern"選項以".gz"或".zip"結尾,就表示須要壓縮。如示例3中的MyApp3-RollingTimeBased.xml

SizeAndTimeBasedFNATP按照日期進行歸檔的同時限制每一個記錄文件的大小,特別是當後處理工具對記錄文件大小有限制時。Logback 爲此提供了 SizeAndTimeBasedFNATP ,它是TimeBasedRollingPolicy 的子組件,FNATP 表明"FNATP stands for File Naming And Triggering Policy"。 下面的例子MyApp3-sizeAndTime.xml演示了基於大小和時間的記錄文件歸檔。

 

示例3

(com/ttpod/file/MyApp3.java)

package com.ttpod.file;

 

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.slf4j.MDC;

 

import ch.qos.logback.classic.LoggerContext;

import ch.qos.logback.classic.joran.JoranConfigurator;

import ch.qos.logback.core.joran.spi.JoranException;

import ch.qos.logback.core.util.StatusPrinter;

import com.ttpod.file.Foo;;

 

public class MyApp3 {

public static void main(String[] args) throws InterruptedException {

Logger logger = (Logger) LoggerFactory.getLogger(MyApp3.class);

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();

try {

JoranConfigurator configurator = new JoranConfigurator();

configurator.setContext(lc);

lc.reset();

configurator.doConfigure(args[0]);

} catch (JoranException je) {

je.printStackTrace();

}    //固定部分

 

//打印logback的內部狀態

StatusPrinter.print(lc);

logger.debug("**Hello {}", new Foo());

//客戶端的每一個記錄請求添加惟一戳(uniquely stamp,運用MDC(Mapped Diagnostic Context)

//在分佈式應用程序中,能夠區分並處理不一樣客戶端的記錄輸出,而不增長logger的開銷

MDC.put("testKey", "testValueFromMDC");        //appender中用%X{testKey},能夠輸出MDCtest對應的值

MDC.put("testKey2", "value2");

for (int i = 0; i < 10; i++) {

logger.debug("logging statement " + i);

Thread.sleep(100);

}

Foo foo = new Foo();

foo.createLoggingRequest();

}

}

配置文件:

(com/ttpod/file/MyApp3-RollingFixedWindow.xml)

<configuration>

<!-- 指定屬性文件路徑 -->

<property file="src/com/ttpod/file/variables.properties" />

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

<file>${USER_HOME}/testFile.log</file>

<!--滾動策略-->

<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">

<!—自動壓縮備份-->

<fileNamePattern>${USER_HOME}/testFile.%i.log.zip</fileNamePattern>

<minIndex>1</minIndex>

<maxIndex>3</maxIndex><!--%i1-3之間循環變化-->

</rollingPolicy>

<!—觸發策略-->

<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">

<!--日誌文件大小限制在5kB之內,不然就觸發滾動-->

<maxFileSize>5kB</maxFileSize>

</triggeringPolicy>

<encoder><!--格式化輸出-->

<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>

</encoder>

</appender>

<root level="DEBUG">

<appender-ref ref="FILE" />

</root>

</configuration>

屢次運行MyApp3,logback配置參數傳入MyApp3-RollingFixedWindow.xml,便可發如今當前應用的log目錄下生成了如:testFile.1.log.ziptestFile.2.log.ziptestFile.3.log.ziptestFile.log文件。備份的壓縮文件中的日誌文件的文件名默認後綴跟了歸檔日期,以下圖:

 

(com/ttpod/file/MyApp3-RollingTimeBased.xml)

<configuration>

<!-- 指定屬性文件路徑 -->

<property file="src/com/ttpod/file/variables.properties" />

 

<!-- 基於時間的滾動策略 -->

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

<file>${USER_HOME}/logFile.log</file>

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

<!-- 天天滾動

<fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>

-->

 

<!-- 每分鐘滾動 -->

<fileNamePattern>${USER_HOME}/logFile.%d{yyyy-MM-dd_HH-mm}.log</fileNamePattern>

 

<!-- 限制文件最大保存時間爲30-->

<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>

<!--

運行:

java chapters.appenders.ConfigurationTester

src/com/ttpod/chapters/appenders/conf/logback-RollingTimeBased.xml

-->

屢次運行MyApp3,logback配置參數傳入MyApp3-RollingTimeBased.xml,若設置一個執行計謀,程序不中止,則每分鐘可觸發一第二天志備份,便可發如今當前應用的log目錄下生成了按配置的格式的文件,如:

 

(com/ttpod/file/MyApp3-sizeAndTime.xml)

<configuration>

<!-- 基於時間與大小的歸檔 -->

<statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />

 

<!-- 指定屬性文件路徑 -->

<property file="src/com/ttpod/file/variables.properties" />

 

<!-- 基於時間與大小的歸檔 -->

<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">

<file>${USER_HOME}/mylog.txt</file>

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

<!-- 天天滾動

<fileNamePattern>${USER_HOME}/mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>

-->

<minIndex>1</minIndex>

<maxIndex>3</maxIndex>

<!-- 每分鐘滾動 -->

<fileNamePattern>${USER_HOME}/mylog-%d{yyyy-MM-dd_HH-mm}.%i.txt</fileNamePattern>

 

<!-- 限制文件最大保存時間爲30-->

<maxHistory>30</maxHistory>

<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">

<!-- 當文件大小超過5kB時觸發滾動,這裏設置5kb只是便於測試 -->

<maxFileSize>5kB</maxFileSize>

</timeBasedFileNamingAndTriggeringPolicy>

</rollingPolicy>

<encoder>

<pattern>%msg%n</pattern>

</encoder>

</appender>

 

<root level="debug">

<appender-ref ref="ROLLING" />

</root>

</configuration>

運行時,logback配置參數傳入src/com/ttpod/file/MyApp3-sizeAndTime.xml便可。當日志文件超過5kB時,或到另外一天時,程序又被執行了,則會觸發滾動,按照此前配置規則備原來的文件。輸出的文件以下圖所示:

 

 

以網頁形式輸出日誌文件

HTMLLayout logback-classic 裏的 HTMLLayout 類似。 默認狀況下,PatternLayout 建立包含下列數據的表格:遠程IP;日期;請求的URL;狀態嗎;Content Length

    如下有個示例,演示以HTMLLayout格式化後,以htm文件輸出日誌。以下:

示例4

(com/ttpod/html/HTMLTest1.java)

package com.ttpod.html;

 

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

 

import ch.qos.logback.classic.LoggerContext;

import ch.qos.logback.classic.joran.JoranConfigurator;

import ch.qos.logback.core.joran.spi.JoranException;

import ch.qos.logback.core.util.StatusPrinter;

 

public class HtmlTest1 {

public static void main(String[] args) throws InterruptedException {

Logger logger = LoggerFactory.getLogger(HtmlTest1.class);

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();

 

try {

JoranConfigurator configurator = new JoranConfigurator();

configurator.setContext(lc);

lc.reset();

configurator.doConfigure(args[0]);

//configurator.doConfigure("./src/com/ttpod/html/htmlLayoutConfig1.xml");

} catch (JoranException je) {

    je.printStackTrace();    //固定部分

}

StatusPrinter.printInCaseOfErrorsOrWarnings(lc);

for (int i = 0; i < 6; i++) {

if (i % 5 == 0) {

logger.warn("a warning message " + i);    //聲明一條warn級別的日誌消息

     //logger.info("a warning message " + i);

} else {

logger.debug("hello world number" + i);

}

}

logger.error("Finish off with fireworks", new Exception("Just testing"));

}

}

 

用如下配置文件格式化輸出到properties文件指向的目的地。

(com/ttpod/html/htmlLayoutConfig1.xml)

<configuration>

<!-- 指定屬性文件路徑 -->

<property file="src/com/ttpod/html/variables.properties" />

 

<!-- 指定日誌輸出到文件-->

<appender name="FILE" class="ch.qos.logback.core.FileAppender">

<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">

<layout class="ch.qos.logback.classic.html.HTMLLayout">

<pattern>%relative%thread%mdc%level%logger%msg</pattern>

</layout>

</encoder>

<file>${destination}</file>

</appender>

 

<root level="DEBUG">

<appender-ref ref="FILE" />

</root>

</configuration>

<!-- 以如下方式運行

java com.ttpod.html.HtmlTest1 src/com/ttpod/html/htmlLayoutConfig1.xml

-->

屬性文件內容以下:

(com/ttpod/html/ variables.properties)

#指定USER_HOME目錄

USER_HOME=./log

 

#指定日誌文件名

fileName=htmlTest.htm

 

#生成日誌文件的目的地

destination=${USER_HOME}/${fileName}

運行html/HTMLTest1,並傳入配置參數:src/com/ttpod/html/htmlLayoutConfig1.xml,能夠發如今在當前應用的/log目錄下生成一個htmlTest.htm日誌文件。輸出日誌結果以下圖:

 

以郵件形式輸出日誌

    以郵件形式輸出日誌,依賴於SMTPAppender SMTPAppender在固定大小的緩衝裏積累記錄時間,當用戶指定的事件發生後,就經過email發出這些事件。默認狀況下,email發送是由級別爲 ERROR 或更高級別的記錄事件觸發的。

    下面的演示程序 chapters.appenders.mail.EMail,生成大量記錄消息,而後生成一個錯誤消息。該程序有兩個參數,第一個是須要生成的記錄消息的數量,第二個是 logback 配置文件。該程序生成的最後一條記錄事件,即 ERROR 級別的事件,將觸發 email的發送。

示例5

(com/ttpod/mail/Email.java)

package com.ttpod.mail;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import ch.qos.logback.classic.LoggerContext;

import ch.qos.logback.classic.joran.JoranConfigurator;

import ch.qos.logback.core.util.StatusPrinter;

public class EMail {

static public void main(String[] args) throws Exception {

if (args.length != 2) {

usage("Wrong number of arguments.");

}

int runLength = Integer.parseInt(args[0]);

String configFile = args[1];

//int runLength = Integer.parseInt("300");

//String configFile="src/com/ttpod/mail/gmailSSL.xml";

//String configFile = "src/com/ttpod/mail/gmailSTARTTLS.xml";

//自定義配置文件,獲得日誌固定格式

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();

JoranConfigurator configurator = new JoranConfigurator();

lc.reset();

configurator.setContext(lc);

configurator.doConfigure(configFile);

Logger logger = LoggerFactory.getLogger(EMail.class);

for (int i = 1; i <= runLength; i++) {

if ((i % 10) < 9) {

logger.debug("This is a debug message. Message number: " + i);

} else {

logger.warn("This is a warning message. Message number: " + i);

}

}

//定義一條error級別的日誌輸出

logger.error("At last an error.", new Exception("Just testing"));

//打印logger內部狀態

StatusPrinter.printInCaseOfErrorsOrWarnings(lc);

}

static void usage(String msg) {    //當參數傳入錯誤時,提供的處理慣例

System.err.println(msg);

System.err.println("Usage: java " + EMail.class.getName() +

" runLength configFile\n" +

" runLength (integer) the number of logs to generate\n" +

" configFile a logback configuration file in XML format." +

" XML files must have a '.xml' extension.");

System.exit(1);    //退出程序

}

}

 

以下配置文件從屬性文件中讀取發送郵件定義的屬性,配置由郵件輸出日誌,以下:

<configuration>

<!-- 指定屬性文件的位置 -->

<property file="src/com/ttpod/mail/gmailSSL.properties" />

 

<!-- 目的指定向emailappender -->

<appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">

<SMTPHost>${SMTPHOST}</SMTPHost><!-- 郵件服務器地址 -->

<SMTPPort>${SMTPPORT}</SMTPPort><!--SMTPPORT端口-->

<SSL>true</SSL>

<Username>${EMAIL_USERNAME}</Username><!-- 用戶名 -->

<Password>${EMAIL_PASSWORD}</Password><!-- 密碼 -->

 

<To>${EMAIL-DESTINATION}</To><!-- 目標接收人 -->

<To>${ANOTHER_EMAIL_DESTINATION}</To> <!-- additional destinations are possible -->

<From>${EMAIL_USERNAME}</From><!-- 發件人 -->

<Subject>TESTING: %logger{20} - %m</Subject><!-- 主題 -->

<encoder><!-- 通常採用這種方式格式化輸出 -->

    <layout class="ch.qos.logback.classic.html.HTMLLayout">

        <!-- 採用什麼渲染方式,這採起的是HTML方式 -->

        <Pattern>%date %-5level %logger - %message%n</Pattern>

    </layout>

</encoder>

<!--

<layout class="ch.qos.logback.classic.PatternLayout">

<Pattern>%date %-5level %logger - %message%n</Pattern>

</layout>

-->

</appender>

 

<!-- 輸出到控制檯,以便將日誌也打印到控制檯-->

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">

    <encoder>

<pattern>

%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n

     </pattern>

</encoder>

</appender>

 

<!-- 輸出到文件,將日誌記錄到本地文件-->

<appender name="FILE" class="ch.qos.logback.core.FileAppender">

<file>./log/mailtest.log</file>

<encoder>

<!-- %msg表示日誌信息,%n表示換行 -->

<pattern>%msg%n</pattern>

</encoder>

</appender>

 

<root level="debug">

<appender-ref ref="EMAIL" />

<appender-ref ref="STDOUT" />

<appender-ref ref="FILE"></appender-ref>

</root>

</configuration>

屬性文件以下設置,以供自定的logback配置文件讀取。

SMTPHOST=smtp.gmail.com

SMTPPORT=465

EMAIL_USERNAME = someone123@gmail.com

EMAIL_PASSWORD = password123

EMAIL-DESTINATION = someone456@ttpod.com

ANOTHER_EMAIL_DESTINATION = some456@126.com

傳入配置文件參數,運行,當出現也error級別以及以上級別的日誌時,就會觸發日誌發送到郵件,但目前此測試例子,可能因爲本地tomcat服務器緩存郵件,以至郵件沒法發送到外網服務器,因此在這裏沒給出具體發送成功的結果。但能夠經過它生成對應的HTML文件,能夠看到郵件內容,以下圖:

    若是未指定選項"Evaluator",則 SMTPAppender 被默認分配一個 OnErrorEveluatorch.qos.logback.classic.boolex.OnErrorEvaluator)實例,當遇到級別爲 ERROR 或更高級別

的事件後,觸發 email 傳輸。此處最後一條消息是一個error級別的記錄,觸發了郵件的發送。

另外,還能夠將日誌寫入數據庫要把記錄事件寫入數據庫,依賴於DBAppender DBAppender把記錄事件寫入數據庫的三張表。三張表分別是 logging_eventlogging_event_property logging_event_exception。在使用 DBAppender 以前,這三張表必須已經被建立。關於將日誌記錄寫入到數據庫中,更多可參考logback手冊中的DBAppender

    編寫此文檔參考了的如下的網站、博客。相關的chm api和參考文檔上傳在服務器\\192.168.1.201上。

Logback官方網站:http://logback.qos.ch/

Slf4j官方網站:http://www.slf4j.org/

參考博客:    Slfj + Logback 時,基本的 logback.xml 配置

            logback.xml配置如何按天輸出日誌文件

            slf4j+logback配置方式,logback.groovy使用備忘

            SLF4J 的幾種實際應用模式--之二:SLF4J+Logback

            logback 學習記錄

相關文章
相關標籤/搜索