天天看點

logback slf4j管理 日志

注:使用logback和log4j十分相似, log4j的屬性配置檔案可以通過工具http://logback.qos.ch/translator/轉換為logback的配置檔案放到類路徑裡面去,另外再将logback的類庫logback-core,logback-classic加入到類路徑中去就搞定了。

一、下載下傳元件:

slf4j:http://www.slf4j.org/download.html

logback:http://logback.qos.ch/download.html

logback 分為三個子產品:logback-core,logback-classic,logback-access

logback-core 是核心;

logback-classic 改善了 log4j,且自身實作了 slf4j api,是以即使用 logback 你仍然可以使用其他的日志實作,如原始的 log4j,java.util.logging 等;

logback-access 讓你友善的通路日志資訊,如通過 http 的方式。

二、配置資訊

需要的配置檔案群組件包,下面三個 jar 檔案和一個 xml檔案都是要放在項目的 classpath上

slf4j-api-1.6.1.jar

logback-classic-0.9.24.jar

logback-core-0.9.24.jar

一個示例logback.xml

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

<configuration>

    <!-- 控制台輸出日志 -->

    <appender name="stdout" class="ch.qos.logback.core.consoleappender">

        <encoder>

            <pattern>%d{mm:ss} %-5level %logger{36} >>> %msg%n</pattern>

        </encoder>

    </appender>

    <!--每天生成一個日志檔案,儲存30天的日志檔案。-->

    <appender name="dayfile" class="ch.qos.logback.core.rolling.rollingfileappender">

        <rollingpolicy class="ch.qos.logback.core.rolling.timebasedrollingpolicy">

            <filenamepattern>logs/logfile.%d{yyyy-mm-dd}.log</filenamepattern>

            <maxhistory>30</maxhistory>

        </rollingpolicy>

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

    <!--指定logger name為包名或類全名 指定級别 additivity設定是否傳遞到root logger -->

    <logger name="slf4j" level="info" additivity="false">

        <appender-ref ref="stdout"/>

        <appender-ref ref="dayfile"/>

    </logger>

    <!--slf4j2包下的類在error級别時候傳遞到root logger中-->

    <logger name="slf4j2" level="error" />

    <!--根logger控制-->

    <root level="warn">

        <appender-ref ref="stdout" />

    </root>

</configuration>

三、示例代碼

   同slf4j整合log4j的代碼完全一樣,由于使用了slf4j日志門面接口故代碼無需任何改變,隻需要改變類庫和配置檔案即可。

配置檔案詳解:

一:根節點<configuration>包含的屬性:

scan:

當此屬性設定為true時,配置檔案如果發生改變,将會被重新加載,預設值為true。

scanperiod:

設定監測配置檔案是否有修改的時間間隔,如果沒有給出時間機關,預設機關是毫秒。當scan為true時,此屬性生效。預設的時間間隔為1分鐘。

debug:

當此屬性設定為true時,将列印出logback内部日志資訊,實時檢視logback運作狀态。預設值為false。

例如:

xml代碼 

<configuration scan="true" scanperiod="60 seconds" debug="false">  

      <!-- 其他配置省略-->  

</configuration>  

二:根節點<configuration>的子節點:

2.1設定上下文名稱:<contextname>

每個logger都關聯到logger上下文,預設上下文名稱為“default”。但可以使用<contextname>設定成其他名字,用于區分不同應用程式的記錄。一旦設定,不能修改。

xml代碼

      <contextname>myappname</contextname>  

2.2設定變量: <property>

用來定義變量值的标簽,<property> 有兩個屬性,name和value;其中name的值是變量的名稱,value的值時變量定義的值。通過<property>定義的值會被插入到logger上下文中。定義變量後,可以使“${}”來使用變量。

例如使用<property>定義上下文名稱,然後在<contentname>設定logger上下文時使用。

      <property name="app_name" value="myappname" />   

      <contextname>${app_name}</contextname>  

</configuration>   

2.3擷取時間戳字元串:<timestamp>

兩個屬性 key:辨別此<timestamp> 的名字;datepattern:設定将目前時間(解析配置檔案的時間)轉換為字元串的模式,遵循java.txt.simpledateformat的格式。

        例如将解析配置檔案的時間作為上下文名稱:

      <timestamp key="bysecond" datepattern="yyyymmdd't'hhmmss"/>   

      <contextname>${bysecond}</contextname>  

2.4設定loger:

<loger>

用來設定某一個包或者具體的某一個類的日志列印級别、以及指定<appender>。<loger>僅有一個name屬性,一個可選的level和一個可選的addtivity屬性。

name:

用來指定受此loger限制的某一個包或者具體的某一個類。

level:

用來設定列印級别,大小寫無關:trace, debug, info, warn, error, all 和 off,還有一個特俗值inherited或者同義詞null,代表強制執行上級的級别。

如果未設定此屬性,那麼目前loger将會繼承上級的級别。

addtivity:

是否向上級loger傳遞列印資訊。預設是true。

<loger>可以包含零個或多個<appender-ref>元素,辨別這個appender将會添加到這個loger。

