commons-logging和log4j

1、日誌系統介紹html

日誌的重要性是隨着系統的膨脹而顯現的,在一個龐大的系統中查錯沒有各類日誌信息是步履維艱的。因此在系統加入日誌是必須的。java

最原始的日誌方式,就是在程序的適當地方添加System.out.println()方法,可是帶來的問題是,系統穩定後,日誌太大,若是要減小日誌量,就須要從新修改程序,雖然只是註釋掉System.out.println()方法。可是萬一系統再次出錯,又要改。mysql

commons-logging提供分級日誌功能,至關於把System.out.println()方法增強了,原來是必定輸出到控制檯,如今commons-logging有6級日誌,可是apache建議使用4級,即ERROR、WARN、INFO、DEBUG。什麼狀況下輸出日誌由程序中寫日誌的方法決定,輸出什麼級別以上的日誌和輸出到哪裏由配置文件決定。web

使用commons-logging以下:sql

//導入類
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class TestLog
{
    //獲取以當前類爲參數的日誌對象
    private static Log log = LogFactory.getLog(TestLog.class);
    public static void main(String[] args){
        //輸出4種不一樣級別的日誌
        log.debug("111");
        log.info("222");
        log.warn("333");
        log.error("444");
    }
}

固然還要配置commons-logging.properties文件,其中定義輸出哪一個級別以上的日誌。略。數據庫

好像這就完了,和log4j沒啥關係。那麼爲何通常系統都會使用commons-logging和log4j兩個包來記錄日誌呢?apache

緣由就是commons-logging的輸出功能比較弱,也就是輸出格式和輸出設備選擇有限,只有原生輸出類org.apache.commons. logging.impl.SimpleLog。可是它提供了一個通用的日誌接口org.apache.commons.logging.log,讓其餘的包來實現複雜的輸出。其中就有Jdk14Logger, Log4JLogger,前面是jdk1.4以後加入的,後面就是log4j中的類。多線程

log4j也能夠直接像commons-logging同樣在程序中定義輸出信息,而後再配置文件中定義輸出級別,可是這樣作就會使程序惟一的和log4j綁定(若是你必定要單獨使用log4j,那麼也是能夠的),並且commons-logging更加智能,幫咱們‘自動選擇’‘適當的’日誌實現系統」:app

1)        首先在classpath下尋找本身的配置文件commons-logging.properties,若是找到,則使用其中定義的Log實現類;socket

2)        若是找不到commons-logging.properties文件,則在查找是否已定義系統環境變量org.apache.commons.logging.Log,找到則使用其定義的Log實現類;

3)        不然,查看classpath中是否有Log4j的包,若是發現,則自動使用Log4j做爲日誌實現類;

4)        不然,使用JDK自身的日誌實現類(JDK1.4之後纔有日誌實現類);

5)        不然,使用commons-logging本身提供的一個簡單的日誌實現類SimpleLog;

(以上順序不保證徹底準確,請參考官方文檔)

因此,在前面程序的基礎上,只要導入log4j的包,則commons-logging會自動使用log4j做爲輸出類,程序不須要任何改動,可是注意:log4j的配置文件log4j.properties對Log4j來講是必須的。若是classpath中沒有該配置文件,或者配置不對,將會引起運行時異常。因此下面介紹log4j.properties的配置。

2、log4j.properties的配置
其實您也能夠徹底不使用配置文件,而是在代碼中配置Log4j環境。可是,使用配置文件將使您的應用程序更加靈活。
Log4j支持兩種配置文件格式,一種是XML格式的文件,一種是properties格式的文件。下面咱們介紹使用properties格式作爲配置文件的方法:
示例:
log4j.rootLogger=INFO, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n

1. 配置根Logger,其語法爲:
log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中,level 是日誌記錄的優先級,分爲OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級別。Log4j建議只使用四個級別,優先級從高到低分別是ERROR、WARN、INFO、DEBUG。經過在這裏定義的級別,您能夠控制到應用程序中相應級別的日誌信息的開關。好比在這裏定義了INFO級別,則應用程序中全部DEBUG級別的日誌信息將不被打印出來。
appenderName就是指定日誌信息輸出到哪一個地方。您能夠同時指定多個輸出目的地。 appenderName是自定義的,可是爲了明瞭,都會使用console,file等特殊名字表示輸出到哪裏去。

