深入log4J和commons-logging

log4j的好處在於:
1.通過修改配置文件,就可以決定log信息輸出到何處(console,文件,...),是否輸出。
這樣,在系統開發階段可以打印詳細的log信息以跟蹤系統運行情況,而在系統穩定後可以關閉log輸出,從而在能跟蹤系統運行情況的同時,又減少了垃圾代碼(System.out.println(...)等)。
2.使用log4j,需要整個系統有一個統一的log機制,有利於系統的規劃。

當你在開發程序的時候, 調試(debugging)和日誌(logging)都是非常重要的工作, 但是, 現在有太多的 logging API 問世, 因爲他們都不錯, 很難做一個抉擇. 國外 java 論壇對於這些logging 方式也是有一番討論.

而 common logging 就是一個在這幾個不同的 logging API 中建立小小的橋樑.目前在 Java 中最有名的 Log 方式, 首推是 Log4j, 另是 JDK 1.4 Logging API. 除此之外, 還有 Avalon中用的 LogKit 等等 . 而 commons-logging 也有實現一些基本 的 logging 方式爲 NoOpLog 及 SimpleLog. 對於他們的比較不在這次討論範圍,

有興趣者請自行參閱參考文件.

快速使用 Logging 其實 logging 非常簡單去使用, 將 commons-logging.jar 放到 /WEB-INF/lib 之下.接著寫以下的代碼

LoggingTest.java

package com.softleader.newspaper.java.opensource;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class LoggingTest {

Log log = LogFactory.getLog(LoggingTest.class);

public void hello() {
log.error("ERROR");
log.debug("DEBUG");
log.warn("WARN");
log.info("INFO");
log.trace("TRACE");
System.out.println("OKOK");
}

}

在 / 放置一個 jsp 測試 test-commons-logging.jsp

<%@ page import="com.softleader.newspaper.java.opensource.LoggingTest" %>
<% LoggingTest test = new LoggingTest(); test.hello();%>

你將會看到 tomcat console 會有下面輸出

log4j:WARN No appenders could be found for logger (com.softleader.newspaper.java.opensource.LoggingTest).
log4j:WARN Please initialize the log4j system properly.OKOK

是因爲你還沒有配置 commons-logging.properties, 馬上會爲你介紹 ~~~.

設定 commons-logging.properties 你可以設置你的 log factory 是要使用哪一個 我以 Log4J 爲例子 在 /WEB-INF/classes/commons-logging.properties 中寫入
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JCategoryLog
如果你 server 是使用 jdk1.4 以上的版本
可以使用 org.apache.commons.logging.impl.Jdk14Logger
接著根據你的 Logger 撰寫符合他的 properties 拿 Log4j 爲例子 你就要在
/WEB-INF/classes/ 下放置一個

//日誌輸出到文件
log4j.rootLogger=DEBUG, A_default
log4j.appender.A_default=org.apache.log4j.RollingFileAppender
log4j.appender.A_default.File=c://log/test.log
log4j.appender.A_default.MaxFileSize=4000KB
log4j.appender.A_default.MaxBackupIndex=10
log4j.appender.A_default.layout=org.apache.log4j.PatternLayout
log4j.appender.A_default.layout.ConversionPattern=%d{ISO8601} - %p - %m%n

//日誌輸出到控制檯
log4j.rootLogger=INFO, A1
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

//發送郵件
# Configuration for receiving e-mails when ERROR messages occur.

#自定義的Appender
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
#日誌的錯誤級別
log4j.appender.MAIL.Threshold=ERROR
#緩存文件大小,日誌達到512K時發送Email
log4j.appender.MAIL.BufferSize=512
#發件人
[email protected]
#發送郵件的服務器
log4j.appender.MAIL.SMTPHost=smtp.163.com
#郵件的標題
log4j.appender.MAIL.Subject=Log4J Message
#日誌郵件的接收者
[email protected]
#日誌PatternLayout
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
#日誌的格式
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n


此時你去執行 test-commons-logging.jsp 輸出的內容, 就會記錄在你的 c:\log 目錄的 test.log 中了 ps:如果沒有相關的 class 會使用到 SimpLog, 此時要設定的是
simplelog.properties 結論以我自己本身使用的經驗, Log4j 可以滿足所有工程師, 所以我也是直接使用 log4j 而沒有使用 commons-logging.

不過爲了增加產品的通用性, 避免移植時候的麻煩, 新的產品及項目, 我會將他改成 commons-logging api 去調用.

