參考網址:
【http://blog.csdn.net/drift_away/article/details/7403658】
【http://blog.csdn.net/lxzo123/article/details/6331783】
【http://baike.baidu.com/view/25347.htm?fr=aladdin】
Log4j是Apache的一個開放源代碼項目,通過使用Log4j,我們可以控制日志資訊輸送的目的地是控制台、檔案、資料庫等目标,而且所有的這些實作都可以通過更改配置檔案來實作,實際應用非常便利。最近因為工作需要,對這個類庫做了比較詳細的學習,整理資料如下:
一、Log4j的使用。
1)、下載下傳需要下載下傳其官方(http://logging.apache.org/log4j/2.x/)的jar包,引入工程
2)、置本地的log4j.properties檔案。(預設讀取的是src根目錄位址,如果不在根目錄,則需要在使用前調用其設定即可)
PropertyConfigurator.configure( "D:/Code/conf/log4j.properties");
3)、在代碼中擷取日志,并調用其接口記錄日志
1 Logger logger = Logger.getLogger(TestLog4j.class );
2 logger.debug( " debug消息 " );
3 logger.error( " error消息 " );
二、Log4j支援兩種配置檔案格式,一種是XML格式的檔案,一種是properties格式的檔案。下面我們介紹使用properties格式做為配置檔案的方法:二、Log4j.properties配置檔案介紹
1)、Log4j.properties參數比較多,不過搞清楚其規律則會非常好用,我們首先看一個獨立的日志配置項,然後逐一介紹其參數内容和可選項。
一個簡單的完整日志配置
#配置根Logger log4j.rootLogger=INFO,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 |
其中appenderName可以當作是定義了一個變量,并配置其具體參數内容。
2)、上述檔案中的參數介紹如下。
1、 配置根Logger,其文法為:
log4j.rootLogger = [ level ] , appenderName,
appenderName, …
其中,level 是日志記錄的優先級,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級别。Log4j建議隻使用四個級别,優先級從高到低分别是ERROR、WARN、INFO、DEBUG。通過在這裡定義的級别,您可以控制到應用程式中相應級别的日志資訊的開關。比如在這裡定義了INFO級别,則應用程式中所有DEBUG級别的日志資訊将不被列印出來。
appenderName就是指定日志資訊輸出到哪個地方。您可以同時指定多個輸出目的地。
2、 配置日志資訊輸出目的地Appender,其文法為:
log4j.appender.appenderName =
fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.option = valueN
其中,Log4j提供的appender有以下幾種:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(檔案),
org.apache.log4j.DailyRollingFileAppender(每天産生一個日志檔案),
org.apache.log4j.RollingFileAppender(檔案大小到達指定尺寸的時候産生一個新的檔案),
org.apache.log4j.WriterAppender(将日志資訊以流格式發送到任意指定的地方)
org.apache.log4j.lf5.LF5Appender (應用于Log
Factor 5 Appender:)
org.apache.log4j.net.SMTPAppender(# 應用于發送日志給郵件: )
org.apache.log4j.jdbc.JDBCAppender(# 應用于資料庫:)
..............................................................................................................................................
(1).ConsoleAppender選項
Threshold=WARN:指定日志消息的輸出最低層次。
ImmediateFlush=true:預設值是true,意謂着所有的消息都會被立即輸出。
Target=System.err:預設情況下是:System.out,指定輸出控制台
(2).FileAppender 選項
File=mylog.txt:指定消息輸出到mylog.txt檔案。
Append=false:預設值是true,即将消息增加到指定檔案中,false指将消息覆寫指定的檔案内容。
(3).DailyRollingFileAppender 選項
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: 每分鐘
(4).RollingFileAppender 選項
MaxFileSize=100KB: 字尾可以是KB, MB 或者是 GB. 在日志檔案到達該大小時,将會自動滾動,即将原來的内容移到mylog.log.1檔案。
MaxBackupIndex=2:指定可以産生的滾動檔案的最大數。
3、配置日志資訊的布局,其文法為:
log4j.appender.appenderName.layout =
fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 =
value1
log4j.appender.appenderName.layout.option = valueN
其中,Log4j提供的layout有以下幾種:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志資訊的級别和資訊字元串),
org.apache.log4j.TTCCLayout(包含日志産生的時間、線程、類别等等資訊)
4、輸出格式設定 (類似C語言中的printf函數的列印格式)
在配置檔案中可以通過log4j.appender.A1.layout.ConversionPattern設定日志輸出格式。
參數:
%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字元,就從左邊交遠銷出的字元截掉。
****************************************************************************
下面給出一個日志檔案配置各種不同場景的完整demlog4j.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
########################
# 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.net.SocketAppende
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
三、Log4j配置不同日志檔案目錄(不同資料庫類似)
1、我們除了對不同級别的日志設定不同輸出appender目标,在一個單個配置檔案中,也可設定多個日志檔案以供不同場景使用。
假設我們需要對三個不同場景"系統","操作","遠端通路"分别記錄日志。那麼可以使用如下配置。
log4j.logger.log.SYSTEM_LOG=,SYSTEM_LOG
log4j.logger.log.OPERATE=,OPERATE
log4j.logger.log.REMOTE=,REMOTE
# SYSTEM_LOG
log4j.appender.SYSTEM_LOG=org.apache.log4j.RollingFileAppender
log4j.appender.SYSTEM_LOG.File=E:/icloud/log/SYSTEM_LOG.log
log4j.appender.SYSTEM_LOG.encoding=UTF-8
log4j.appender.SYSTEM_LOG.Threshold=all
log4j.appender.SYSTEM_LOG.MaxFileSize=50MB
log4j.appender.SYSTEM_LOG.MaxBackupIndex=10
log4j.appender.SYSTEM_LOG.layout=org.apache.log4j.PatternLayout
log4j.appender.SYSTEM_LOG.layout.ConversionPattern=%d{yyyy-M-d HH:mm:ss} %m %n
# REMOTE遠端通路
log4j.appender.REMOTE=org.apache.log4j.RollingFileAppender
log4j.appender.REMOTE.File=E:/icloud/log/REMOTE.log
......
# OPERATE 記錄檔
log4j.appender.OPERATE=org.apache.log4j.RollingFileAppender
log4j.appender.OPERATE.File=E:/icloud/log/OPERATE.log
......
在Java代碼中,可以通過傳入對應參數來獲得制定的日志類。
Logger system_log = log.getLogger("log.SYSTEM_LOG");
Logger operate = log.getLogger("log.OPERATE");
Logger remote = log.getLogger("log.REMOTE");
其中,傳入的字元串參數即為log4j.logger.log.SYSTEM_LOG定義中的紅色部分。
如果是不同包結構,也可以使用上述方式,不同的是字元串替換成包路徑。下面定義中,com.supermap.action和com.supermap.view分别代表不同的包。
log4j.logger.com.supermap.action=INOF,AppenderName1
log4j.logger.com.supermap.view=INOF,AppenderName2
擷取Log可以通過直接傳入包名的方式
Logger log = log.getLogger("com.supermap.action");
也可以通過對應包下的class,并且會通過包結構層級往上傳遞。下面兩者傳回統一的日志記錄目标相同。
Logger log = log.getLogger(com.supermap.action.DrawAction.class);
Logger log = log.getLogger(com.supermap.action.util.DrawActionTool.class);
2、我們也可以通過編寫代碼動态配置的方式來修改LogProperties中的資訊。
InputStream in = this.getClass().getClassLoader()
.getResourceAsStream("com/supermap/tools/locationnormalise/log/log4j.properties");
Properties p = new Properties();
try {
p.load(in);
//預設日志路徑
p.setProperty("log4j.appender.SYSTEM_LOG.File", filePath+"/SYSTEM_LOG.log");
p.setProperty("log4j.appender.OPERATE.File", filePath+"/OPERATE.log");
p.setProperty("log4j.appender.REMOTE.File", filePath+"/REMOTE.log");
PropertyConfigurator.configure(p);
} catch (IOException e) {
e.printStackTrace();
}
3、最後,log4j.Properties中支援對環境變量的引用,可以通過更改環境變量來設定不同的日志記錄目标
Log4j.appender.logfile.File=${WORKDIR}/logs/app.log
其中“${WORKDIR}/”是個變量,會被System Property中的“WORKDIR”的值代替。這樣,我們就可以在log4j加載配置檔案之前,先用System.setProperty設定好根路徑。