Log4J基礎詳解及示例大全

jopen 12年前發布 | 121K 次閱讀 日志處理 log4j

去年這個時候,為做軟件工程的大作業就詳細學過Log4J的用法了,時隔一年想要在新的項目中好好使用一下的時候,發現幾乎全忘了,悲催啊……

再上網查資料,總是不能找到一篇符合我的口味,拿來就能輕松上手,方便查閱的文章。看了幾篇網文以及Apache的官方文檔,耐心的總結了一下,貼出來分享,也方便自己以后查閱!

著急的話,可以直接從第8部分配置文件示例中截取一段配置文件拿去用就好啦~(可能還需要看一眼第7部分回顧一下基本使用方法。)

 

log4j主要由三大組件組成:loggers,appenders和layouts。

Log4J基礎詳解及示例大全

1.      定義日志組件logger

每個logger都可以擁有一個或者多個appender,每個appender表示一個日志的輸出目的地,比如console或者某個文件。

配置root Logger的語法為:

log4j.rootLogger=[priority],appenderName,appenderName,...­

配置自定義Logger組件的語法為:

log4j.logger.loggerName=[priority],appenderName,appenderName,...­

 

log4j.rootLogger=INFO,stdout , R

此句為將等級為INFO的日志信息輸出到stdoutR這兩個目的地,stdoutR的定義在下面的代碼,可以任意起名。

日志等級可分為OFFFATALERRORWARNINFODEBUGALL,如果配置OFF則不打出任何信息。

默認情況下,loggeradditive標志被設置為true,表示未被分配levellogger將繼承離他最近的父logger的所有appenders。該選項可以被重新設置,表示子logger將不再繼承父loggerappenders

 

log4j.logger.myLogger=WARN­

自定義了一個Logger組件,名稱為myLogger,日志級別為WARN

 

2.      配置輸出目的地appender

appender的任務是把layout格式化好的輸出內容送往指定的目的地。每個appender都和一個layout相聯系;layout的任務是格式化用戶的logging request。

 

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

此句為定義名為stdout的輸出目的地是哪種類型,可以是

 

org.apache.log4j.ConsoleAppender(控制臺),

org.apache.log4j.FileAppender(文件),

org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件),

org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件)

org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方)

各種類型的Appender有特定的配置選項;具體可參照本文最后的示例,或查看官方文檔。

3.      指定layout類型

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

此句為定義名為stdout的輸出端的layout是哪種類型,可以是

 

org.apache.log4j.HTMLLayout(以HTML表格形式布局),

org.apache.log4j.PatternLayout(可以靈活地指定布局模式),

org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串),

org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息)

4.      具體格式

log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n

如果使用pattern布局就要指定的打印信息的具體格式ConversionPattern,打印參數如下:

 

l   [QC]是log信息的開頭,可以為任意字符,例如項目簡稱。

l   %p: 輸出日志信息優先級,即DEBUG,INFO,WARN,ERROR,FATAL,

l   %d: 輸出日志時間點的日期或時間,默認格式為ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921

l   %r: 輸出自應用啟動到輸出該log信息耗費的毫秒數

l   %c: 輸出日志信息所屬的類目,通常就是所在類的全名

l   %t: 輸出產生該日志事件的線程名

l   %l: 輸出日志事件的發生位置,相當于%C.%M(%F:%L)的組合,包括類目名、發生的線程,以及在代碼中的行數。舉例:Testlog4.main (TestLog4.java:10)

l   %x: 輸出和當前線程相關聯的NDC(嵌套診斷環境),尤其用到像java servlets這樣的多客戶多線程的應用中。

l   %%: 輸出一個"%"字符

l   %F: 輸出日志消息產生時所在的文件名稱

l   %L: 輸出代碼中的行號

l   %m: 輸出代碼中指定的消息,產生的日志具體信息

l   %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字符,就從左邊較遠輸出的字符截掉。

 

5.      繼承關系

Log4J提供了一個root Logger,它是所有Logger組件的“祖先”,它永遠存在,且不能通過名字檢索或引用,通過Logger.getRootLogger()方法取得它。

可在配置文件中方便地配置存在繼承關系的Logger組件,凡是在符號“.”后面的組件都會成為在符號“.”前面的Logger組件的子類。例如:­

   log4j.apache.myLogger=WARN­

   log4j.apache.myLogger.mySonLogger=,file­

以上代碼中, mySonLogger是myLogger的子類Logger組件。

 

6.      以包為單位指定日志等級

log4j.logger.com.neareast =DEBUG