如果你對commons-logging的工作原理不是很瞭解,請參考<commons-logging的使用方法>

另,mvnforum裏面的commons-logging.properties寫法:
# This is configuration file which used to config Logging for mvnForum application
# mvnForum supports 2 Loggings: Log4J and jzonic
# Depend on your web server, you should choose a logging properly


# IMPORTANT NOTE FOR TOMCAT 5.x USERS:
#
# By default, Tomcat 5.x will not work with Log4J.
# However, this file (commons-logging.properties) with a line
# config : org.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.Log4jFactory
# make Tomcat 5.x and Log4J work happyly together forever, I dont know why :-)



# Log4J
# This used to config logging Log4J
# Note that by default, common logging will look for Log4J first
# Comment out folling line to if you will use Jlo logging (also remember to enable Jlo below)

org.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.Log4jFactory

# Jlo
# jlo.xml config logging which only log the statements (DEBUG, ERROR, TRACE, INFO, WARN)
# from the packages start with net.myvietnam and com.mvnforum.
# See properities/jlo.xml for detail about this logging
# See http://jzonic.org for documentation
# If you want to extend mvnForum application, you should be aware of that

# Uncomment folling line to choose jlo logging
# You will need Jlo if Log4j could not run on Tomcat 5.0.x, Tomcat 5.5.x or JRun 4
# NOTE: read comment above about Tomcat 5.x issue

# org.apache.commons.logging.LogFactory=org.jzonic.jlo.LogManager

====================================================================

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
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



# 用於數據庫
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

 

posted on 2008-03-11 11:48 蘆葦 閱讀(1733) 評論(3)  編輯  收藏 所屬分類: JAVA其他

Feedback

# re:log4j和commons.logging日誌記錄的使用方法 2008-03-11 14:08 蘆葦

模式字符串簡介:
%cCategory名稱。還可以使用%c{n}的格式輸出Category的部分名稱,其中n爲正整數,輸出時會從Category名稱的右側起查n".",然後截取第n"."右側的部分輸出,例如Category的名稱爲"x.y.z",指定格式爲"%c{2}",則輸出"y.z"
%C:輸出信息時Category所在類的名稱,也可以使用%C{n}的格式輸出。
%d:輸出信息的時間,也可以用%d{FormatString}的格式輸出,其中FormatString的值請參考TTCCLayoutsetDateFormat方法,但NULLRELATIVE%d中無法使用。
%F:輸出信息時Category所在類文件的名稱。
%l:輸出信息時Category所在的位置,使用"%C.%M(%F:%L)"可以產生同樣的效果。
%L:輸出信息時Category在類文件中的行號。
%m:信息本身。
%M:輸出信息時Category所在的方法。
%n:換行符,可以理解成回車。
%p:日誌級別。
%r:輸出信息所用的時間,以毫秒爲單位。
%t:當前線程。
%x:輸出和當前線程相關的NDC信息。
%X:輸出與當前現成相關的MDC信息。
%%:輸出%
此外,還可以在%與模式字符之間加上修飾符來設置輸出時的最小寬度、最大寬度及文本對齊方式,例如:
%30d{DATE}:按當前所在地區顯示日期和時間,並指定最小寬度爲30,當輸出信息少於30個字符時會補以空格並右對齊。
%-30d{DATE}:也是按當前所在地區顯示日期和時間,指定最小寬度爲30,並在字符少於30時補以空格,但由於使用了"-",因此對齊方式爲左對齊,與默認情況一樣。
%.40d{DATE}:也是按當前所在地區顯示日期和時間,但指定最大寬度爲40,當輸出信息多於40個字符時會將左邊多出的字符截掉。此外,最大寬度只支持默認的左對齊方式,而不支持右對齊。
%30.40d{DATE}:如果輸出信息少於30個字符就補空格並右對齊,如果多於40個字符,就將左邊多出的字符截掉。
%-30.40d{DATE}:如果輸出信息少於30個字符就補空格並左對齊,如果多於40個字符,就將左邊多出的字符截掉。
 
回覆  更多評論
 

 

# re:log4j和commons.logging日誌記錄的使用方法 2008-03-11 14:08 蘆葦

最好與commons-logging一起用,why

1.
標準接口,即使將來脫離了log4j也一樣用
2.
簡化了編碼,減少耦合度:不需在代碼中指定log4j配製文件位置,代碼中不需要引用log4j的包
3.
基本所有框架都是這麼用的。。。。。。(我相信羣衆)