<root>

也是<loger>元素,但是它是根loger。隻有一個level屬性,應為已經被命名為"root".

用來設定列印級别,大小寫無關:trace, debug, info, warn, error, all 和 off,不能設定為inherited或者同義詞null。

預設是debug。

<root>可以包含零個或多個<appender-ref>元素,辨別這個appender将會添加到這個loger。

logbackdemo.java類

java代碼

package logback;  

import org.slf4j.logger;  

import org.slf4j.loggerfactory;  

public class logbackdemo {  

    private static logger log = loggerfactory.getlogger(logbackdemo.class);  

    public static void main(string[] args) {  

        log.trace("======trace");  

        log.debug("======debug");  

        log.info("======info");  

        log.warn("======warn");  

        log.error("======error");  

    }  

}

logback.xml配置檔案

第1種:隻配置root

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

  <root level="info">             

    <appender-ref ref="stdout" />   

  </root>     

 </configuration>  

 其中appender的配置表示列印到控制台(稍後詳細講解appender );

<root level="info">将root的列印級别設定為“info”,指定了名字為“stdout”的appender。

當執行logback.logbackdemo類的main方法時,root将級别為“info”及大于“info”的日志資訊交給已經配置好的名為“stdout”的appender處理,“stdout”appender将資訊列印到控制台;

列印結果如下:

13:30:38.484 [main] info  logback.logbackdemo - ======info  

13:30:38.500 [main] warn  logback.logbackdemo - ======warn  

13:30:38.500 [main] error logback.logbackdemo - ======error  

  第2種:帶有loger的配置,不指定級别,不指定appender,

  <!-- logback為java中的包 -->   

  <logger name="logback"/>   

  <root level="debug">             

<logger name="logback" />将控制logback包下的所有類的日志的列印,但是并沒用設定列印級别,是以繼承他的上級<root>的日志級别“debug”;

沒有設定addtivity,預設為true,将此loger的列印資訊向上級傳遞;

沒有設定appender,此loger本身不列印任何資訊。

<root level="debug">将root的列印級别設定為“debug”,指定了名字為“stdout”的appender。

當執行logback.logbackdemo類的main方法時,因為logbackdemo 在包logback中,是以首先執行<logger name="logback" />,将級别為“debug”及大于“debug”的日志資訊傳遞給root,本身并不列印;

root接到下級傳遞的資訊,交給已經配置好的名為“stdout”的appender處理,“stdout”appender将資訊列印到控制台;

13:19:15.406 [main] debug logback.logbackdemo - ======debug  

13:19:15.406 [main] info  logback.logbackdemo - ======info  

13:19:15.406 [main] warn  logback.logbackdemo - ======warn  

13:19:15.406 [main] error logback.logbackdemo - ======error  

 第3種:帶有多個loger的配置,指定級别,指定appender  

   <appender name="stdout" class="ch.qos.logback.core.consoleappender">   

  <!--logback.logbackdemo:類的全路徑 -->   

  <logger name="logback.logbackdemo" level="info" additivity="false">  

    <appender-ref ref="stdout"/>  

  </logger>   

  <root level="error">             

其中appender的配置表示列印到控制台(稍後詳細講解appender );

 <logger name="logback.logbackdemo" level="info" additivity="false">控制logback.logbackdemo類的日志列印,列印級别為“info”;

additivity屬性為false,表示此loger的列印資訊不再向上級傳遞,

指定了名字為“stdout”的appender。

<root level="debug">将root的列印級别設定為“error”,指定了名字為“stdout”的appender。

 當執行logback.logbackdemo類的main方法時,先執行<logger name="logback.logbackdemo" level="info" additivity="false">,将級别為“info”及大于“info”的日志資訊交給此loger指定的名為“stdout”的appender處理,在控制台中打出日志,不再向次loger的上級 <logger

name="logback"/> 傳遞列印資訊;

<logger name="logback"/>未接到任何列印資訊,當然也不會給它的上級root傳遞任何列印資訊;

列印結果如下:  

14:05:35.937 [main] info  logback.logbackdemo - ======info  

14:05:35.937 [main] warn  logback.logbackdemo - ======warn  

14:05:35.937 [main] error logback.logbackdemo - ======error  

 如果将<logger name="logback.logbackdemo" level="info" additivity="false">修改為 <logger name="logback.logbackdemo" level="info" additivity="true">那列印結果将是什麼呢?

沒錯,日志列印了兩次,想必大家都知道原因了,因為列印資訊向上級傳遞,logger本身列印一次,root接到後又列印一次

14:09:01.531 [main] info  logback.logbackdemo - ======info  

14:09:01.531 [main] warn  logback.logbackdemo - ======warn  

14:09:01.531 [main] error logback.logbackdemo - ======error  

***********************************************詳解 <appender>>******************************************

<appender>:

<appender>是<configuration>的子節點,是負責寫日志的元件。

<appender>有兩個必要屬性name和class。name指定appender名稱,class指定appender的全限定名。

1.consoleappender:

把日志添加到控制台,有以下子節點:

