Log4j是Apache組織的一個開源項目,它是一個日誌操作包,通過使用Log4j可以指定日誌信息輸出的目的地,如控制檯,文件,GUI組件,NT的時間記錄器,還可以控制每一條日誌輸出的格式,此外通過定義日誌的級別,能夠非常細緻的控制日誌的輸出,最好的地方是這些功能可以通過一個配置文件來靈活的進行配置,而不需要修改程序代碼.在應用程序中輸出日誌有三個目的:
1) 監視代碼變量的變化情況,把詳細信息記錄到文件中,進行統計分析.
2) 跟蹤代碼運行軌跡,作爲日後審計的依據.
3) 擔當集成開發環境中的調試器的作用,向文件和控制器打印代碼的調試信息.
學習Log4j最重要的是首先要了解兩個常用的接口:Log和LogFactory.首先說一說Log接口.通用日誌包把日誌消息分爲6個級別:
1) fatal致命的
2) error錯誤
3) warn警告
4) info信息
5) debug調試
6) trace細節
其中級別按照以上的順序,org.apache.commons.logging.Log接口代表日誌器,它提供
一組輸出日誌的方法.例如fatal(Object message)參數都是一個對象,要注意的是隻有當它輸出日誌的級別大於或者等於爲日誌配置的級別的時候,這個方法纔會被執行.Log接口還提供了一組判斷是否允許輸出特定級別日誌信息的方法,很簡單例如isFatalEnabled()在程序輸出某種級別的日誌消息之前,提倡先調用以上的方法來判斷該級別的日誌是否允許輸出,這有助於提高應用的性能.這種判斷主要是爲了提高性能,避免執行多餘的操作.
以上闡述了重要的Log接口,下面簡單說明一下LogFactory接口,這個接口也和Log接口一樣在logging包中,接口提供了獲得日誌器實例的兩個靜態方法如下:
public static Log getLog(String name)throws LogConfigurationException;
public static Log getLog(Class class)throws LogConfigurationException;
第一個getLog()方法name參數作爲日誌器的名字,第二個getLog()方法以class參數指定的類的名字作爲日誌器的名字.
在強調可重用組件的今天,除了自己從頭到尾開發一個可重用的日誌操作類以外,還有一個Apache爲我們提供的一個強有力的現成的日誌操作包Log4j.主要由三大組件構成:
1) Logger:負責生成日誌,並能夠對日誌信息進行分類篩選.
2) Appender:定義了日誌信息輸出的目的地,指定日誌信息應該被輸出到什麼地方.
3) Layout:指定日誌信息的輸出格式.
以上的三個組件協同工作,使得開發者能夠依據日誌信息類別記錄信息,並能夠在程序運行期間,控制日誌信息的輸出格式以及日誌的存放地點.Log4j的Appender組件決定日誌輸出到什麼地方,目前Log4j的Appender支持將日誌信息輸出到控制檯Console,文件,GUI組件.一個Logger可以同時對應多個Appender也就是說一個Logger的日誌信息可以同時輸出在多個目的地上.例如可以爲rootLogger配置兩個Appender,一個是file一個是console可以這樣寫:log4j.rootLogger=warn.file.console然後可以用appender.console或者是appender.file來指定具體的控制檯或者文件.當以上的都設置好了以後還需要配置Layout組件,主要是解決日誌的輸出格式,它的類型有:HTMLLayout(html格式),PattemLayout(可以靈活的指定佈局模式),SimpleLayout(包含日誌信息級別和信息的字符串)TTCCLayout(包含日誌生產時間,線程和類別等信息).通過如上的研究已經可以配置Log4j了,然後就可以通過Log4j的API來操作日誌了.如果要在Web應用中使用Log4j,需要創建一個配置文件配置Log4j的環境,然後就可以在其他的Web組件中獲取Logger對象並輸出日誌.下面展示一個局部的Log4j,這裏只是舉例Log4j的配置文件和在具體的Action中進行調用,如下:
1) 將Log4j的jar文件copy到WEB-INF的lib目錄下.
2) 創建Log4j的配置文件log4j.properties存放在classes目錄下.
Log4j.rootLogger=INFO,console,file
Log4j.appender.console=org.apache.log4j.ConsoleAppender
Log4j.appender.file=org.apache.log4j.RollingFileAppender
Log4j.appender.file=e:/log/log.txt
Log4j.appender.console.layout=org.apache.log4j.PattemLayout
Log4j.appender.console.layout.ConversionPattrm=%t%p-%m%n
Log4j.appender.file.layout=rog.appache.log4j.HTMLLayout
Log4j.appender.file.layout.ConversionPattem=%t%p-%m%n
配置文件配置好了,在Action裏調用我就不用詳細寫了,很簡單,就是引入logging的包,然後在execute()方法中通過Log log=LogFactory.getLog(“name”);獲取具體的Log對象,在通過log.fatal(“信息”);類似的方法操作日誌,還可以通過isDebugEnbled()等方法判斷日誌的輸出.
回顧一下Log4j主要三個組件構成:Logger,Appender,Layout,Logger控制日誌信息的輸出,Appender決定輸出的目的地,Layout決定日誌輸出的格式.Log4j允許客戶在配置文件文件中靈活的配置這些組件,然後讀取配置文件中並配置Log4j環境,然後就可以在程序中任何要輸出日誌的地方調用適當的方法,這樣對於日後程序的調試有着重大的作用.
log4j.properties-------------------
log4j.rootLogger = [DEBUG],CONSOLE
# level=ERROR、WARN、INFO、DEBUG
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
# org.apache.log4j.ConsoleAppender(控制檯),
# org.apache.log4j.FileAppender(文件),
# org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌文件),
# org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件),
# org.apache.log4j.WriterAppender(將日誌信息以流格式發送到任意指定的地方)
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
# org.apache.log4j.HTMLLayout(以HTML表格形式佈局),
# org.apache.log4j.PatternLayout(可以靈活地指定佈局模式),
# org.apache.log4j.SimpleLayout(包含日誌信息的級別和信息字符串),
# org.apache.log4j.TTCCLayout(包含日誌產生的時間、線程、類別等等信息)
log4j.appender.CONSOLE.layout.ConversionPattern=-[%p]-[%l]- %m%n
# %m:產生的日誌具體信息
# %p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL
# %r 輸出自應用啓動到輸出該log信息耗費的毫秒數
# %c 輸出所屬的類目,通常就是所在類的全名
# %t 輸出產生該日誌事件的線程名
# %n 輸出一個回車換行符,Windows平臺爲“\r\n”,Unix平臺爲“\n”
# %d 輸出日誌時間點的日期或時間,默認格式爲ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
# %l 輸出日誌事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。舉例:Testlog4.main(TestLog4.java:10)
log4j的一些配置屬性-----------
1.layout屬性
Log4J採用類似C語言中的printf函數的打印格式格式化日誌信息,打印參數見表1如下:
%m 輸出代碼中指定的消息
%p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL
%r 輸出自應用啓動到輸出該log信息耗費的毫秒數
%c 輸出所屬的類目,通常就是所在類的全名
%t 輸出產生該日誌事件的線程名
%n 輸出一個回車換行符,Windows平臺爲“\r\n”,Unix平臺爲“\n”
%d 輸出日誌時間點的日期或時間,默認格式爲ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
%l 輸出日誌事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。舉例:Testlog4.main(TestLog4.java:10)
2.級別
Log4J中的一個核心概念是日誌級別是有序的。Log4J內置了5種日誌級別爲:
DEBUG < INFO < WARN < ERROR < FATAL
右邊的級別比左邊的高。每一個Logger實例都有一個日誌級別,上面的5種輸出方法就是對應於5種不同級別的日誌請求。比如,如果c是一個Logger實例,c.info("some information")就是一個INFO級別的日誌請求。一個日誌請求會不會輸出,取決於該Logger實例的日誌級別和該日誌請求級別的比較。規則如下:
假如在一個級別爲p的Logger實例中發生一個級別爲q的日誌請求,則當q >= p時請求才會啓用
apche通用日誌包和log4j使用指南--------
Apache通用日誌包提供一組通用的日誌接口,用戶可以自由選擇實現日誌接口的第三方軟件
通用日誌目前支持以下日誌實現
Log4j日誌器
JDK1.4Logging
SimpleLog日誌器
NoOpLog日誌器
Log 接口
通用日誌包把日誌消息分爲6種級別Fatal,Error,Warn,Info,Debug和Trace
org.apache.commons.logging.Log接口代表日誌器,它提供了一組輸出日誌的方法
fatal(Object message);
error(Object message);
warn (Object message);
info (Object message);
debug(Object message);
trace(Object message);
這裏需要注意的是,只有當輸出日誌的級別大於等於日誌器配置的日誌級別時,這個方法
纔會真正被執行.例如日誌器設置日誌級別爲Warn,那麼程序中,它的
fatal(),error(),warn()方法會被執行,而info(),debug(),trace()
不會被執行.
Log接口還提供了一組判斷是否允許輸出特定級別日誌消息的方法
isFatalEnable();
isErrorEnable();
isWarnEnable();
isInfoEnable();
isDebugEnable();
isTraceEnable();
LogFactory接口
org.apache.commons.logging.LogFactory接口提供了獲得日誌器實例的兩個靜態方法
public static Log getLog(String name)throws LogConfigurationException
public static Log getLog(Class class)throws LogConfigurationException
public static Log getLog(Class class)
{
getLog(class.getName());
}
Log4J 日誌器
Log4J 是Apache的一個開放源代碼的項目.
Log4J由三大組件構成
Logger: 負責生成日誌,並能根據配置的日誌器級別來決定什麼日誌消息應該被輸出.
Appender: 定義日誌消息輸出的目的地,指定日誌消息應該被輸出到什麼地方,
這些地方可以是控制檯,文件和網絡設備等.
Layout:指定日誌消息的輸出格式
配置通用日誌接口
在web應用中使用通用日誌包,首先必須進行以下配置
準備有關的jar文件
在commons-logging.properties 屬性文件中指定日誌器(即日誌實線類)
爲特定的日誌器設置日誌級別,輸出格式和輸出地點等.
準備有關jar文件
這裏主要是準備 commons-logging.jar和 log4j.jar 放到lib目錄下
指定日誌器
通用日誌接口從名爲 commons-logging.properties的屬性文件中獲取實現日誌
接口的日誌器信息,這個文件放在web-inf/class目錄下
在該文件的org.apache.commons.logging.Log屬性指定日誌實現類
例如用Log4J日誌器,那麼設置
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JCategoryLog
設置日誌器屬性
多數日誌器允許以配置的方式,指定日誌器的輸出格式,地點,或者級別.
配置Log4J
Log4J,由三個重要的組件構成,Logger,Appender和Layout.
Log4J支持兩種配置文件格式:一種是XML格式文件,一種是java屬性文件.
配置Log4J組件
Logger組件支持繼承關係,所有的Logger組件都直接或者間接繼承rootLogger,
配置rootLogger的語法爲
log4j.rootLogger=[priority],appenderName,appenderName,..
其中priority是日誌級別,可選值OFF,FATAL,ERROR,WARN,INFO,DEBUG,TRACE和ALL
appenderName指定Appender組件,用戶可以同時指定多個Appender組件,例如
以下代碼指定rootLogger的日誌級別爲INFO,它有兩個Appender,名爲console和flie
log4j.rootLogger=INFO,console,file
配置Appender組件
配置日誌消息輸出目的地Appender,有以下幾種
org.apache.log4j.ConsoleAppender(控制檯)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌文件)
org.apache.log4j.RollingFileAppender(文件大小達到指定尺寸的時候產生一個新文件)
org.apache.log4j.WriterAppender(將日誌信息以流個格式發送到任意指定的地方)
例如以下代碼定義了一個名了file的Appender,它把日誌信息輸出到log.txt文件
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=log.txt
配置Layout組件
Log4j提供下面幾種Layout
org.apache.log4j.HTMLLayout(以html表格形式佈局)
org.apache.log4j.PatterLayout(可以靈活的指定佈局模式)
org.apache.log4j.SimpleLayout(包含日誌消息的級別和信息字符串)
org.apache.log4j.TTCCLayout(包含日誌產生的時間線程和類別)
Log4J採用類似C語言中的printf函數的打印格式格式化日誌信息,打印參數如下: %m 輸出代碼中指定的消息
%p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL
%r 輸出自應用啓動到輸出該log信息耗費的毫秒數
%c 輸出所屬的類目,通常就是所在類的全名
%t 輸出產生該日誌事件的線程名
%n 輸出一個回車換行符,Windows平臺爲“\r\n”,Unix平臺爲“\n”
%d 輸出日誌時間點的日期或時間,默認格式爲ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
%l 輸出日誌事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。舉例:Testlog4.main(TestLog4.java:10)
如果爲名"file"的Appender配置PatterLayout佈局,則可以採用如下代碼
log4j.appender.file.layout=org.apache.log4j.PatterLayout
log4j.appender.file.layout.ConversionPattern=%t%p-%m%n
採用以上PatternLayout佈局,從日誌文件中看到的輸出日誌的形式如下
http8080-Processor24 INFO -This is an info message
%t對應"http8080-Processor24" %p對應INFO,%m%n對應後面具體的日誌消息
一個簡單的應用
新建log4j.properties
log4j.rootLogger=INFO,a
log4j.appender.a=org.apache.log4j.RollingFileAppender
log4j.appender.a.File=log.txt
log4j.appender.a.layout=org.apache.log4j.SimpleLayout
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class Log4JTest {
/**
* @param args
*/
private static Log log=LogFactory.getLog(Log4JTest.class);
public static void main(String[] args) {
// TODO Auto-generated method stub
log.info("aaa");
}
}