附加提供一下commons-logging尋找配置文件的順序(從別人那抄的)
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


具體實現

1.
commons-loggingjar加到classpath
2.
log4jjar加到classpath
3.
classpath的根目錄下,建立log4j.properties(必須是這個地方,必須叫這個名,纔不用特殊配置),可以直接複製後邊的模板
4.
在需要log的類中:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

private static Log log = LogFactory.getLog(xxxx.class);
爲什麼要使用static?因爲避免產生多個實例
爲什麼不使用this.class?因爲是static不能用this(我經常犯這個錯誤。。。)
爲什麼不使new XXXX().getClass()?因爲。。。。你猜呢?
5.
根據實際需要log.debug()log.info()log.warn()log.error()log.fatal() 就可以輸出不同等級的log


log的等級

1.
爲什麼需要等級?寫代碼的時候可能需要很多調試信息,運行的時候可能需要顯示提示信息,如果在服務器上發生嚴重錯誤的時候,可能需要給管理員發郵件。這種:調試,提示,錯誤就是等級。
2.
都有什麼等級?調試(DEBUG)<信息(INFO)<警告(WARN)<錯誤(ERROR)<致命錯誤(FATAL)
3.
怎麼用? log.debug() log.info() log.warn() log.error()log.fatal()依次對應上邊的等級


log4j的配製

