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
轉載自:http://blog.csdn.net/neareast/article/details/7584385
相關文章
- 三、Go語言基礎:go build命令用法及示例詳解GoUI
- Go語言基礎(04):go doc命令用法及示例詳解Go
- PhantomJS 基礎及示例JS
- sed 命令詳解及示例
- adb操作命令詳解及大全
- curl常用引數詳解及示例
- Java中Lambda表示式基礎及使用詳解Java
- log4j 詳解
- Linux 中 crontab 詳解及示例(收藏)Linux
- JScript錯誤程式碼及相應解釋大全-JavaScript基礎教程JSJavaScript
- ADB 操作命令詳解及用法大全
- log4j配置詳解
- CentOS基礎命令大全CentOS
- java基礎詳解-集合Java
- OpenGL 基礎光照詳解
- Oracle SQL*PLUS基礎及sqlplus命令詳解 (轉)OracleSQL
- Spring @Conditional註解 詳細講解及示例Spring
- 二、Go語言基礎:go install與go fmt命令使用示例詳解Go
- Cxf - 基礎和示例
- 詳解javascript拖拽(二)拖拽的應用及示例JavaScript
- 常用網路命令 dig 詳解及使用示例
- linux 命令基礎大全Linux
- JSON基礎使用詳解JSON
- Git基礎知識詳解Git
- Redis基礎知識詳解Redis
- HotDB 基礎架構詳解架構
- Linux基礎命令詳解Linux
- java繼承基礎詳解Java繼承
- Java基礎-泛型詳解Java泛型
- 【iOS基礎】KVC / KVO詳解iOS
- Scrapy基礎(二): 使用詳解
- socket基礎詳解 小白白
- 基礎控制元件詳解控制元件
- 【Java 基礎】--HttpServlet詳解JavaHTTPServlet
- Git 命令大全,詳解!Git
- log4j使用示例 (轉)
- 計算機視覺入門大全:基礎概念、執行原理、應用案例詳解計算機視覺
- log4j日誌配置詳解