<encoder>:對日志進行格式化。(具體參數稍後講解 )

<target>:字元串 system.out 或者 system.err ,預設 system.out ;

<configuration>  

  <appender name="stdout" 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>  

2.fileappender:

把日志添加到檔案,有以下子節點:

<file>:被寫入的檔案名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動建立,沒有預設值。

<append>:如果是 true,日志被追加到檔案結尾,如果是 false,清空現存檔案,預設是true。

<encoder>:對記錄事件進行格式化。(具體參數稍後講解 )

<prudent>:如果是 true,日志會被安全的寫入檔案,即使其他的fileappender也在向此檔案做寫入操作,效率低,預設是 false。

  <appender name="file" class="ch.qos.logback.core.fileappender">  

    <file>testfile.log</file>  

    <append>true</append>  

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

    <appender-ref ref="file" />  

3.rollingfileappender:

滾動記錄檔案,先将日志記錄到指定檔案,當符合某個條件時,将日志記錄到其他檔案。有以下子節點:

<rollingpolicy>:當發生滾動時,決定 rollingfileappender 的行為,涉及檔案移動和重命名。

<triggeringpolicy >: 告知 rollingfileappender 合适激活滾動。

<prudent>:當為true時,不支援fixedwindowrollingpolicy。支援timebasedrollingpolicy,但是有兩個限制,1不支援也不允許檔案壓縮,2不能設定file屬性,必須留白。

rollingpolicy:

timebasedrollingpolicy: 最常用的滾動政策,它根據時間來制定滾動政策,既負責滾動也負責出發滾動。有以下子節點:

<filenamepattern>:

必要節點,包含檔案名及“%d”轉換符, “%d”可以包含一個java.text.simpledateformat指定的時間格式,如:%d{yyyy-mm}。如果直接使用 %d,預設格式是 yyyy-mm-dd。rollingfileappender 的file位元組點可有可無,通過設定file,可以為活動檔案和歸檔檔案指定不同位置,目前日志總是記錄到file指定的檔案(活動檔案),活動檔案的名字不會改變;如果沒設定file,活動檔案的名字會根據filenamepattern

的值,每隔一段時間改變一次。“/”或者“\”會被當做目錄分隔符。

<maxhistory>:

可選節點,控制保留的歸檔檔案的最大數量,超出數量就删除舊檔案。假設設定每個月滾動,且<maxhistory>是6,則隻儲存最近6個月的檔案,删除之前的舊檔案。注意,删除舊檔案是,那些為了歸檔而建立的目錄也會被删除。

fixedwindowrollingpolicy: 根據固定視窗算法重命名檔案的滾動政策。有以下子節點:

<minindex>:視窗索引最小值

<maxindex>:視窗索引最大值,當使用者指定的視窗過大時,會自動将視窗設定為12。

<filenamepattern >:

必須包含“%i”例如,假設最小值和最大值分别為1和2,命名模式為 mylog%i.log,會産生歸檔檔案mylog1.log和mylog2.log。還可以指定檔案壓縮選項,例如,mylog%i.log.gz 或者 沒有log%i.log.zip

triggeringpolicy:

sizebasedtriggeringpolicy: 檢視目前活動檔案的大小,如果超過指定大小會告知rollingfileappender 觸發目前活動檔案滾動。隻有一個節點:

<maxfilesize>:這是活動檔案的大小,預設值是10mb。

例如:每天生成一個日志檔案,儲存30天的日志檔案。

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

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

  </appender>    

  <root level="debug">   

    <appender-ref ref="file" />   

  </root>   

  例如:按照固定視窗模式生成日志檔案,當檔案大于20mb時,生成新的日志檔案。視窗大小是1到3,當儲存了3個歸檔檔案後,将覆寫最早的日志。

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

    <triggeringpolicy class="ch.qos.logback.core.rolling.sizebasedtriggeringpolicy">   

      <maxfilesize>5mb</maxfilesize>   

    </triggeringpolicy>   

4.另外還有socketappender、smtpappender、dbappender、syslogappender、siftingappender,可以參考官方文檔。當然大家可以編寫自己的appender。

<encoder>:

負責兩件事,一是把日志資訊轉換成位元組數組,二是把位元組數組寫入到輸出流。

目前patternlayoutencoder 是唯一有用的且預設的encoder ,有一個<pattern>節點,用來設定日志的輸入格式。使用“%”加“轉換符”方式,如果要輸出“%”,則必須用“\”對“\%”進行轉義。

<encoder>   

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

</encoder  

<filter>:

過濾器,執行一個過濾器會有傳回個枚舉值,即deny,neutral,accept其中之一。傳回deny,日志将立即被抛棄不再經過其他過濾器;傳回neutral,有序清單裡的下個過濾器過接着處理日志;傳回accept,日志會被立即處理,不再經過剩餘過濾器。

過濾器被添加到<appender> 中,為<appender> 添加一個或多個過濾器後,可以用任意條件對日志進行過濾。<appender> 有多個過濾器時,按照配置順序執行。

關于<filter>的詳細使用資訊請大家參見官網。