commons-logging和Log4j 日誌管理/log4j.properties配置詳解
commons-logging和Log4j 日誌管理 (zz) 什麼要用日誌(Log)? 這個……就不必說了吧。 為什麼不用System.out.println()? 功能太弱;不易於控制。如果暫時不想輸出了怎麼辦?如果想輸出到檔案怎麼辦?如果想部分輸出怎麼辦?……
為什麼同時使用commons-logging和Log4j?為什麼不僅使用其中之一? Commons-loggin的目的是為“所有的Java日誌實現”提供一個統一的介面,它自身的日誌功能平常弱(只有一個簡單的SimpleLog?),所以一般不會單獨使用它。
Log4j的功能非常全面強大,是目前的首選。我發現幾乎所有的Java開源專案都會用到Log4j,但我同時發現,所有用到Log4j的專案一般也同時會用到commons-loggin。我想,大家都不希望自己的專案與Log4j繫結的太緊密吧。另外一個我能想到的“同時使用commons-logging和Log4j”的原因是,簡化使用和配置。
強調一點,“同時使用commons-logging和Log4j”,與“單獨使用Log4j”相比,並不會帶來更大的學習、配置和維護成本,反而更加簡化了我們的工作。我想這也是為什麼“所有用到Log4j的專案一般也同時會用到commons-loggin”的原因之一吧。
Commons-logging能幫我們做什麼? l 提供一個統一的日誌介面,簡單了操作,同時避免專案與某個日誌實現系統緊密a耦合 l 很貼心的幫我們自動選擇適當的日誌實現系統(這一點非常好!) l 它甚至不需要配置
這裡看一下它怎麼“‘很貼心的’幫我們‘自動選擇’‘適當的’日誌實現系統”: 1) 首先在classpath下尋找自己的配置檔案commons-logging.properties,如果找到,則使用其中定義的Log實現類; 2) 如果找不到commons-logging.properties檔案,則在查詢是否已定義系統環境變數org.apache.commons.logging.Log,找到則使用其定義的Log實現類; 3) 否則,檢視classpath中是否有Log4j的包,如果發現,則自動使用Log4j作為日誌實現類; 4) 否則,使用JDK自身的日誌實現類(JDK1.4以後才有日誌實現類); 5) 否則,使用commons-logging自己提供的一個簡單的日誌實現類SimpleLog; (以上順序不保證完全準確,請參考官方文件)
可見,commons-logging總是能找到一個日誌實現類,並且儘可能找到一個“最合適”的日誌實現類。我說它“很貼心”實際上是因為:1、可以不需要配置檔案;2、自動判斷有沒有Log4j包,有則自動使用之;3、最悲觀的情況下也總能保證提供一個日誌實現(SimpleLog)。 可以看到,commons-logging對程式設計者和Log4j都非常友好。
為了簡化配置commons-logging,一般不使用commons-logging的配置檔案,也不設定與commons-logging相關的系統環境變數,而只需將Log4j的Jar包放置到classpash中就可以了。這樣就很簡單地完成了commons-logging與Log4j的融合。如果不想用Log4j了怎麼辦?只需將classpath中的Log4j的Jar包刪除即可。
就這麼簡單!
程式碼應該怎麼寫?
我們在需要輸出日誌資訊的“每一人”類中做如下的三個工作: 1、匯入所有需的commongs-logging類: import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory;
如果願意簡化的話,還可以兩行合為一行: import org.apache.commons.logging.*;
2、在自己的類中定義一個org.apache.commons.logging.Log類的私有靜態類成員: private static Log log = LogFactory.getLog(YouClassName.class);
注意這裡定義的是static成員,以避免產生多個例項。
LogFactory.getLog()方法的引數使用的是當前類的class,這是目前被普通認為的最好的方式。為什麼不寫作LogFactory.getLog(this.getClass())?因為static類成員訪問不到this指標!
3、使用org.apache.commons.logging.Log類的成員方法輸出日誌資訊: log.debug("111"); log.info("222"); log.warn("333"); log.error("444"); log.fatal("555");
這裡的log,就是上面第二步中定義的類成員變數,其型別是org.apache.commons.logging.Log,通過該類的成員方法,我們就可以將不同性質的日誌資訊輸出到目的地(目的地是哪裡?視配置可定,可能是stdout,也可能是檔案,還可能是傳送到郵件,甚至傳送簡訊到手機……詳見下文對log4j.properties的介紹): l debug() 輸出“除錯”級別的日誌資訊; l info() 輸出“資訊”級別的日誌資訊; l warn() 輸出“警告”級別的日誌資訊; l error() 輸出“錯誤”級別的日誌資訊; l fatal() 輸出“致命錯誤”級別的日誌資訊;
根據不同的性質,日誌資訊通常被分成不同的級別,從低到高依次是:“除錯(DEBUG)”“資訊(INFO)”“警告(WARN)”“錯誤(ERROR)”“致命錯誤(FATAL)”。為什麼要把日誌資訊分成不同的級別呢?這實際上是方便我們更好的控制它。比如,通過Log4j的配置檔案,我們可以設定“輸出‘除錯’及以上級別的日誌資訊”(即“除錯”“資訊”“警告”“錯誤”“致命錯誤”),這對專案開發人員可能是有用的;我們還可以設定“輸出“警告”及以上級別的日誌資訊”(即“警告”“錯誤”“致命錯誤”),這對專案終端使用者可能是有用的。 僅從字面上理解,也可以大致得出結論:最常用的應該是debug()和info();而warn()、error()、fatal()僅在相應事件發生後才使用。
從上面三個步驟可以看出,使用commons-logging的日誌介面非常的簡單,不需要記憶太多東西:僅僅用到了兩個類Log, LogFactory,並且兩個類的方法都非常少(後者只用到一個方法,前者經常用到的也只是上面第三步中列出的幾個),同時引數又非常簡單。
上面所介紹的方法是目前被普通應用的,可以說是被標準化了的方法,幾乎所有的人都是這麼用。如果不信,或想確認一下,就去下載幾個知名的Java開源專案原始碼看一下吧。
下面給出一個完整的Java類的程式碼: package liigo.testlog; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory;
public class TestLog { private static Log log = LogFactory.getLog(TestLog.class); public void test() { log.debug("111"); log.info("222"); log.warn("333"); log.error("444"); log.fatal("555"); }
public static void main(String[] args) { TestLog testLog = new TestLog(); testLog.test(); } }
只要保證commons-logging的jar包在classpath中,上述程式碼肯定可以很順利的編譯通過。那它的執行結果是怎麼樣的呢?恐怕會有很大的不同,請繼續往下看。
Log4j在哪裡呢?它發揮作用了嗎?
應該注意到,我們上面給出的原始碼,完全沒有涉及到Log4j——這正是我們所希望的,這也正是commons-logging所要達到的目標之一。
可是,怎麼才能讓Log4j發揮它的作用呢?答案很簡單,只需滿足“classpath中有Log4j的jar包”。前面已經說過了,commons-logging會自動發現並應用Log4j。所以只要它存在,它就發揮作用。(它不存在呢?自然就不發揮作用,commons-logging會另行選擇其它的日誌實現類。)
注意:配置檔案log4j.properties對Log4j來說是必須的。如果classpath中沒有該配置檔案,或者配置不對,將會引發執行時異常。
這樣,要正確地應用Log4j輸出日誌資訊,log4j.properties的作用就很重要了。好在該檔案有通用的模板,複製一份(稍加修改)就可以使用。幾乎每一個Java專案目錄內都會有一個log4j.properties檔案,可下載幾個Java開源專案原始碼檢視。本文最後也附一個模板性質的log4j.properties檔案,直接複製過去就可以用,或者根據自己的需要稍加修改。後文將會log4j.properties檔案適當作一些介紹。
關於Log4j比較全面的配置 LOG4J的配置之簡單使它遍及於越來越多的應用中了:Log4J配置檔案實現了輸出到控制檯、檔案、
回滾檔案、傳送日誌郵件、輸出到資料庫日誌表、自定義標籤等全套功能。擇其一二使用就夠用了
log4j.rootLogger=DEBUG,CONSOLE,A1,im log4j.addivity.org.apache=true
# 應用於控制檯 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.Threshold=DEBUG log4j.appender.CONSOLE.Target=System.out 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.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n
#應用於檔案 log4j.appender.FILE=org.apache.log4j.FileAppender log4j.appender.FILE.File=file.log log4j.appender.FILE.Append=false log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n # Use this layout for LogFactor 5 analysis
# 應用於檔案回滾 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.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
#應用於socket log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender log4j.appender.SOCKET.RemoteHost=localhost log4j.appender.SOCKET.Port=5001 log4j.appender.SOCKET.LocationInfo=true # Set up for Log Facter 5 log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n
# Log Factor 5 Appender log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
# 傳送日誌給郵件 log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender log4j.appender.MAIL.Threshold=FATAL log4j.appender.MAIL.BufferSize=10 [email protected] log4j.appender.MAIL.SMTPHost=www.wusetu.com log4j.appender.MAIL.Subject=Log4J Message [email protected] log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout log4j.appender.MAIL.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:mysql://localhost:3306/test log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver log4j.appender.DATABASE.user=root log4j.appender.DATABASE.password= log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %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.A1=org.apache.log4j.DailyRollingFileAppender log4j.appender.A1.File=SampleMessages.log4j log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j' log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout
#自定義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 = [email protected]
log4j.appender.im.layout=org.apache.log4j.PatternLayout log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
第二部分:
stone 的 log4j配置詳解
Log4J的配置檔案(Configuration File)就是用來設定記錄器的級別、存放器和佈局的,它可接key=value格式的設定或xml格式的設定資訊。通過配置,可以創建出Log4J的執行環境。 1. 配置檔案 Log4J配置檔案的基本格式如下: #配置根Logger log4j.rootLogger = [ level ] , appenderName1 , appenderName2 , …
#配置日誌資訊輸出目的地Appender log4j.appender.appenderName = fully.qualified.name.of.appender.class log4j.appender.appenderName.option1 = value1 … log4j.appender.appenderName.optionN = valueN
#配置日誌資訊的格式(佈局) log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class log4j.appender.appenderName.layout.option1 = value1 … log4j.appender.appenderName.layout.optionN = valueN
其中 [level] 是日誌輸出級別,共有5級:
FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7
Appender 為日誌輸出目的地,Log4j提供的appender有以下幾種:
org.apache.log4j.ConsoleAppender(控制檯), org.apache.log4j.FileAppender(檔案), org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌檔案), org.apache.log4j.RollingFileAppender(檔案大小到達指定尺寸的時候產生一個新的檔案), org.apache.log4j.WriterAppender(將日誌資訊以流格式傳送到任意指定的地方)
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平臺為“\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. 在程式碼中初始化Logger: 1)在程式中呼叫BasicConfigurator.configure()方法:給根記錄器增加一個ConsoleAppender,輸出格式通過PatternLayout設為"%-4r [%t] %-5p %c %x - %m%n",還有根記錄器的預設級別是Level.DEBUG. 2)配置放在檔案裡,通過命令列引數傳遞檔名字,通過PropertyConfigurator.configure(args[x])解析並配置; 3)配置放在檔案裡,通過環境變數傳遞檔名等資訊,利用log4j預設的初始化過程解析並配置; 4)配置放在檔案裡,通過應用伺服器配置傳遞檔名等資訊,利用一個特殊的servlet來完成配置。 3. 為不同的 Appender 設定日誌輸出級別: 當除錯系統時,我們往往注意的只是異常級別的日誌輸出,但是通常所有級別的輸出都是放在一個檔案裡的,如果日誌輸出的級別是BUG!?那就慢慢去找吧。 這時我們也許會想要是能把異常資訊單獨輸出到一個檔案裡該多好啊。當然可以,Log4j已經提供了這樣的功能,我們只需要在配置中修改Appender的Threshold 就能實現,比如下面的例子: [配置檔案] ### set log levels ### log4j.rootLogger = debug , stdout , D , E
### 輸出到控制檯 ### log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target = System.out log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{ 1 }:%L - %m%n
### 輸出到日誌檔案 ### log4j.appender.D = org.apache.log4j.DailyRollingFileAppender log4j.appender.D.File = logs/log.log log4j.appender.D.Append = true log4j.appender.D.Threshold = DEBUG ## 輸出DEBUG級別以上的日誌 log4j.appender.D.layout = org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 儲存異常資訊到單獨檔案 ### log4j.appender.D = org.apache.log4j.DailyRollingFileAppender log4j.appender.D.File = logs/error.log ## 異常日誌檔名 log4j.appender.D.Append = true log4j.appender.D.Threshold = ERROR ## 只輸出ERROR級別以上的日誌!!! log4j.appender.D.layout = org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
[程式碼中使用]
public class TestLog4j { public static void main(String[] args) { PropertyConfigurator.configure( " D:/Code/conf/log4j.properties " ); Logger logger = Logger.getLogger(TestLog4j. class ); logger.debug( " debug " ); logger.error( " error " ); } }
執行一下,看看異常資訊是不是儲存在了一個單獨的檔案error.log中 log4j.properties 使用 一.引數意義說明 輸出級別的種類 ERROR、WARN、INFO、DEBUG ERROR 為嚴重錯誤 主要是程式的錯誤 WARN 為一般警告,比如session丟失 INFO 為一般要顯示的資訊,比如登入登出 DEBUG 為程式的除錯資訊 配置日誌資訊輸出目的地 log4j.appender.appenderName = fully.qualified.name.of.appender.class 1.org.apache.log4j.ConsoleAppender(控制檯) 2.org.apache.log4j.FileAppender(檔案) 3.org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌檔案) 4.org.apache.log4j.RollingFileAppender(檔案大小到達指定尺寸的時候產生一個新的檔案) 5.org.apache.log4j.WriterAppender(將日誌資訊以流格式傳送到任意指定的地方) 配置日誌資訊的格式 log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class 1.org.apache.log4j.HTMLLayout(以HTML表格形式佈局), 2.org.apache.log4j.PatternLayout(可以靈活地指定佈局模式), 3.org.apache.log4j.SimpleLayout(包含日誌資訊的級別和資訊字串), 4.org.apache.log4j.TTCCLayout(包含日誌產生的時間、執行緒、類別等等資訊) 控制檯選項 Threshold=DEBUG:指定日誌訊息的輸出最低層次。 ImmediateFlush=true:預設值是true,意謂著所有的訊息都會被立即輸出。 Target=System.err:預設情況下是:System.out,指定輸出控制檯 FileAppender 選項 Threshold=DEBUF:指定日誌訊息的輸出最低層次。 ImmediateFlush=true:預設值是true,意謂著所有的訊息都會被立即輸出。 File=mylog.txt:指定訊息輸出到mylog.txt檔案。 Append=false:預設值是true,即將訊息增加到指定檔案中,false指將訊息覆蓋指定的檔案內容。 RollingFileAppender 選項 Threshold=DEBUG:指定日誌訊息的輸出最低層次。 ImmediateFlush=true:預設值是true,意謂著所有的訊息都會被立即輸出。 File=mylog.txt:指定訊息輸出到mylog.txt檔案。 Append=false:預設值是true,即將訊息增加到指定檔案中,false指將訊息覆蓋指定的檔案內容。 MaxFileSize=100KB: 字尾可以是KB, MB 或者是 GB. 在日誌檔案到達該大小時,將會自動滾動,即將原來的內容移到mylog.log.1檔案。 MaxBackupIndex=2:指定可以產生的滾動檔案的最大數。 log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n 日誌資訊格式中幾個符號所代表的含義: -X號: X資訊輸出時左對齊; %p: 輸出日誌資訊優先順序,即DEBUG,INFO,WARN,ERROR,FATAL, %d: 輸出日誌時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921 %r: 輸出自應用啟動到輸出該log資訊耗費的毫秒數 %c: 輸出日誌資訊所屬的類目,通常就是所在類的全名 %t: 輸出產生該日誌事件的執行緒名 %l: 輸出日誌事件的發生位置,相當於%C.%M(%F:%L)的組合,包括類目名、發生的執行緒,以及在程式碼中的行數。舉例:Testlog4.main (TestLog4.java:10) %x: 輸出和當前執行緒相關聯的NDC(巢狀診斷環境),尤其用到像java servlets這樣的多客戶多執行緒的應用中。 %%: 輸出一個"%"字元 %F: 輸出日誌訊息產生時所在的檔名稱 %L: 輸出程式碼中的行號 %m: 輸出程式碼中指定的訊息,產生的日誌具體資訊 %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字元,就從左邊較遠輸出的字元截掉。 二.檔案配置Sample1 log4j.rootLogger=DEBUG,A1,R #log4j.rootLogger=INFO,A1,R # ConsoleAppender 輸出 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n # File 輸出 一天一個檔案,輸出路徑可以定製,一般在根路徑下 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender log4j.appender.R.File=blog_log.txt log4j.appender.R.MaxFileSize=500KB log4j.appender.R.MaxBackupIndex=10 log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n 檔案配置Sample2 下面給出的Log4J配置檔案實現了輸出到控制檯,檔案,回滾檔案,傳送日誌郵件,輸出到資料庫日誌表,自定義標籤等全套功能。 log4j.rootLogger=DEBUG,CONSOLE,A1,im #DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE log4j.addivity.org.apache=true ################### # Console Appender ################### log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.Threshold=DEBUG log4j.appender.CONSOLE.Target=System.out 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.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n ##################### # File Appender ##################### log4j.appender.FILE=org.apache.log4j.FileAppender log4j.appender.FILE.File=file.log log4j.appender.FILE.Append=false log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n # Use this layout for LogFactor 5 analysis ######################## # Rolling File ######################## 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.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 #################### # Socket Appender #################### log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender log4j.appender.SOCKET.RemoteHost=localhost log4j.appender.SOCKET.Port=5001 log4j.appender.SOCKET.LocationInfo=true # Set up for Log Facter 5 log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n ######################## # Log Factor 5 Appender ######################## log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000 ######################## # SMTP Appender ####################### log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender log4j.appender.MAIL.Threshold=FATAL log4j.appender.MAIL.BufferSize=10 [email protected] log4j.appender.MAIL.SMTPHost=mail.hollycrm.com log4j.appender.MAIL.Subject=Log4J Message [email protected] log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n ######################## # JDBC Appender ####################### log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver log4j.appender.DATABASE.user=root log4j.appender.DATABASE.password= log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %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.A1=org.apache.log4j.DailyRollingFileAppender log4j.appender.A1.File=SampleMessages.log4j log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j' log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout ################### #自定義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 = [email protected] log4j.appender.im.layout=org.apache.log4j.PatternLayout log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n 三.高階使用 實驗目的: 1.把FATAL級錯誤寫入2000NT日誌 2. WARN,ERROR,FATAL級錯誤傳送email通知管理員 3.其他級別的錯誤直接在後臺輸出 實驗步驟: 輸出到2000NT日誌 1.把Log4j壓縮包裡的NTEventLogAppender.dll拷到WINNT\SYSTEM32目錄下 2.寫配置檔案log4j.properties # 在2000系統日誌輸出 log4j.logger.NTlog=FATAL, A8 # APPENDER A8 log4j.appender.A8=org.apache.log4j.nt.NTEventLogAppender log4j.appender.A8.Source=JavaTest log4j.appender.A8.layout=org.apache.log4j.PatternLayout log4j.appender.A8.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n 3.呼叫程式碼: Logger logger2 = Logger.getLogger("NTlog"); //要和配置檔案中設定的名字相同 logger2.debug("debug!!!"); logger2.info("info!!!"); logger2.warn("warn!!!"); logger2.error("error!!!"); //只有這個錯誤才會寫入2000日誌 logger2.fatal("fatal!!!"); 傳送email通知管理員: 1. 首先下載JavaMail和JAF, http://java.sun.com/j2ee/ja/javamail/index.html http://java.sun.com/beans/glasgow/jaf.html 在專案中引用mail.jar和activation.jar。 2. 寫配置檔案 # 將日誌傳送到email log4j.logger.MailLog=WARN,A5 # APPENDER A5 log4j.appender.A5=org.apache.log4j.net.SMTPAppender log4j.appender.A5.BufferSize=5 [email protected] [email protected] log4j.appender.A5.Subject=ErrorLog log4j.appender.A5.SMTPHost=smtp.263.net log4j.appender.A5.layout=org.apache.log4j.PatternLayout log4j.appender.A5.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n 3.呼叫程式碼: //把日誌傳送到mail Logger logger3 = Logger.getLogger("MailLog"); logger3.warn("warn!!!"); logger3.error("error!!!"); logger3.fatal("fatal!!!"); 在後臺輸出所有類別的錯誤: 1. 寫配置檔案 # 在後臺輸出 log4j.logger.console=DEBUG, A1 # APPENDER A1 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n 2.呼叫程式碼 Logger logger1 = Logger.getLogger("console"); logger1.debug("debug!!!"); logger1.info("info!!!"); logger1.warn("warn!!!"); logger1.error("error!!!"); logger1.fatal("fatal!!!"); -------------------------------------------------------------------- 全部配置檔案:log4j.properties # 在後臺輸出 log4j.logger.console=DEBUG, A1 # APPENDER A1 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n # 在2000系統日誌輸出 log4j.logger.NTlog=FATAL, A8 # APPENDER A8 log4j.appender.A8=org.apache.log4j.nt.NTEventLogAppender log4j.appender.A8.Source=JavaTest log4j.appender.A8.layout=org.apache.log4j.PatternLayout log4j.appender.A8.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n # 將日誌傳送到email log4j.logger.MailLog=WARN,A5 # APPENDER A5 log4j.appender.A5=org.apache.log4j.net.SMTPAppender log4j.appender.A5.BufferSize=5 [email protected] [email protected] log4j.appender.A5.Subject=ErrorLog log4j.appender.A5.SMTPHost=smtp.263.net log4j.appender.A5.layout=org.apache.log4j.PatternLayout log4j.appender.A5.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n 全部程式碼:Log4jTest.java /* * 建立日期 2003-11-13 */ package edu.bcu.Bean; import org.apache.log4j.*; //import org.apache.log4j.nt.*; //import org.apache.log4j.net.*; /** * @author yanxu */ public class Log4jTest { public static void main(String args[]) { PropertyConfigurator.configure("log4j.properties"); //在後臺輸出 Logger logger1 = Logger.getLogger("console"); logger1.debug("debug!!!"); logger1.info("info!!!"); logger1.warn("warn!!!"); logger1.error("error!!!"); logger1.fatal("fatal!!!"); //在NT系統日誌輸出 Logger logger2 = Logger.getLogger("NTlog"); //NTEventLogAppender nla = new NTEventLogAppender(); logger2.debug("debug!!!"); logger2.info("info!!!"); logger2.warn("warn!!!"); logger2.error("error!!!"); //只有這個錯誤才會寫入2000日誌 logger2.fatal("fatal!!!"); //把日誌傳送到mail Logger logger3 = Logger.getLogger("MailLog"); //SMTPAppender sa = new SMTPAppender(); logger3.warn("warn!!!"); logger3.error("error!!!"); logger3.fatal("fatal!!!"); } }