1.
基本參數解釋:
全局配製
log4j.rootLogger = [ level ] , appenderName, appenderName,..........appenderName
log4j.rootLogger的意思可以理解爲:根log或者所有的log
level就是輸出級別,只能設置一個值。
·
關於等級,前邊已經說過了有5種,他們之間的關係可以理解爲:
調試(DEBUG):包含調試(DEBUG)、信息(INFO)、警告(WARN)、錯誤(ERROR)、致命錯誤(FATAL)
信息(INFO):包含信息(INFO)、警告(WARN)、錯誤(ERROR)、致命錯誤(FATAL)
警告(WARN):包含警告(WARN)、錯誤(ERROR)、致命錯誤(FATAL)
錯誤(ERROR):包含錯誤(ERROR)、致命錯誤(FATAL)
致命錯誤(FATAL):只有他自己
這樣,如果log4j.rootLogger = INFO,那麼 INFOWARNERRORFATAL就全部會被輸出
如果log4j.rootLogger = ERROR,那麼ERRORFATAL就全部會被輸出
appenderName就是記錄的目標,目標可以多個,中間用『,』分割,appenderName是自己定義的,換句話說,名字是隨便起的,起了名之後,就需要在下邊設定具體配製
總結一下這部分,比如說有這麼一句log4j.rootLogger = INFO, F1,F2那麼就以爲着要將所有INFOWARNERRORFATALlog全部輸出到F1F2上。F1F2是什麼?往下看。。。。
具體配製
log4j.appender.F1=org.apache.log4j.ConsoleAppender
log4j.appender.F1.layout=org.apache.log4j.PatternLayout
log4j.appender.F1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p]%m%n
log4j.appender.F1=org.apache.log4j.ConsoleAppender的意思就是:將F1設置爲控制檯輸出
·
還可以設置成什麼?
org.apache.log4j.ConsoleAppender
(控制檯),
org.apache.log4j.FileAppender
(文件),
org.apache.log4j.DailyRollingFileAppender
(每天產生一個日誌文件),
org.apache.log4j.RollingFileAppender
(文件大小到達指定尺寸的時候產生一個新的文件),
org.apache.log4j.WriterAppender
(將日誌信息以流格式發送到任意指定的地方)
log4j.appender.F1.layout=org.apache.log4j.PatternLayout的意思就是:將F1的輸出佈局設置爲自定義輸出佈局。
·
還可以設置成什麼?
org.apache.log4j.HTMLLayout
(以HTML表格形式佈局)
org.apache.log4j.xml.XMLLayout
(以XML形式佈局)
org.apache.log4j.PatternLayout
(可以靈活地指定佈局模式),
org.apache.log4j.SimpleLayout
(包含日誌信息的級別和信息字符串),
org.apache.log4j.TTCCLayout
(包含日誌產生的時間、線程、類別等等信息)
log4j.appender.F1.layout.ConversionPattern=%d{yyyy-MM-ddHH:mm:ss,SSS} [%c]-[%p] %m%n既然上邊定義的是自定義輸出佈局,那麼就要定義一下具體輸出什麼樣了~~上邊的%c %p %m 等以%開頭的都是模式字符串,除了模式字符串外[]-空格等這些字符會按照原樣顯示。
·
模式字符串解釋:
%m:
消息本身
%p:
消息的級別INFOWARNERROR。。。
%r:
從程序開始執行到當前日誌產生時的時間間隔(微秒)
%c:
輸出當前日誌動作所在的category名稱。例如:如果category名稱是"a.b.c","%c{2}"將會輸出"b.c". {2}意謂着輸出以點分隔開的category名稱的後兩個組件”,如果 {n}沒有,將會輸出整個category名稱.
%t:
輸出當前線程的名稱
%x:
輸出和當前線程相關聯的NDC,尤其用到像java servlets這樣的多客戶多線程的應用中。
%n:
輸出平臺相關的換行符。
%%:
輸出一個"%"字符
%d:
輸出日誌產生時候的日期,當然可以對日期的格式進行定製。例如:%d{HH:mm:ss,SSSS}或者是%d{dd MMM yyyy HH:mm:ss,SSSS},如果沒有指定後面的格式,將會輸出ISO8601的格式。
%l:
輸出位置信息,相當於%C.%M(%F:%L)的組合。
%C:
輸出日誌消息產生時所在的類名,如果類名是“test.page.Class1”%C{1}表示輸出類名"Class1",%C{2}輸出"page.Class1",%C則輸出"test.page.Class1"
%M:
輸出日誌消息產生時的方法名稱
%F:
輸出日誌消息產生時所在的文件名稱
%L:
輸出代碼中的行號
·
可以在%與模式字符之間加上修飾符來控制其最小寬度、最大寬度、和文本的對齊方式。如:
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字符,就從左邊交遠銷出的字符截掉。
總結一下,現在來我們所配製的F1的全部內容
·
我們把它配製成了屏幕輸出
·
輸出的佈局爲:自定義佈局
·
我們又定義了自定義佈局的格式:日期時間(格式爲:yyyy-MM-dd HH:mm:ss,SSS[產生該日誌的包名類名方法名] [等級] 信息+回車
如果想配製F2爲每天產生一個日誌文件,並且保存爲xml,就這麼寫:
log4j.appender.F2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.F2.layout=org.apache.log4j.xml.XMLLayout
這樣就可以了嗎?當然不是,既然保存爲文件。。至少要指定一個文件名吧
log4j.appender.F2.File=c:/logs/log.xml
可以了嗎?可以運行了。。。但是。。既然每天都產生一個文件,那麼前一天的怎麼辦呢?
log4j.appender.F2.DatePattern=yyyyMMdd'.xml.back'
這樣log4j會在第一次產生今天的log的同時,將昨天的log備份爲 log文件名.擴展名yyyyMMdd.xml.back。對應我們這個文件,今天的log到明天有新log產生的時候,就會變爲log.xml20070420.xml.back
這樣的參數到底有多少?常用的有:
ConsoleAppender選項
·Threshold=WARN:
指定日誌消息的輸出最低層次。
·ImmediateFlush=true:
默認值是true,意謂着所有的消息都會被立即輸出。
·Target=System.err
:默認情況下是:System.out,指定輸出控制檯
FileAppender 選項
·Threshold=WARN:
指定日誌消息的輸出最低層次。
·ImmediateFlush=true:
默認值是true,意謂着所有的消息都會被立即輸出。
·File=mylog.txt:
指定消息輸出到mylog.txt文件。
·Append=false:
默認值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內容。
RollingFileAppender選項
·Threshold=WARN:
指定日誌消息的輸出最低層次。
·ImmediateFlush=true:
默認值是true,意謂着所有的消息都會被立即輸出。
·File=mylog.txt:
指定消息輸出到mylog.txt文件。
·Append=false:
默認值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內容。
·MaxFileSize=100KB:
後綴可以是KB, MB 或者是 GB. 在日誌文件到達該大小時,將會自動滾動,即將原來的內容移到mylog.log.1文件。
·MaxBackupIndex=2:
指定可以產生的滾動文件的最大數。
DailyRollingFileAppender選項
·Threshold=WARN:
指定日誌消息的輸出最低層次。
·ImmediateFlush=true:
默認值是true,意謂着所有的消息都會被立即輸出。
·File=mylog.txt:
指定消息輸出到mylog.txt文件。
·Append=false:
默認值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內容。
·DatePattern='.'yyyy-ww:
每週滾動一次文件,即每週產生一個新的文件。當然也可以指定按月、周、天、時和分。即對應的格式如下:
1)'.'yyyy-MM:
每月
2)'.'yyyy-ww:
每週
3)'.'yyyy-MM-dd:
每天
4)'.'yyyy-MM-dd-a:
每天兩次
5)'.'yyyy-MM-dd-HH:
每小時
6)'.'yyyy-MM-dd-HH-mm:
每分鐘
PatternLayout 選項
·ConversionPattern=%m%n :
指定怎樣格式化指定的消息。
HTMLLayout 選項
·LocationInfo=true:
默認值是false,輸出java文件名稱和行號
·Title=my app file:
默認值是 Log4JLog Messages.
XMLLayout 選項
·LocationInfo=true:
默認值是false,輸出java文件和行號
現在來看一下我們完整的第一個配製文件:
========================================================================================
log4j.rootLogger = INFO,F1,F2

