1.概述
1.1背景
在我們的日常開發中,日誌記錄非常重要。在應用程序中添加日誌記錄總的來說基於三個目的:監視代碼中變量的變化情況,週期性的記錄到文件中供其他應用進行統計分析工作;跟踪代碼運行時軌跡,作為日後審計的依據;擔當集成開發環境中的調試器的作用,向文件或控制台打印代碼的調試信息。
1.2簡介
Log4j(log for java)是Apache的一個開放源代碼項目,它提供了一種細膩的日誌管理方式。通過一個配置文件,我們可以多選擇的控制每條日誌的輸出格式和目的地。通過定義信息的級別,我們也可以靈活開關代碼中的反饋信息。簡單的說log4j就是幫助開發人員進行日誌輸出管理的API類庫。它最重要的特點就可以配置文件靈活的設置日誌信息的優先級、日誌信息的輸出目的地以及日誌信息的輸出格式。
2.log4j配置
2.1log4j的類圖
2.2定義配置文件
Log4j可以通過java程序動態設置,該方式明顯缺點是:如果需要修改日誌輸出級別等信息,則必須修改java文件,然後重新編譯,很是麻煩。
使用配置文件將使我們的應用程序更加靈活配置log,日誌輸出方式包括輸出優先級、輸出目的地、輸出格式。 Log4j支持兩種配置文件格式,一種是XML格式的文件,一種是Java特性文件log4j.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,其語法表示為:
log4j.appender.appenderName = fully.qualified.name.of.appender.classlog4j.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選項
(2).FileAppender 選項
(3).DailyRollingFileAppender 選項
即對應的格式如下:
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 選項
2.4.3格式(佈局)Layout
有時希望根據自己的喜好格式化自己的日誌輸出。 Log4j可以在Appender的後面附加Layout來完成這個功能。
配置Layout,其語法表示為:
log4j.appender.appenderName.layout =fully.qualified.name.of.layout.classlog4j.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 :指定怎樣格式化指定的消息。
這裡需要說明的就是日誌信息格式中幾個符號所代表的含義:
可以在%與模式字符之間加上修飾符來控制其最小寬度、最大寬度、和文本的對齊方式。如:
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配置文件實現了輸出到控制台、文件、回滾文件、發送日誌郵件、輸出到數據庫日誌表、自定義標籤等全套功能。
log4j.rootLogger=DEBUG,CONSOLE,A1,im log4j.addivity.org.apache=true
n 應用於控制台
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppenderlog4j.appender.Threshold=DEBUG log4j.appender.CONSOLE.Target=System.outlog4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%d-%c-%-4r[%t]%-5p%c%x-%m%n
n 應用於文件
log4j.appender.FILE=org.apache.log4j.FileAppenderlog4j.appender.FILE.File=file.loglog4j.appender.FILE.Append=falselog4j.appender.FILE.layout=org.apache.log4j.PatternLayoutlog4j.appender.FILE.layout.ConversionPattern=%d - %c -%-4r [%t] %-5p %c %x - %m%n
n 應用於文件回滾
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppenderlog4j.appender.ROLLING_FILE.Threshold=ERRORlog4j.appender.ROLLING_FILE.File=rolling.loglog4j.appender.ROLLING_FILE.Append=truelog4j.appender.ROLLING_FILE.MaxFileSize=10KBlog4j.appender.ROLLING_FILE.MaxBackupIndex=1log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayoutlog4j.appender.ROLLING_FILE.layout.ConversionPattern=%d - %c -%-4r [%t] %-5p %c %x - %m%n
n 應用於socket
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppenderlog4j.appender.SOCKET.RemoteHost=localhost log4j.appender.SOCKET.Port=5001log4j.appender.SOCKET.LocationInfo=true log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayoutlog4j.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=2000n 發送日誌給郵件
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppenderlog4j.appender.MAIL.Threshold=FATALlog4j.appender.MAIL.BufferSize=10log4j.appender.MAIL.From=web@www.wuset.comlog4j.appender.MAIL.SMTPHost=www.wusetu.comlog4j.appender.MAIL.Subject=Log4J Message log4j.appender.MAIL.To=web@www.wusetu.comlog4j.appender.MAIL.layout=org.apache.log4j.PatternLayout log4j.appender.MAIL.layout.ConversionPattern=%d-%c-%-4r[%t]%-5p%c%x-%m%n
n 用於數據庫
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppenderlog4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/testlog4j.appender.DATABASE.driver=com.mysql.jdbc.Driver log4j.appender.DATABASE.user=rootlog4j.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%nlog4j.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.XMLLayoutn 自定義Appender
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppenderlog4j.appender.im.host = mail.cybercorlin.net log4j.appender.im.username = username log4j.appender.im.password = password log4j.appender.im.recipient = [email protected]=org.apache.log4j.PatternLayoutlog4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
3.在WEB應用中為SPRING配置Log4j
首先需要在web.xml文件中加入下面的配置語句:
<!-- 為避免項目間衝突,定義唯一的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,第一步就是要獲取日誌記錄器,這個記錄器將負責控制日誌信息。
public static Logger getLogger( String name)
通過指定的名字獲得記錄器,如果必要的話,則為這個名字創建一個新的記錄器。 name一般取本類的名字,比如:
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適用於所有的系統。如下的語句。
PropertyConfigurator.configure("log4j.properties");對於一般的java project可以不使用上面的語句初始化log4j,log4j會自動在classpath下,找到配置文件並初始化。如果log4j不能自動初始化配置文件,那麼就需要用上面的方法進行初始化。
注意:初始化配置文件,最好只在系統啟動的時候執行一次,如果執行多次,一是浪費資源,二就是對於老版本的log4j,使用DailyRollingFileAppender時,可能會出現問題。
4.3.插入記錄信息(格式化日誌信息)
當上兩個必要步驟執行完畢,您就可以輕鬆地使用不同優先級別的日誌記錄語句插入到您想記錄日誌的任何地方,其語法如下:
Logger.debug ( Object message ) ;