1.概述
1.1背景
在我們的日常開發中,日志記錄非常重要。在應用程序中添加日志記錄總的來說基于三個目的:監視代碼中變量的變化情況,周期性的記錄到文件中供其他應用進行統計分析工作;跟蹤代碼運行時軌跡,作為日后審計的依據;擔當集成開發環境中的調試器的作用,向文件或控制臺打印代碼的調試信息。
1.2簡介
Log4j(log for java)是Apache的一個開放源代碼項目,它提供了一種細膩的日志管理方式。通過一個配置文件,我們可以多選擇的控制每條日志的輸出格式和目的地。通過定義信息的級別,我們也可以靈活開關代碼中的反饋信息。簡單的說log4j就是幫助開發人員進行日志輸出管理的API類庫。它最重要的特點就可以配置文件靈活的設置日志信息的優先級、日志信息的輸出目的地以及日志信息的輸出格式。
2.log4j配置
2.1log4j的類圖
- Logger -日志寫出器,供程序員輸出日志信息
- Appender -日志目的地,把格式化好的日志信息輸出到指定的地方去
- ConsoleAppender -目的地為控制臺的Appender
- FileAppender -目的地為文件的Appender
- RollingFileAppender -目的地為大小受限的文件的Appender
- Layout -日志格式化器,用來把程序員的logging request格式化成字符串
- PatternLayout -用指定的pattern格式化logging request的Layout
2.2定義配置文件
Log4j可以通過java程序動態設置,該方式明顯缺點是:如果需要修改日志輸出級別等信息,則必須修改java文件,然后重新編譯,很是麻煩。
使用配置文件將使我們的應用程序更加靈活配置log,日志輸出方式包括輸出優先級、輸出目的地、輸出格式。Log4j支持兩種配置文件格式,一種是XML格式的文件,一種是Java特性文件log4j.properties(鍵=值)。
- n xml文件
- n properties文件(推薦使用)
2.3配置文件log4j.properties
在第一次調用到Log4J時,Log4J會在類路徑(../web-inf/class/當然也可以放到其它任何目錄,只要該目錄被包含到類路徑中即可)中定位這個文件,并讀入這個文件完整的配置。這個配置文件告訴Log4J以什么樣的格式、把什么樣的信息、輸出到什么地方。相應的,我們需要配置3個方面的內容:
1、根目錄(級別和目的地);
2、目的地(控制臺、文件等等);
3、輸出樣式(何種方式顯示日志內容)
示例如下:
#設置日志輸出級別
log4j.rootLogger=debug,appender1
#輸出到控制臺
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
#樣式為TTCCLayout
log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout
2.4.log4j三組件說明
Log4j有三個主要的組件:Loggers(記錄器),Appender (輸出源)和Layout(布局)。綜合使用這三個組件可以輕松的記錄信息的類型和級別,并可以在運行時控制日志輸出的樣式和位置。下面對三個組件分別進行說明:
2.4.1日志記錄器Logger
Logger對象是用來取代System.out或者System.err的日志寫出器,用來供程序員輸出日志信息。
配置根Logger,語法為:
log4j.rootLogger = [ level ] , appenderName, appenderName,…
其中,level 是日志記錄的優先級,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定義的級別。Log4j建議只使用四個級別,優先級從高到低分別是ERROR、WARN、INFO、DEBUG。通過在這里定義的級別,您可以控制到應用程序中相應級別的日志信息的開關。比如在這里定義了INFO級別,則應用程序中所有DEBUG級別的日志信息將不被打印出來。appenderName就是指定日志信息輸出到哪個地方。可同時指定多個輸出目的地。
2.4.2輸出目的地Appender
Log4j日志系統允許把日志輸出到不同的地方,如控制臺(Console)、文件(Files)、根據天數或者文件大小產生新的文件、以流的形式發送到其它地方等等。
配置appender,其語法表示為:
1
2
3
4
|
log4j.appender.appenderName = fully.qualified.name.of.appender.class log4j.appender.appenderName.option1 = value1 … log4j.appender.appenderName.option = valueN |
"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(將日志信息以流格式發送到任意指定的地方)
(1).ConsoleAppender選項
- Threshold=WARN:指定日志消息的輸出最低層次。
- ImmediateFlush=true:默認值是true,意謂著所有的消息都會被立即輸出。
- Target=System.err:默認情況下是:System.out,指定輸出控制臺
(2).FileAppender 選項
- Threshold=WARN:指定日志消息的輸出最低層次。
- ImmediateFlush=true:默認值是true,意謂著所有的消息都會被立即輸出。
- File=mylog.log:指定消息輸出到mylog.log文件。
- Append=false:默認值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內容。
(3).DailyRollingFileAppender 選項
- Threshold=WARN:指定日志消息的輸出最低層次。
- ImmediateFlush=true:默認值是true,意味著所有的消息都會被立即輸出。
- File=mylog.log:指定消息輸出到mylog.log文件。
- 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: 每分鐘
4.RollingFileAppender 選項
- Threshold=WARN:指定日志消息的輸出最低層次。
- ImmediateFlush=true:默認值是true,意味著所有的消息都會被立即輸出。
- File=mylog.log:指定消息輸出到mylog.log文件。
- Append=false:默認值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內容。
- MaxFileSize=100KB: 后綴可以是KB, MB或者是 GB.在日志文件到達該大小時,將會自動滾動,即將原來的內容移到mylog.log.1文件。
- MaxBackupIndex=2:指定可以產生的滾動文件的最大數。
2.4.3格式(布局)Layout
有時希望根據自己的喜好格式化自己的日志輸出。Log4j可以在Appender的后面附加Layout來完成這個功能。
配置Layout,其語法表示為:
1
2
3
4
|
log4j.appender.appenderName.layout =fully.qualified.name.of.layout.class log4j.appender.appenderName.layout.option1 = value1 … log4j.appender.appenderName.layout.option = valueN |
Layout提供了四種日志輸出樣式,如下所示:
(1).org.apache.log4j.HTMLLayout(以HTML表格形式布局),
(2).org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
(3).org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串),
(4).org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息)
HTMLLayout 選項
LocationInfo=true:默認值是false,輸出java文件名稱和行號
Title=my app file: 默認值是 Log4J Log Messages.
2.PatternLayout 選項
ConversionPattern=%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: 輸出一個回車換行符
可以在%與模式字符之間加上修飾符來控制其最小寬度、最大寬度、和文本的對齊方式。如:
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字符,就從左邊把多出的字符截掉。
2.5.log4j配置示例
LOG4J的配置之簡單使它遍及于越來越多的應用中:Log4J配置文件實現了輸出到控制臺、文件、回滾文件、發送日志郵件、輸出到數據庫日志表、自定義標簽等全套功能。
1
2
|
log4j.rootLogger=DEBUG,CONSOLE,A1,im log4j.addivity.org.apache=true |
n 應用于控制臺
1
2
3
4
5
|
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=%d-%c-%-4r[%t]%-5p%c%x-%m%n |
n 應用于文件
1
2
3
4
5
|
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=%d - %c -%-4r [%t] %-5p %c %x - %m%n |
n 應用于文件回滾
1
2
3
4
5
6
7
8
|
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=%d - %c -%-4r [%t] %-5p %c %x - %m%n |
n 應用于socket
1
2
3
4
5
6
7
8
9
|
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender log4j.appender.SOCKET.RemoteHost=localhost log4j.appender.SOCKET.Port=5001 log4j.appender.SOCKET.LocationInfo=true 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 |
n 發送日志給郵件
1
2
3
4
5
6
7
8
9
|
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=%d-%c-%-4r[%t]%-5p%c%x-%m%n |
n 用于數據庫
1
2
3
4
5
6
7
8
9
10
11
12
|
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 ('%d - %c -%-4r [%t] %-5p %c %x - %m%n') log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout log4j.appender.DATABASE.layout.ConversionPattern=%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 |
n 自定義Appender
1
2
3
4
5
6
7
8
9
|
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 = corlin@cybercorlin.net log4j.appender.im.layout=org.apache.log4j.PatternLayout log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n |
3.在WEB應用中為SPRING配置Log4j
首先需要在web.xml文件中加入下面的配置語句:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<!-- 為避免項目間沖突,定義唯一的 webAppRootKey--> < context-param > < param-name >webAppRootKey</ param-name > < param-value >myProject.root</ param-value > </ context-param > <!-- 加載log4j的配置文件log4j.properties --> < context-param > < param-name >log4jConfigLocation</ param-name > < param-value >/WEB-INF/classes/config/log4j/log4j.properties</ param-value > </ context-param > <!-- 設定刷新日志配置文件的時間間隔,這里設置為60s --> < context-param > < param-name >log4jRefreshInterval</ param-name > < param-value >60000</ param-value > </ context-param > <!-- 加載Spring框架中的log4j監聽器Log4jConfigListener --> < listener > < listener-class >org.springframework.web.util.Log4jConfigListener</ listener-class > </ listener > |
屬性log4jConfigLocation的值建議還是設置為:/WEB-INF/classes/log4j.properties,這樣我們在不啟動web應用的時候,做一些測試就能夠正確地記錄日志信息。Log4jConfigListener是spring提供的工具類,它開啟一個log4j的監視線程,并每60(log4jRefreshInterval變量定義)秒檢測日志配置變化,從而不需要每次重新啟動web服務來應用新的配置。在tomcat中沒有根據web應用來分開系統屬性。所以必須為每一個web應用定義唯一的"webAppRootKey",我們取名為webApp.root.在啟動環境后,Log4jConfigListener會將值注入到webApp.root變量。
4.在代碼中使用Log4j
4.1.得到記錄器
使用Log4j,第一步就是要獲取日志記錄器,這個記錄器將負責控制日志信息。
1
|
public static Logger getLogger( String name) |
通過指定的名字獲得記錄器,如果必要的話,則為這個名字創建一個新的記錄器。name一般取本類的名字,比如:
1
|
static Logger logger = Logger.getLogger ( ServerWithLog4j. class .getName () ) |
4.2.讀取配置文件
當獲得了日志記錄器之后,第二步將配置Log4j環境,其語法為:
若將log4j.properties放在工程根目錄下也可不寫此句,程序會自動找到配置文件。
BasicConfigurator.configure (): 自動快速地使用缺省Log4j環境。PropertyConfigurator.configure ( String configFilename) :讀取使用Java的特性文件編寫的配置文件。
DOMConfigurator.configure ( String filename ):讀取XML形式的配置文件。
log4j使用以上3種配置器來初始化,使用PropertyConfigurator適用于所有的系統。如下的語句。
1
|
PropertyConfigurator.configure( "log4j.properties" ); |
對于一般的java project可以不使用上面的語句初始化log4j,log4j會自動在classpath下,找到配置文件并初始化。如果log4j不能自動初始化配置文件,那么就需要用上面的方法進行初始化。
注意:初始化配置文件,最好只在系統啟動的時候執行一次,如果執行多次,一是浪費資源,二就是對于老版本的log4j,使用DailyRollingFileAppender時,可能會出現問題。
4.3.插入記錄信息(格式化日志信息)
當上兩個必要步驟執行完畢,您就可以輕松地使用不同優先級別的日志記錄語句插入到您想記錄日志的任何地方,其語法如下:
1
|
Logger.debug ( Object message ) ; |