2. 配置日誌信息輸出目的地Appender,其語法爲:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1

log4j.appender.appenderName.option = valueN
其中,Log4j提供的appender有如下幾種:
org.apache.log4j.ConsoleAppender(控制檯),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(天天產生一個日誌文件),
org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件),
org.apache.log4j.WriterAppender(將日誌信息以流格式發送到任意指定的地方)
(1).ConsoleAppender選項
Threshold=WARN:指定日誌消息的輸出最低層次。
ImmediateFlush=true:默認值是true,意謂着全部的消息都會被當即輸出。
Target=System.err:默認狀況下是:System.out,指定輸出控制檯
(2).FileAppender 選項
Threshold=WARN:指定日誌消息的輸出最低層次。
ImmediateFlush=true:默認值是true,意謂着全部的消息都會被當即輸出。
File=mylog.txt:指定消息輸出到mylog.txt文件。
Append=false:默認值是true,即將消息增長到指定文件中,false指將消息覆蓋指定的文件內容。
(3).DailyRollingFileAppender 選項
Threshold=WARN:指定日誌消息的輸出最低層次。
ImmediateFlush=true:默認值是true,意謂着全部的消息都會被當即輸出。
File=mylog.txt:指定消息輸出到mylog.txt文件。
Append=false:默認值是true,即將消息增長到指定文件中,false指將消息覆蓋指定的文件內容。
DatePattern=’.'yyyy-ww:每週滾動一次文件,即每週產生一個新的文件。固然也能夠指定按月、周、天、時和分。即對應的格式以下:
  1)’.'yyyy-MM: 每個月
  2)’.'yyyy-ww: 每週
  3)’.'yyyy-MM-dd: 天天
  4)’.'yyyy-MM-dd-a: 天天兩次
  5)’.'yyyy-MM-dd-HH: 每小時
  6)’.'yyyy-MM-dd-HH-mm: 每分鐘
(4).RollingFileAppender 選項
Threshold=WARN:指定日誌消息的輸出最低層次。
ImmediateFlush=true:默認值是true,意謂着全部的消息都會被當即輸出。
File=mylog.txt:指定消息輸出到mylog.txt文件。
Append=false:默認值是true,即將消息增長到指定文件中,false指將消息覆蓋指定的文件內容。
MaxFileSize=100KB: 後綴能夠是KB, MB 或者是 GB. 在日誌文件到達該大小時,將會自動滾動,即將原來的內容移到mylog.log.1文件。
MaxBackupIndex=2:指定能夠產生的滾動文件的最大數。

3. 配置日誌信息的佈局,其語法爲:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1

log4j.appender.appenderName.layout.option = valueN
其中,Log4j提供的layout有如下幾種:
org.apache.log4j.HTMLLayout(以HTML表格形式佈局),
org.apache.log4j.PatternLayout(能夠靈活地指定佈局模式),
org.apache.log4j.SimpleLayout(包含日誌信息的級別和信息字符串),
org.apache.log4j.TTCCLayout(包含日誌產生的時間、線程、類別等等信息)

四、輸出格式設置
在配置文件中能夠經過log4j.appender.A1.layout.ConversionPattern設置日誌輸出格式。
參數:
%p: 輸出日誌信息優先級,即DEBUG,INFO,WARN,ERROR,FATAL,
%d: 輸出日誌時間點的日期或時間,默認格式爲ISO8601,也能夠在其後指定格式,好比:%d{yyy MMM dd HH:mm:ss,SSS},輸出相似:2002年10月18日 22:10:28,921
%r: 輸出自應用啓動到輸出該log信息耗費的毫秒數
%c: 輸出日誌信息所屬的類目,一般就是所在類的全名
%t: 輸出產生該日誌事件的線程名
%l: 輸出日誌事件的發生位置,至關於%C.%M(%F:%L)的組合,包括類目名、發生的線程,以及在代碼中的行數。舉例:Testlog4.main(TestLog4.java:10)
%x: 輸出和當前線程相關聯的NDC(嵌套診斷環境),尤爲用到像java servlets這樣的多客戶多線程的應用中。
%%: 輸出一個」%」字符
%F: 輸出日誌消息產生時所在的文件名稱
%L: 輸出代碼中的行號
%m: 輸出代碼中指定的消息,產生的日誌具體信息
%n: 輸出一個回車換行符,Windows平臺爲」\r\n」,Unix平臺爲」\n」輸出日誌信息換行
能夠在%與模式字符之間加上修飾符來控制其最小寬度、最大寬度、和文本的對齊方式。如:
1)%20c:指定輸出category的名稱,最小的寬度是20,若是category的名稱小於20的話,默認的狀況下右對齊。
2)%-20c:指定輸出category的名稱,最小的寬度是20,若是category的名稱小於20的話,」-」號指定左對齊。
3)%.30c:指定輸出category的名稱,最大的寬度是30,若是category的名稱大於30的話,就會將左邊多出的字符截掉,但小於30的話也不會有空格。
4)%20.30c:若是category的名稱小於20就補空格,而且右對齊,若是其名稱長於30字符,就從左邊交遠銷出的字符截掉。