log4j.appender.F1=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.F1.Target=System.out
log4j.appender.F1.layout=org.apache.log4j.PatternLayout
log4j.appender.F1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p]%m%n

log4j.appender.F2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.F2.File=c:/logs/log.xml
log4j.appender.F2.DatePattern=yyyyMMdd-HH'.xml.back'
log4j.appender.F2.layout=org.apache.log4j.xml.XMLLayout
========================================================================================
編段代碼看看效果
========================================================================================
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class Main{
private static Log log = LogFactory.getLog(Main.class);
public static void main(String[] args) throws Exception{
log.info("info");
log.debug("debug");
log.warn("warn");
log.error("error");
}

}
========================================================================================
運行效果
========================================================================================
2007-04-20 12:36:22,531 [cn.yyun.test.Main]-[INFO] info
2007-04-20 12:36:22,531 [cn.yyun.test.Main]-[WARN] warn
2007-04-20 12:36:22,531 [cn.yyun.test.Main]-[ERROR] error
========================================================================================
並且在c:/logs/下有log.xml生成,裏邊的內容爲:
========================================================================================
<log4j:event logger="cn.yyun.test.Main" timestamp="1177043782531"level="INFO" thread="main">
<log4j:message><![CDATA[info]]></log4j:message>
</log4j:event>

<log4j:event logger="cn.yyun.test.Main" timestamp="1177043782531"level="WARN" thread="main">
<log4j:message><![CDATA[warn]]></log4j:message>
</log4j:event>

<log4j:event logger="cn.yyun.test.Main" timestamp="1177043782531"level="ERROR" thread="main">
<log4j:message><![CDATA[error]]></log4j:message>
</log4j:event>
========================================================================================
仔細看一下會發現,雖然我們在代碼裏寫了log.debug("debug")但是debug並沒有出現在log中,這是因爲我們配置文件中,定義了log的等級爲INFOdebug的等級小於info,所以不會顯示,而warnerror的大於info,所以也會被顯示出來


2.
根據package生成不同的log文件
配置
log4j.logger.cn.yyun.test.abc=INFO,abc2,abc1

log4j.appender.abc2=org.apache.log4j.ConsoleAppender
log4j.appender.abc2.layout=org.apache.log4j.PatternLayout
log4j.appender.abc2.layout.ConversionPattern=abc:[%p] %m%n

log4j.appender.abc1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.abc1.File=C:/logs/abc.log
log4j.appender.abc1.DatePattern='.'yyyyMMdd
log4j.appender.abc1.layout=org.apache.log4j.PatternLayout
log4j.appender.abc1.layout.ConversionPattern=%d %r [%t] %5p - %m%n

log4j.logger.cn.yyun.test.def=INFO,def
log4j.appender.def=org.apache.log4j.ConsoleAppender
log4j.appender.def.layout=org.apache.log4j.PatternLayout
log4j.appender.def.layout.ConversionPattern=def: [%p] %m%n

logger.cn.yyun.test.abc換成需要的package就可以了(整個log4j配製文件中只有這些就可以了)。但是這樣會有另一個問題,如果cn.yyun.test.Main這個類中,如果有log操作,會報告:log4j:WARN No appenders could be found for logger (cn.yyun.test.Main).所以要加上log4j.rootCategory=INFO,F1 這樣所有的log都會被紀錄了。。但是這樣又做之後:cn.yyun.test.def裏的log,會同時出現在defF1中,cn.yyun.test.abc裏的log,會同時出現在abc1abc2F1中。。。。。所以定義的時候一定要規劃好。
制定packagelog等級
log4j.logger.org.hibernate=DEBUG 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章