Log4J基礎詳解及示例大全
去年這個時候,為做軟件工程的大作業就詳細學過Log4J的用法了,時隔一年想要在新的項目中好好使用一下的時候,發現幾乎全忘了,悲催啊……
再上網查資料,總是不能找到一篇符合我的口味,拿來就能輕松上手,方便查閱的文章。看了幾篇網文以及Apache的官方文檔,耐心的總結了一下,貼出來分享,也方便自己以后查閱!
著急的話,可以直接從第8部分配置文件示例中截取一段配置文件拿去用就好啦~(可能還需要看一眼第7部分回顧一下基本使用方法。)
log4j主要由三大組件組成:loggers,appenders和layouts。
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的日志信息輸出到stdout和R這兩個目的地,stdout和R的定義在下面的代碼,可以任意起名。
日志等級可分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,如果配置OFF則不打出任何信息。
默認情況下,logger的additive標志被設置為true,表示未被分配level的logger將繼承離他最近的父logger的所有appenders。該選項可以被重新設置,表示子logger將不再繼承父logger的appenders。
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