3、log4j.properties的幾個例子

log4j.rootLogger=DEBUG,CONSOLE,A1,im 
log4j.addivity.org.apache=true
# 應用於控制檯 
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
log4j.appender.Threshold=DEBUG 
log4j.appender.CONSOLE.Target=System.out 
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n 
#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[thread] n%c[CATEGORY]%n%m[MESSAGE]%n%n 
#應用於文件 
log4j.appender.FILE=org.apache.log4j.FileAppender 
log4j.appender.FILE.File=file.log 
log4j.appender.FILE.Append=false
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout 
log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n 
# Use this layout for LogFactor 5 analysis 
# 應用於文件回滾 
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender 
log4j.appender.ROLLING_FILE.Threshold=ERROR 
log4j.appender.ROLLING_FILE.File=rolling.log //文件位置,也能夠用變量${java.home}、rolling.log 
log4j.appender.ROLLING_FILE.Append=true //true:添加 false:覆蓋 
log4j.appender.ROLLING_FILE.MaxFileSize=10KB //文件最大尺寸 
log4j.appender.ROLLING_FILE.MaxBackupIndex=1 //備份數 
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout 
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n 
  
#應用於socket 
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender 
log4j.appender.SOCKET.RemoteHost=localhost 
log4j.appender.SOCKET.Port=5001
log4j.appender.SOCKET.LocationInfo=true
# Set up for Log Facter 5
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout 
log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[thread]%n%c[CATEGORY]%n%m[MESSAGE]%n%n 
  
# Log Factor 5 Appender 
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender 
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
# 發送日誌給郵件 
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender 
log4j.appender.MAIL.Threshold=FATAL 
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=web@www.wuset.com 
log4j.appender.MAIL.SMTPHost=www.wusetu.com 
log4j.appender.MAIL.Subject=Log4J Message 
log4j.appender.MAIL.To=web@www.wusetu.com 
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout 
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n 
# 用於數據庫 
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender 
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test 
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver 
log4j.appender.DATABASE.user=root 
log4j.appender.DATABASE.password= 
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES (’[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n’) 
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout 
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n 
  
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.A1.File=SampleMessages.log4j 
log4j.appender.A1.DatePattern=yyyyMMdd-HH’.log4j’ 
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout 
#自定義Appender 
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender 
log4j.appender.im.host = mail.cybercorlin.net 
log4j.appender.im.username = username 
log4j.appender.im.password = password 
log4j.appender.im.recipient = corlin@cybercorlin.net 
log4j.appender.im.layout=org.apache.log4j.PatternLayout 
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

其中:log4j.addivity.org.apache=true的做用在於 children-logger是否使用 rootLogger的配置,例如 輸出終端。

4、使用日誌的其餘問題

在程序中輸出日誌能夠直接寫 log.debug(theResult); 有些程序又使用if判斷:   

 if (log.isDebugEnabled()) {
        ... do something expensive ...
        log.debug(theResult);
    }
實際上是關於log.debug()參數的問題,若是參數初始化代價大,則先if判斷,避免多餘的初始化,例如多個String對象拼接。若是隻是簡單的傳參,則無所謂使用何種方式。不過有人說爲了統一風格,所有使用if判斷。這個看我的喜歡了。

參考:http://www.cnblogs.com/suman/archive/2010/10/23/1858864.html

http://www.blogjava.net/sy1214520/default.html?page=3

相關文章
相關標籤/搜索