Java日誌軟體Log4j的基本使用教程_java

來源:互聯網
上載者:User

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,其文法表示為:

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

  • 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,其文法表示為:

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 :指定怎樣格式化指定的訊息。

這裡需要說明的就是日誌資訊格式中幾個符號所代表的含義:

  • -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設定檔實現了輸出到控制台、檔案、復原檔案、發送日誌郵件、輸出到資料庫日誌表、自訂標籤等全套功能。

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

n 發送日誌給郵件

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

n 自訂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 = corlin@cybercorlin.netlog4j.appender.im.layout=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 ) ;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.