1. log4j 的配置文件
Log4j 支持兩種配置文件格式,一種是 XML 格式的文件,一種是 Java 特性文件 lg4j.properties (鍵 = 值)。
1.1. log4j configuration scripts in properties format
lg4j.properties 文件作為作為常用的配置文件的方法如下:
Ø 配置根 Logger
Logger 負責處理日志記錄的大部分操作。
其語法為:
log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中, level 是日志記錄的優先級,分為 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 ALL 或者自定義的級別。 Log4j 建議只使用四個級別,優先級從高到低分別是 ERROR 、 WARN 、 INFO 、 DEBUG 。通過在這里定義的級別,您可以控制到應用程序中相應級別的日志信息的開關。比如在這里定義了 INFO 級別,只有等于及高于這個級別的才進行處理,則應用程序中所有 DEBUG 級別的日志信息將不被打印出來。 ALL: 打印所有的日志, OFF :關閉所有的日志輸出。 appenderName 就是指定日志信息輸出到哪個地方。可同時指定多個輸出目的地。
Ø Appender
配置日志信息輸出目的地 Appender 負責控制日志記錄操作的輸出。
其語法為:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
log4j.appender.appenderName.optionN = valueN
其中, Log4j 提供的 appender 有以下幾種:
org.apache.log4j.ConsoleAppender (控制臺),
org.apache.log4j.FileAppender (文件),
org.apache.log4j.DailyRollingFileAppender (每天產生一個日志文件),
org.apache.log4j.RollingFileAppender (文件大小到達指定尺寸的時候產生一個新的文件),可通過 log4j.appender.R.MaxFileSize=100KB 設置文件大小,還可通過 log4j.appender.R.MaxBackupIndex=1 設置為保存一個備份文件。
org.apache.log4j.WriterAppender (將日志信息以流格式發送到任意指定的地方)
例:
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
定義一個名為 stdout 的輸出目的地, ConsoleAppender 為控制臺。
Ø Layout
其中, Log4j 提供的 layout 有以下幾種:
org.apache.log4j.HTMLLayout (以 HTML 表格形式布局),
org.apache.log4j.PatternLayout (可以靈活地指定布局模式),
org.apache.log4j.SimpleLayout (包含日志信息的級別和信息字符串),
org.apache.log4j.TTCCLayout (包含日志產生的時間、線程、類別等等信息)
Ø 格式化日志信息
Log4J 采用類似 C 語言中的 printf 函數的打印格式格式化日志信息,打印參數如下:
%m 輸出代碼中指定的消息
%p 輸出優先級,即 DEBUG , INFO , WARN , ERROR , FATAL
%r 輸出自應用啟動到輸出該 log 信息耗費的毫秒數
%c 輸出所屬的類目,通常就是所在類的全名
%t 輸出產生該日志事件的線程名
%n 輸出一個回車換行符, Windows 平臺為 “rn” , Unix 平臺為 “n”
%d 輸出日志時間點的日期或時間,默認格式為 ISO8601 ,也可以在其后指定格式,比如: %d{yyyy MMM dd HH:mm:ss,SSS} ,輸出類似: 2002 年 10 月 18 日 22 : 10 : 28 , 921
%l 輸出日志事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。
log4j.propertie 示例文件:
log4j.rootCategory=INFO, stdout,file
###. 定義名為 stdout 的輸出端的類型
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n
###. 定義名為 file 的輸出端的類型為每天產生一個日志文件。
log4j.appender.file =org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File=log.txt
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n
###. 指定 com.neusoft 包下的所有類的等級為 DEBUG 。可以把 com.neusoft 改為自己項目所用的包名。
log4j.logger.com.neusoft=DEBUG
###. 如果項目中沒有配置 EHCache ,則配置以下兩句為 ERROR 。
log4j.logger.com.opensymphony.oscache=ERROR
log4j.logger.net.sf.navigator=ERROR
### struts 配置
log4j.logger.org.apache.commons=ERROR
log4j.logger.org.apache.struts=WARN
### displaytag 配置
log4j.logger.org.displaytag=ERROR
### .spring 配置
log4j.logger.org.springframework=DEBUG
### . ibatis 配置
log4j.logger.com.ibatis.db=WARN
### . hibernate 配置
log4j.logger.org.hibernate=DEBUG
log4j.logger.org.apache.velocity=FATAL
log4j.logger.com.canoo.webtest=WARN
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 java
2.1. commongs-logging+Log4j
Ø 導入所有需的 commongs-logging 類:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
Ø 獲取日志記錄器
在自己的類中定義一個 org.apache.commons.logging.Log 類的私有靜態類成員:
private final Log log = LogFactory.getLog(getClass());
LogFactory.getLog() 方法的參數使用的是當前類的 class 。
Ø 輸出日志信息
使用 org.apache.commons.logging.Log 類的成員方法輸出日志信息:
if (log.isDebugEnabled()) {
log.debug("debug…");
}
if (log.isInfoEnabled()){
log.info("Info…");
}
if (log.isWarnEnabled()){
log.warn("warn …");
}
if (log.isErrorEnabled()){
log.error("error …");
}
if (log.isFatalEnabled()){
log.fatal("fatal …")
}
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;
import org.apache.log4j.xml.DOMConfigurator;
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.debug("Debug ...");
logger.info("Info ...");
logger.warn("Warn ...");
logger.error("Error ...");
}
}
3. log4j in database
3.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如下:
%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時請求才會啟用。