大家都知道,slf4j是原來log4j的作者寫的一個新的日志組件,意思是簡單日志門面接口,可以跟其他日志組件配合使用,常用的配合是slf4j+logback,無論從功能上還是從性能上都較之log4j有了很大的提升,我想很多用戶都已經嘗試,並應用到項目中。
對於日志記錄,說實話,以前用過log4j,但沒有深入研究,用其最簡單的功能。有幸在項目中用到了slf4j,來解決一個稍微復雜點的日志記錄需求。於是便深入研究了下,下邊將自己的研究成果與大家分享:
首先描述下需要解決的問題:
比如有如下包:
com.spike.test.a
com.spike.test.b
com.spike.test.c
com.spike.test.d
com.spike.test
我的配置日志需求:
A. com.spike.test.a的日志級別任意設置,單獨一日志文件,獨立的日志級別。
B. com.spike.test.b的日志級別任意設置,單獨一日志文件,獨立的日志級別。
C. com.spike.test.b的日志級別任意設置,單獨一日志文件,獨立的日志級別。
D. com.spike.test.b的日志級別任意設置,單獨一日志文件,獨立的日志級別。
E. com.spike.test的日志記錄需求:
1)記錄所有的info級別的日志,也就是不記錄debug級別日志,單獨一個日志文件,可以看到整個系統的所有info級別以上的日志記錄。且該配置不受A,B,C,D,E其他配置的任何影響。
2)記錄所有的error級別的日志,也就是不記錄debug,info,warn級別日志,單獨一個日志文件,可以看到整個系統的所有error級別日志記錄。且該配置不受A,B,C,D,E其他配置的任何影響。
一 准備相關工具
1. 從網上下載slf4j組件和logback相關的jar包,很多網站都有,logback可以直接到這個網站下載http://logback.qos.ch/,http://www.slf4j.org/可以直接到這里下載http://www.slf4j.org/。總之,不管在哪里下載,你都需要找到以下幾個jar包(可能根據需要,有個別不需要,這個沒有詳細研究,讀者可以自己研究下):
1) logback-acces-0.9.18.jar
2) logback-classic-0.9.18.jar
3) logback-core-0.9.18.jar
4) slf4j-api-1.5.6.jar
2. 准備測試環境:
1) 建立一個JAVA工程,比如是LogTest,工程整體目錄結構如下(csdn的博客發圖很不方便,也許我不會 用,暫時描述下吧),工程根目錄除了src目錄外,新建一個lib目錄,將上邊4個jar包放入並導入工程。再新建一個config目錄,用於存放日志配 置文件logback.xml,這個文件如何配置,后邊再介紹。
2)建立測試類以及相關包:
包結構以及包類的文件如下:
com.spike.test.a
TestA.java
com.spike.test.b
TestB.java
com.spike.test.c
TestC.java
com.spike.test.d
TestD.java
com.spike.test:
Start.java
其中TestA.java類的測試代碼如下,其他4個類代碼類似:
package com.spike.test.a;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TestA {
private static Logger log = LoggerFactory.getLogger(TestA.class);
public TestA()
{
log.debug("TestA-debug");
log.info("TestA-info");
log.warn("TestA-warn");
log.error("TestA-error");
}
}
目的很簡單,就是在構造函數中打印各種級別的log日志信息,TestB.java如下:
package com.spike.test.b;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TestB {
private static Logger log = LoggerFactory.getLogger(TestB.class);
public TestB()
{
log.debug("TestB-debug");
log.info("TestB-info");
log.warn("TestB-warn");
log.error("TestB-error");
}
}
其他2個文件就不再此列出,大家應該想得到,
啟動類Start.java內容如下:
package com.spike.test;
import com.spike.test.a.TestA;
import com.spike.test.b.TestB;
import com.spike.test.c.TestC;
import com.spike.test.d.TestD;
public class Start {
public static void main(String[] args) {
TestA a = new TestA();
TestB b = new TestB();
TestC c = new TestC();
TestD d = new TestD();
}
}
2. 建立logback.xml配置文件
前面說過了,在config目錄下建立了logback.xml文件,但文件內容沒有介紹,下邊說說:
先介紹最簡單的一個配置,如配置文件內容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<appender name="a" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>./log/mylog_a_debug.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>./log/mylog_a_debug.%i.log</FileNamePattern>
<MinIndex>1</MinIndex>
<MaxIndex>5</MaxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>5MB</MaxFileSize>
</triggeringPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>
</layout>
</appender>
<logger name="com.spike.test.a" level="DEBUG">
<appender-ref ref="a" />
</logger>
</configuration>
配 置的意思是把com.spike.test.a包下的debug級別的日志全部記錄到這個日志文件./log /mylog_a_debug.log中。一個appender代表一個具體的日志配置項目,可以通過name屬性的名字在logger節點中通過 appender-ref引用。具體不細說。
下邊運行下配置結果,看是否跟我們想的一致。
運行前,先要配置個啟動參數,,否則日志直接到控制台了,在ECLIPSE啟動參數里加入如下代碼:
-Dlogback.configurationFile=./config/logback.xml
這個主要是告訴系統日志配置文件放在哪里。
啟動程序運行!
然后到跟/log/目錄下,我們會看到有一個新的文件mylog_a_debug.log,打開看到內容如下:
2009-12-27 09:19:30,718 [main] DEBUG com.spike.test.a.TestA - TestA-debug
2009-12-27 09:19:30,718 [main] INFO com.spike.test.a.TestA - TestA-info
2009-12-27 09:19:30,718 [main] WARN com.spike.test.a.TestA - TestA-warn
2009-12-27 09:19:30,718 [main] ERROR com.spike.test.a.TestA - TestA-error
正好實現我們的簡單需求。
3. 根據我們的真實需求,修改logback.xml文件:
對於A,B,C,D4個日志配置需求,很簡單,直接參考剛才的配置,拷貝三份,修改相關參數就可以實現,這里不再贅述,可以在后邊的配置文件中看到配置。
下邊重點說說需求E的配置:
1) E配置的第一個需求:記錄所有的info級別的日志,也就是不記錄debug級別日志,單獨一個日志文件,可以看到整個系統的所有info級別以上的日志記錄。且該配置不受A,B,C,D,E其他配置的任何影響,我們按常規的配置思路。
首先增加root節點配置,如下:
<root>
<appender-ref ref="all_info" level="INFO" />
</root>
然后增加all_info對應的appender節點的配置,如下:
<appender name="all_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>./log/mylog_all_info.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>./log/mylog_all_info.%i.log</FileNamePattern>
<MinIndex>1</MinIndex>
<MaxIndex>5</MaxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>5MB</MaxFileSize>
</triggeringPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>
</layout>
</appender>
2) E配置的第2個需求:記錄所有的error級別的日志,也就是不記錄debug,info,warn級別日志,單獨一個日志文件,可以看到整個系統的所有error級別日志記錄。且該配置不受A,B,C,D,E其他配置的任何影響,我們參考第一個需求配置如下:
<root>
<appender-ref ref="all_info" level="INFO" />
<appender-ref ref="all_error" level="error" />
</root>
<appender name="all_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>./log/mylog_all_error.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>./log/mylog_all_error.%i.log</FileNamePattern>
<MinIndex>1</MinIndex>
<MaxIndex>5</MaxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>5MB</MaxFileSize>
</triggeringPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>
</layout>
</appender>
OK,全部配置完了,整個logback.xml的配置文件如下:
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<appender name="all_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>./log/mylog_all_error.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>./log/mylog_all_error.%i.log</FileNamePattern>
<MinIndex>1</MinIndex>
<MaxIndex>5</MaxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>5MB</MaxFileSize>
</triggeringPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>
</layout>
</appender>
<appender name="all_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>./log/mylog_all_info.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>./log/mylog_all_info.%i.log</FileNamePattern>
<MinIndex>1</MinIndex>
<MaxIndex>5</MaxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>5MB</MaxFileSize>
</triggeringPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>
</layout>
</appender>
<appender name="a" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>./log/mylog_a_debug.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>./log/mylog_a_debug.%i.log</FileNamePattern>
<MinIndex>1</MinIndex>
<MaxIndex>5</MaxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>5MB</MaxFileSize>
</triggeringPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>
</layout>
</appender>
<appender name="b" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>./log/mylog_b_info.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>./log/mylog_b_info.%i.log</FileNamePattern>
<MinIndex>1</MinIndex>
<MaxIndex>5</MaxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>5MB</MaxFileSize>
</triggeringPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>
</layout>
</appender>
<appender name="c" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>./log/mylog_c_warn.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>./log/mylog_c_warn.%i.log</FileNamePattern>
<MinIndex>1</MinIndex>
<MaxIndex>5</MaxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>5MB</MaxFileSize>
</triggeringPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>
</layout>
</appender>
<appender name="d" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>./log/mylog_d_error.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>./log/mylog_c_error.%i.log</FileNamePattern>
<MinIndex>1</MinIndex>
<MaxIndex>5</MaxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>5MB</MaxFileSize>
</triggeringPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>
</layout>
</appender>
<logger name="com.spike.test.a" level="DEBUG">
<appender-ref ref="a" />
</logger>
<logger name="com.spike.test.b" level="INFO">
<appender-ref ref="b" />
</logger>
<logger name="com.spike.test.c" level="warn">
<appender-ref ref="c" />
</logger>
<logger name="com.spike.test.d" level="error">
<appender-ref ref="d" />
</logger>
<root>
<appender-ref ref="all_info" level="INFO" />
<appender-ref ref="all_error" level="error" />
</root>
</configuration>
下邊我們運行下,看是否正確。
我檢查了下A,B,C,D需求很簡單,都能滿足需求,分別輸出了該包下的所有DEBUG日志,info日志,warn日志,error日志。但是對於E需求問題來了,我看了下mylog_all_error.log文件內容如下:
2009-12-27 09:33:47,156 [main] DEBUG com.spike.test.a.TestA - TestA-debug
2009-12-27 09:33:47,171 [main] INFO com.spike.test.a.TestA - TestA-info
2009-12-27 09:33:47,171 [main] WARN com.spike.test.a.TestA - TestA-warn
2009-12-27 09:33:47,171 [main] ERROR com.spike.test.a.TestA - TestA-error
2009-12-27 09:33:47,171 [main] INFO com.spike.test.b.TestB - TestB-info
2009-12-27 09:33:47,171 [main] WARN com.spike.test.b.TestB - TestB-warn
2009-12-27 09:33:47,171 [main] ERROR com.spike.test.b.TestB - TestB-error
2009-12-27 09:33:47,171 [main] WARN com.spike.test.c.TestC - TestC-warn
2009-12-27 09:33:47,171 [main] ERROR com.spike.test.c.TestC - TestC-error
2009-12-27 09:33:47,187 [main] ERROR com.spike.test.d.TestD - TestD-error
也 就是說,<appender-ref ref="all_error" level="error" /> 這個配置根本沒有效果,而且這里輸出的實際是各個子包配置結果的總和。再看看mylog_all_info.log文件,內容也是跟 mylog_all_error.log文件內容一樣,配置失敗。
后邊經過反復實驗,還是達不到需求。於是在網上,搜索找答案,論壇發貼,在一個csdn朋友的指引下,我到http://logback.qos.ch/manual/filters.html 這個是logback的官方網站,里邊詳細的介紹,不看不知道,一看嚇一跳,內容真豐富,功能真強大,經過認真研究,終於把問題解決,過程不在細說,主要 是通過logback組件的filter來解決,logback提供的filter組件很多,多種類型,而且可以自己定義,實現它的接口即可,功能真是強 大,而且可配置能力強。
下邊說說解決方法:
對於E配置的第一個需求,在其對應的appender配置里增加這個子節點:
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
這個配置官方網站提供的注釋原文如下:
<!-- deny all events with a level below INFO, that is TRACE and DEBUG -->
意思是拒絕那些所有的級別在info以下用於跟蹤和調式的事件。呵呵,后邊的that is TRACE and DEBUG是一個定語從句,對a level進行解釋。
對於E配置的第二個需求,在其對應的appender配置里增加這個子節點:
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
這個filter又不一樣,意思是用於日志級別過濾。
比如這里配置了level級別為ERROR, onMatch表示匹配如何處理,可以根據需求設置接受或拒絕,onMismatch表示不匹配如何處理,具體自行可以設置。
Ok,配置完成。整個logback.xml配置文件內容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<appender name="all_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<File>./log/mylog_all_error.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>./log/mylog_all_error.%i.log</FileNamePattern>
<MinIndex>1</MinIndex>
<MaxIndex>5</MaxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>5MB</MaxFileSize>
</triggeringPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>
</layout>
</appender>
<appender name="all_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<File>./log/mylog_all_info.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>./log/mylog_all_info.%i.log</FileNamePattern>
<MinIndex>1</MinIndex>
<MaxIndex>5</MaxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>5MB</MaxFileSize>
</triggeringPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>
</layout>
</appender>
<appender name="a" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>./log/mylog_a_debug.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>./log/mylog_a_debug.%i.log</FileNamePattern>
<MinIndex>1</MinIndex>
<MaxIndex>5</MaxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>5MB</MaxFileSize>
</triggeringPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>
</layout>
</appender>
<appender name="b" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>./log/mylog_b_info.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>./log/mylog_b_info.%i.log</FileNamePattern>
<MinIndex>1</MinIndex>
<MaxIndex>5</MaxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>5MB</MaxFileSize>
</triggeringPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>
</layout>
</appender>
<appender name="c" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>./log/mylog_c_warn.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>./log/mylog_c_warn.%i.log</FileNamePattern>
<MinIndex>1</MinIndex>
<MaxIndex>5</MaxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>5MB</MaxFileSize>
</triggeringPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>
</layout>
</appender>
<appender name="d" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>./log/mylog_d_error.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>./log/mylog_c_error.%i.log</FileNamePattern>
<MinIndex>1</MinIndex>
<MaxIndex>5</MaxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>5MB</MaxFileSize>
</triggeringPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>
</layout>
</appender>
<logger name="com.spike.test.a" level="DEBUG">
<appender-ref ref="a" />
</logger>
<logger name="com.spike.test.b" level="INFO">
<appender-ref ref="b" />
</logger>
<logger name="com.spike.test.c" level="warn">
<appender-ref ref="c" />
</logger>
<logger name="com.spike.test.d" level="error">
<appender-ref ref="d" />
</logger>
<root>
<appender-ref ref="all_info" level="INFO" />
<appender-ref ref="all_error" />
</root>
</configuration>
運行最后結果查看:
mylog_all_error.log文件內容如下:
2009-12-27 09:51:40,875 [main] ERROR com.spike.test.a.TestA - TestA-error
2009-12-27 09:51:40,875 [main] ERROR com.spike.test.b.TestB - TestB-error
2009-12-27 09:51:40,890 [main] ERROR com.spike.test.c.TestC - TestC-error
2009-12-27 09:51:40,890 [main] ERROR com.spike.test.d.TestD - TestD-error
OK,全部ERROR都輸出,滿足需求。
mylog_all_info.log文件內容如下:
2009-12-27 09:51:40,875 [main] INFO com.spike.test.a.TestA - TestA-info
2009-12-27 09:51:40,875 [main] WARN com.spike.test.a.TestA - TestA-warn
2009-12-27 09:51:40,875 [main] ERROR com.spike.test.a.TestA - TestA-error
2009-12-27 09:51:40,875 [main] INFO com.spike.test.b.TestB - TestB-info
2009-12-27 09:51:40,875 [main] WARN com.spike.test.b.TestB - TestB-warn
2009-12-27 09:51:40,875 [main] ERROR com.spike.test.b.TestB - TestB-error
2009-12-27 09:51:40,875 [main] WARN com.spike.test.c.TestC - TestC-warn
2009-12-27 09:51:40,890 [main] ERROR com.spike.test.c.TestC - TestC-error
2009-12-27 09:51:40,890 [main] ERROR com.spike.test.d.TestD - TestD-error
Ok,不再有DEBUG級別的日志了。滿足需求。
再檢查下A,B,C,D需求,都已經實現。
終於完成了,歡迎讀者朋友對文中的內容進行批評指正。
Logback是由log4j創始人Ceki Gülcü設計的又一個開源日志組件。logback當前分成三個模塊:logback-core,logback- classic和logback-access。
2、Logback的核心對象:Logger、Appender、Layout
Logback主要建立於Logger、Appender 和 Layout 這三個類之上。
Logger:日志的記錄器,把它關聯到應用的對應的context上后,主要用於存放日志對象,也可以定義日志類型、級別。Logger對象一般多定義為靜態常量,如:
1 package com.logs; 2 3 import org.slf4j.Logger; 4 import org.slf4j.LoggerFactory; 5 6 public class MyApp { 7 final static Logger logger = LoggerFactory.getLogger("MyApp.class"); 8 public static void main(String[] args) { 9 10 logger.trace("trace"); 11 logger.debug("debug str"); 12 logger.info("info str"); 13 logger.warn("warn"); 14 logger.error("error"); 15 } 16 }
Appender:用於指定日志輸出的目的地,目的地可以是控制台、文件、遠程套接字服務器、 MySQL、 PostreSQL、Oracle和其他數據庫、 JMS和遠程UNIX Syslog守護進程等。
Layout:負責把事件轉換成字符串,格式化的日志信息的輸出。具體的Layout通配符,可以直接查看幫助文檔。
3、Level 有效級別
Logger可以被分配級別。級別包括:TRACE、DEBUG、INFO、WARN和ERROR,定義於ch.qos.logback.classic.Level類。程序會打印高於或等於所設置級別的日志,設置的日志等級越高,打印出來的日志就越少。如果設置級別為INFO,則優先級高於等於INFO級別(如:INFO、 WARN、ERROR)的日志信息將可以被輸出,小於該級別的如DEBUG將不會被輸出。為確保所有logger都能夠最終繼承一個級別,根logger總是有級別,默認情況下,這個級別是DEBUG。
4、 三值邏輯
Logback的過濾器基於三 值邏輯(ternary logic),允許把它們組裝或成鏈,從而組成任意的復合過濾策略。過濾器很大程度上受到Linux的iptables啟發。這里的所謂三值邏輯是說,過 濾器的返回值只能是ACCEPT、DENY和NEUTRAL的其中一個。
如果返回DENY,那么記錄事件立即被拋棄,不再經過剩余過濾器;
如果返回NEUTRAL,那么有序列表里的下一個過濾器會接着處理記錄事件;
如果返回ACCEPT,那么記錄事件被立即處理,不再經過剩余過濾器。
5、Filter 過濾器
Logback-classic提供兩種類型的過濾器:常規過濾器和TuroboFilter過濾器。Logback整體流程:Logger 產生日志信息;Layout修飾這條msg的顯示格式;Filter過濾顯示的內容;Appender具體的顯示,即保存這日志信息的地方。
6、具體使用案例
Java項目中一般都會應用比如struts、spring、hibernate等開源框架,而這些框架很多是應用log4j記錄日志的,所以我們考慮用log4j + slf4j + logback 。這樣我們需要導入log4j-over-slf4j-1.6.4.jar 、logback-classic-1.0.1.jar 、logback-core-1.0.1.jar 、slf4j-api-1.6.4.jar ,如果你要用到EvaluatorFilter過濾器來過濾日志Msg中的特殊字符需要導入其依賴包 janino-2.3.2.jar。其logback.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <configuration> 3 4 <!-- 控制台輸出 --> 5 <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> 6 <encoder> 7 <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern> 8 </encoder> 9 </appender> 10 11 <!-- 時間滾動輸出 level為 DEBUG 日志 --> 12 <appender name="file—debug" 13 class="ch.qos.logback.core.rolling.RollingFileAppender"> 14 <filter class="ch.qos.logback.classic.filter.LevelFilter"> 15 <level>DEBUG</level> 16 <onMatch>ACCEPT</onMatch> 17 <onMismatch>DENY </onMismatch> 18 </filter> 19 <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 20 <FileNamePattern>D:/logs/debug.%d{yyyy-MM-dd}.log</FileNamePattern> 21 <MaxHistory>30</MaxHistory> 22 </rollingPolicy> 23 <encoder> 24 <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern> 25 </encoder> 26 </appender> 27 28 <!-- 時間滾動輸出 level為 ERROR 日志 --> 29 <appender name="file—error" 30 class="ch.qos.logback.core.rolling.RollingFileAppender"> 31 <filter class="ch.qos.logback.classic.filter.LevelFilter"> 32 <level>ERROR</level> 33 <onMatch>ACCEPT</onMatch> 34 <onMismatch>DENY </onMismatch> 35 </filter> 36 <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 37 <FileNamePattern>D:/logs/error.%d{yyyy-MM-dd}.log</FileNamePattern> 38 <MaxHistory>30</MaxHistory> 39 </rollingPolicy> 40 <encoder> 41 <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern> 42 </encoder> 43 </appender> 44 45 <!-- 特定過濾含有某字符串的日志 --> 46 <appender name="file-str" 47 class="ch.qos.logback.core.rolling.RollingFileAppender"> 48 <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> 49 <evaluator> 50 <expression>message.contains("str")</expression> 51 </evaluator> 52 <onMatch>ACCEPT</onMatch> 53 <onMismatch>DENY</onMismatch> 54 </filter> 55 <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 56 <FileNamePattern>D:/logs/contains.%d{yyyy-MM-dd}.log 57 </FileNamePattern> 58 <MaxHistory>30</MaxHistory> 59 </rollingPolicy> 60 <encoder> 61 <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern> 62 </encoder> 63 </appender> 64 65 <!-- 數據庫輸出 --> 66 <appender name="db" class="ch.qos.logback.classic.db.DBAppender"> 67 <connectionSource 68 class="ch.qos.logback.core.db.DriverManagerConnectionSource"> 69 <driverClass>com.mysql.jdbc.Driver</driverClass> 70 <url>jdbc:mysql://host_name:3306/datebase_name</url> 71 <user>username</user> 72 <password>password</password> 73 </connectionSource> 74 </appender> 75 76 <logger name="java.sql.Connection"> 77 <level value="DEBUG" /> 78 </logger> 79 <logger name="java.sql.Statement"> 80 <level value="DEBUG" /> 81 </logger> 82 <logger name="com.ibatis"> 83 <level value="DEBUG" /> 84 </logger> 85 <logger name="com.ibatis.common.jdbc.SimpleDataSource"> 86 <level value="DEBUG" /> 87 </logger> 88 <logger name="com.ibatis.common.jdbc.ScriptRunner"> 89 <level value="DEBUG" /> 90 </logger> 91 <logger name="com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate"> 92 <level value="DEBUG" /> 93 </logger> 94 <logger name="com.danga.MemCached"> 95 <level value="INFO" /> 96 </logger> 97 <logger name="org.springframework.test"> 98 <level value="DEBUG" /> 99 </logger> 100 <logger name="org.apache.struts2"> 101 <level value="DEBUG" /> 102 </logger> 103 104 <root level="DEBUG"> 105 <appender-ref ref="stdout" /> 106 <appender-ref ref="file—debug" /> 107 <appender-ref ref="file—error" /> 108 <appender-ref ref="file-str" /> 109 <appender-ref ref="db" /> 110 </root> 111 112 </configuration>

