注:使用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>的詳細使用資訊請大家參見官網。