log4j.logger.org.apache.struts=WARN

指定com.neareast包下的所有類的等級為DEBUG。

指定struts 包下的所有類的等級為WARN。

 

7.       基本使用方法

通常會見到兩種使用方法:

1、使用org.apache.commons.logging.Log類:

例如private final Log log = LogFactory.getLog(getClass());

2、直接使用log4j的Logger類:

獲得rootLogger:Logger rootLogger=Logger.getRootLogger();­

獲得自定義Logger:Logger myLogger =Logger.getLogger("log4j.logger.myLogger");­

 

Logger由一個String類的名字識別,根logger(root logger)是所有logger的祖先,它具有如下屬性:1)它總是存在的;2)它不可以通過名字獲得。

public staticLogger Logger.getLogger(Class clazz)相當于調用Logger.getLogger(clazz.getName()),該方法被認為是目前所知的最理智的命名logger的方法。

 

兩種方法的區別:

LogFactory來自common-logging包。如果用LogFactory.getLog:

優點:你可以用任何實現了通用日志接口的日志記錄器替換log4j,而程序不受影響。

缺點:需要多一個common-logging包,這勉強算一個缺點。

 

Logger來自log4j自己的包。如果用Logger.getLogger:

優點:你只需要一個log4j的jar包。

缺點:你只能用log4j作為日志記錄器,因為log4j已經硬編碼進你的系統了。

apache的common-logging包是通用日志接口,通過這個中間層,你可以通過其配置文件commons-logging.properties,來指定到底用哪個日志系統,以此增加系統的靈活性。

另:

         為盡可能的提高系統性能,減小不必要的性能損耗,使用類似下面的判斷可以在某級別的日志被關閉時,避免隱性的性能損耗(即使不需要輸出日志,大量debug等語句的參數處理也需要消耗可觀的計算量):

if(logger.isDebugEnabled() {
    logger.debug("Entry number: " + i + " is " +String.valueOf(entry[i]));
}

8.       配置文件示例

log4j.rootLogger=DEBUG,CONSOLE,DATABASE,FILE,ROLLING_FILE
log4j.addivity.org.apache=true

應用于控制臺

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.Threshold=INFO log4j.appender.CONSOLE.Target=System.out log4j.appender.CONSOLE.Encoding=GBK 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.DATABASE=org.apache.log4j.jdbc.JDBCAppender log4j.appender.DATABASE.URL=jdbc:oracle:thin:@90.0.12.20:1521:ORCL log4j.appender.DATABASE.driver=oracle.jdbc.driver.OracleDriver log4j.appender.DATABASE.user=Nation log4j.appender.DATABASE.password=1 log4j.appender.CONSOLE.Threshold=WARN log4j.appender.DATABASE.sql=INSERT INTO LOG4J(stamp,thread,infolevel,class,messages) VALUES ('%d{yyyy-MM-dd HH:mm:ss}', '%t', '%p', '%l','%m')

INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c%x - %m%n')

寫入數據庫中的表LOG4J的Message字段中,內容%d(日期)%c:日志信息所在地(類名)%p:日志信息級別%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.FILE=org.apache.log4j.FileAppender log4j.appender.FILE.File=C:/log4j/file.log log4j.appender.FILE.Append=false log4j.appender.FILE.Encoding=GBK log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p%c %x - %m%n

應用于文件回滾

log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender log4j.appender.ROLLING_FILE.Threshold=ERROR log4j.appender.ROLLING_FILE.File=rolling.log log4j.appender.ROLLING_FILE.Append=true log4j.appender.ROLLING_FILE.Encoding=GBK 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

每天新建日志

log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender log4j.appender.A1.File=C:/log4j/log log4j.appender.A1.Encoding=GBK log4j.appender.A1.Threshold=DEBUG log4j.appender.A1.DatePattern='.'yyyy-MM-dd log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L : %m%n

自定義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

應用于socket

log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender log4j.appender.SOCKET.RemoteHost=localhost log4j.appender.SOCKET.Port=5001 log4j.appender.SOCKET.LocationInfo=true log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout log4j.appender.SOCKET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n

LogFactor 5 Appender

log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000 log4j.appender.LF5_APPENDER.layout=org.apache.log4j.PatternLayout log4j.appender.LF5_APPENDER.layout.ConversionPattern =[framework] %d - %c -%-4r[%t] %-5p %c %x - %m%n

發送日志給郵件

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</pre>轉自:http://blog.csdn.net/neareast/article/details/7584385

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!