1. log4j 的配置文件Log4j 支持兩種配置文件格式,一種是 XML 格式的文件,一種是 Java 特性文件 lg4j.properties (鍵 = 值)。 1.1. log4j configuration scripts in properties formatlg4j.properties 文件作爲作爲常用的配置文件的方法如下: Ø 配置根 Logger Ø Appender 配置日誌信息輸出目的地 Appender 負責控制日誌記錄操作的輸出。 log4j.appender.stdout=org.apache.log4j.ConsoleAppender Ø Layout 其中, Log4j 提供的 layout 有以下幾種: Ø 格式化日誌信息
log4j.propertie 示例文件: log4j.rootCategory=INFO, stdout,file ###. 定義名爲 stdout 的輸出端的類型
###. 定義名爲 file 的輸出端的類型爲每天產生一個日誌文件。
###. 指定 com.neusoft 包下的所有類的等級爲 DEBUG 。可以把 com.neusoft 改爲自己項目所用的包名。 ###. 如果項目中沒有配置 EHCache ,則配置以下兩句爲 ERROR 。 ### struts 配置 log4j.logger.org.apache.struts=WARN ### displaytag 配置 ### .spring 配置 ### . ibatis 配置 log4j.logger.org.hibernate=DEBUG log4j.logger.org.apache.velocity=FATAL
1.2. log4j configuration scripts in XML format<?xml version="1.0" encoding="GB2312" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="org.zblog.all" class="org.apache.log4j.RollingFileAppender"> <!-- 設置通道 ID:org.zblog.all 和輸出方式: org.apache.log4j.RollingFileAppender --> <param name="File" value="all.output.log" /> <!-- 設置 File 參數:日誌輸出文件名 --> <param name="Append" value="false" /> <!-- 設置是否在重新啓動服務時,在原有日誌的基礎添加新日誌 --> <param name="MaxBackupIndex" value="10" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%p (%c:%L)- %m%n" /> <!-- 設置輸出文件項目和格式 --> </layout> </appender> <appender name="org.zblog.zcw" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="output.log" /> <param name="Append" value="true" /> <param name="MaxFileSize" value="10240" /> <!-- 設置文件大小 --> <param name="MaxBackupIndex" value="10" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%p (%c:%L)- %m%n" /> </layout> </appender> <logger name="zcw.log"> <!-- 設置域名限制,即 zcw.log 域及以下的日誌均輸出到下面對應的通道中 --> <level value="debug" /> <!-- 設置級別 --> <appender-ref ref="org.zblog.zcw" /> <!-- 與前面的通道 id 相對應 --> </logger> <root> <!-- 設置接收所有輸出的通道 --> <appender-ref ref="org.zblog.all" /> <!-- 與前面的通道 id 相對應 --> </root> </log4j:configuration>
2. log4j in java2.1. commongs-logging+Log4jØ 導入所有需的 commongs-logging 類:
Ø 獲取日誌記錄器 在自己的類中定義一個 org.apache.commons.logging.Log 類的私有靜態類成員:
Ø 輸出日誌信息 使用 org.apache.commons.logging.Log 類的成員方法輸出日誌信息:
log.debug("debug…"); } } 2.2. 單獨使用 Log4jØ 獲取日誌記錄器 得到記錄器使用 Log4j ,這個記錄器將負責控制日誌信息。其語法爲: public static Logger getLogger( String name) 通過指定的名字獲得記錄器,如果必要的話,則爲這個名字創建一個新的記錄器。 Name 一般取本類的名字,比如: static Logger logger = Logger.getLogger (Test.class.getName () )
Ø 讀取配置文件 當獲得了日誌記錄器之後,第二步將配置 Log4j 環境,其語法爲: BasicConfigurator.configure () : 自動快速地使用缺省 Log4j 環境。 PropertyConfigurator.configure(String configFilename) :讀取使用 Java 的特性文件編寫的配置文件。 例: PropertyConfigurator.configure(".\\src\\log4j.properties"), 若將 log4j.properties 放在工程根目錄下也可不寫此句,程序會自動找到配置文件。 DOMConfigurator.configure ( String filename ) :讀取 XML 形式的配置文件。
Ø 輸出日誌信息 當上兩個必要步驟執行完畢,就可輕鬆地使用不同優先級別的日誌記錄語句插入到您想記錄日誌的任何地方,其語法如下: Logger.debug ( Object message ) ; Logger.info ( Object message ) ; Logger.warn ( Object message ) ; Logger.error ( Object message ) ;
log4j 範例程序 下面將使用一個最簡單的範例程序來進一步說明 log4j 的使用方法。程序代碼如下:
import org.apache.log4j.*; import org.apache.log4j.PropertyConfigurator; public class LogTest { static Logger logger = Logger.getLogger(LogTest.class.getName()); public static void main(String[] args) { PropertyConfigurator.configure ( “.\\src\log4j.properties”) ; //DOMConfigurator.configure(".\\src\log4j.xml");// 加載 .xml 文件 logger.info("Info ..."); logger.warn("Warn ..."); logger.error("Error ..."); } } 3. log4j in database3.1. 數據庫配置Ø 導入所需的驅動包 無論使用哪種數據庫都需要將驅動包導入服務中。 Ø 創建所需的表 首先要保證你的數據庫中有 log 表,並且保正字段的長度,否則寫入日誌時操作會失敗 數據字典說明: CREATE TABLE LOG ( ID INTEGER NOT NULL PRIMARY KEY, LOGDATE DATE, LOGTIME TIME, LOGTHREAD VARCHAR(50), LOGLEVEL VARCHAR(50), LOGCLASS VARCHAR(50), LOGLOGGER VARCHAR(200), LOGMESSAGE VARCHAR(2000) ) GO 3.2. log4j 配置文件## 配置數據庫聯接 log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender log4j.appender.DATABASE.URL=jdbc:db2://127.0.0.1:50000/pbdb log4j.appender.DATABASE.driver=com.ibm.db2.jcc.DB2Driver log4j.appender.DATABASE.user=erpt1104 log4j.appender.DATABASE.password=erpt1104 log4j.appender.DATABASE.sql = INSERT INTO log (logDATE,logTIME,LOGThread,loglevel,logClass,logLogger,logMessage) values ('%d{yyyy-MM-dd}','%d{HH:mm:ss}','%t', '%p', '%c', '%l', '%m') log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout log4j.appender.DATABASE.layout.ConversionPattern = %d{yyyy MM dd HH:mm:ss,SSS} %-5p %t %c %m
說明: %d 輸出日誌時間點的日期或時間,默認格式爲 ISO8601 ,也可以在其後指定格式,比如: %d{yyyy-MM-dd HH:mm:ss} ,輸出類似: 2007-3-29 17:49:27 ,剛好適合插入 SQLServer ; %t 產生該日誌事件的線程名; %p 日誌的 log_level ,如 DEBUG 、 WARN 或者 INFO ; %c 輸出所屬的類目,通常就是所在類的全名,如“ iNotes.Default ”; %m 日誌的內容; %l 輸出日誌事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。如 Test.main(Test.java:33) ; %n 輸出一個回車換行符, Windows 平臺爲“ \r\n ”, Unix 平臺爲“ \n ” 3.3. java 中調用import sun.jdbc.odbc.*; import java.sql.*;
import org.apache.log4j.Category; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; import org.apache.log4j.jdbc.*;
static Logger logger = Logger.getLogger(Test.class.getName ()); PropertyConfigurator.configure ( "log.properties" ) ; logger.info ( "test" );
運行項目,你就會看到執行了 sql 語句,數據庫中便插入相關數據,如需對日誌進行分析整理,這就不是 log4j 的事情了。
4. 最後說明:Doc 文檔可以從其網站上下載: http://logging.apache.org/log4j/docs/api/index.html http://logging.apache.org/log4j/docs/documentation.html 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環境,然後就可以在程序中任何要輸出日誌的地方調用適當的方法,這樣對於日後程序的調試有着重大的作用.1.layout屬性 Log4J採用類似C語言中的printf函數的打印格式格式化日誌信息,打印參數見表1如下: 2.級別 Log4J中的一個核心概念是日誌級別是有序的。Log4J內置了5種日誌級別爲: |