log4j 使用說明總結

  1 概述

  本文檔是針對Log4j日誌工具的使用指南。包括:日誌介紹、日誌工具介紹、Log4j基本使用、Log4j的高級使用、Spring與log4j的集成等。並進行了舉例說明。

  本文檔適合所有Java開發人員。

  2 日誌介紹

  存儲軟件程序、服務或操作系統產生的消息記錄的文件。

  電腦裏的日誌是指日誌數據可以是有價值的信息寶庫,也可以是毫無價值的數據泥潭。要保護和提高你的網絡安全,由各種操作系統、應用程序、設備和安全產品的日誌數據能夠幫助你提前發現和避開災難,並且找到安全事件的根本原因。

  當然,日誌數據對於實現網絡安全的價值有多大取決於兩個因素:第一,你的系統和設備必須進行合適的設置以便記錄你需要的數據。第二,你必須有合適的工具、培訓和可用的資源來分析收集到的數據。

  3 工具介紹

  日誌工具支持級別配置、輸出格式配置、輸出源配置等功能。工具包括:logger4j、Commons Logging、Simple Log、MonoLog。

  3.1 logger4j

  Log4j是Apache的一個開放源代碼項目,通過使用Log4j,我們可以控制日誌信息輸送的;我們也可以控制每一條日誌的輸出格式;通過定義每一條日誌信息的級別,我們能夠更加細緻地控制日誌的生成過程。最令人感興趣的就是,這些可以通過一個配置文件來靈活地進行配置,而不需要修改應用的代碼。

  log4j的好處在於:

  1) 通過修改配置文件,就可以決定log信息的目的地——控制檯、文件、GUI組件、甚至是套接口服務器、NT的事件記錄器、UNIX Syslog守護進程等

  2) 通過修改配置文件,可以定義每一條日誌信息的級別,從而控制是否輸出。在系統開發階段可以打印詳細的log信息以跟蹤系統運行情況,而在系統穩定後可以關閉log輸出,從而在能跟蹤系統運行情況的同時,又減少了垃圾代碼(System.out.println(......)等)。

  3) 使用log4j,需要整個系統有一個統一的log機制,有利於系統的規劃。

  此外,通過Log4j其他語言接口,您可以在C、C++、.Net、PL/SQL程序中使用Log4j,其語法和用法與在Java程序中一樣,使得多語言分佈式系統得到一個統一一致的日誌組件模塊。而且,通過使用各種第三方擴展,您可以很方便地將Log4j集成到J2EE、JINI甚至是SNMP應用中。

  3.2 Commons Logging

  Jakarta Commons Logging (JCL)提供的是一個日誌(Log)接口(interface),同時兼顧輕量級和不依賴於具體的日誌實現工具。它提供給中間件/日誌工具開發者一個簡單的日誌操作抽象,允許程序開發人員使用不同的具體日誌實現工具。用戶被假定已熟悉某種日誌實現工具的更高級別的細節。JCL提供的接口,對其它一些日誌工具,包括Log4J, Avalon LogKit, and JDK 1.4等,進行了簡單的包裝,此接口更接近於Log4J和LogKit的實現.

  3.3 Simple Log

  Simple Log是一個logging anti-framework.Simple Log是一個讓日記操作變得簡單但很小的類庫並且幾乎不需要你做任何操作就可以得到日記的輸出.它與其它日記框架相比最大的特點是使用簡單,特別是在條件配置方面.它並不打算在一個包中解決所有日記問題,但它提供足夠的功能來滿足大多數應用程序所需的日記操作.

  3.4 MonoLog

  Monolog是一個用於監視和日誌操作的API,國際化支持.

  4 Log4j基本配置

  Log4j由三個重要的組件構成:Loggers,Appenders和Layouts,分別表示:日誌信息的優先級,日誌信息的輸出目的地,日誌信息的輸出格式。支持key=value格式設置或xml格式設置。

  l 日誌信息的優先級從高到低有FATAL、ERROR、WARN、INFO、DEBUG,分別用來指定這條日誌信息的重要程度;

  l 日誌信息的輸出目的地指定了日誌將打印到控制檯還是文件中;

  l 而輸出格式則控制了日誌信息的顯示內容。

  4.1 日誌信息的優先級

  Log4j劃分爲OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級別。 Log4j建議只使用四個級別,優先級從高到低分別是ERROR、WARN、INFO、DEBUG。通過在這裏定義的級別,您可以控制到應用程序中相應級別的日誌信息的開關。

  假如在一個級別爲q的Logger中發生一個級別爲p的日誌請求,如果p>=q,那麼請求將被啓用。這是Log4j的核心原則。比如在這裏定義了INFO級別,則應用程序中所有DEBUG級別的日誌信息將不被打印出來。

  4.2 輸出源的使用

  有選擇的能用或者禁用日誌請求僅僅是Log4j的一部分功能。Log4j允許日誌請求被輸出到多個輸出源。用Log4j的話說,一個輸出源被稱做一個Appender。 Appender包括console(控制檯), files(文件), GUI components(圖形的組件), remote socket servers(socket 服務), JMS(java信息服務), NT Event Loggers(NT的事件日誌), and remote UNIX Syslog daemons(遠程UNIX的後臺日誌服務)。它也可以做到異步記錄。

  一個logger可以設置超過一個的appender。 用addAppender 方法添加一個appender到一個給定的logger。對於一個給定的logger它每個生效的日誌請求都被轉發到該logger所有的appender上和該logger的父輩logger的appender上。

  4.2.1 ConsoleAppender

  如果使用ConsoleAppender,那麼log信息將寫到Console。效果等同於直接把信息打印到System.out上了。

  4.2.2 FileAppender

  使用FileAppender,那麼log信息將寫到指定的文件中。這應該是比較經常使用到的情況。相應地,在配置文件中應該指定log輸出的文件名。如下配置指定了log文件名爲dglog.txt

  log4j.appender.A2.File=dglog.txt

  注意將A2替換爲具體配置中Appender的別名。

  4.2.3 DailyRollingAppender

  使用FileAppender可以將log信息輸出到文件中,但是如果文件太大了讀起來就不方便了。這時就可以使用DailyRollingAppender。DailyRollingAppender可以把Log信息輸出到按照日期來區分的文件中。配置文件就會每天產生一個log文件,每個log文件只記錄當天的log信息:

  log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender

  log4j.appender.A2.file=dglog

  log4j.appender.A2.DatePattern='.'yyyy-MM-dd

  log4j.appender.A2.layout=org.apache.log4j.PatternLayout

  log4j.appender.A2.layout.ConversionPattern= %5r %-5p %c{2} - %m%n

  4.2.4 RollingFileAppender

  文件大小到達指定尺寸的時候產生一個新的文件。

  log4j.appender.R=org.apache.log4j.RollingFileAppender

  log4j.appender.R.File= ../logs/dglog.log

  # Control the maximum log file size

  log4j.appender.R.MaxFileSize=100KB

  # Archive log files (one backup file here)

  log4j.appender.R.MaxBackupIndex=1

  log4j.appender.R.layout=org.apache.log4j.PatternLayout

  log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

  這個配置文件指定了輸出源R,是一個輪轉日誌文件。最大的文件是100KB,當一個日誌文件達到最大尺寸時,Log4J會自動把example.log重命名爲dglog.log.1,然後重建一個新的dglog.log文件,依次輪轉。

  4.2.5 WriterAppender

  將日誌信息以流格式發送到任意指定的地方。

  4.3 Layout的配置

  Layout指定了log信息輸出的樣式。

  4.3.1 佈局樣式

  org.apache.log4j.HTMLLayout(以HTML表格形式佈局),

  org.apache.log4j.PatternLayout(可以靈活地指定佈局模式),

  org.apache.log4j.SimpleLayout(包含日誌信息的級別和信息字符串),

  org.apache.log4j.TTCCLayout(包含日誌產生的時間、線程、類別等等信息)

  4.3.2 格式

  %m 輸出代碼中指定的消息

  %p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL

  %r 輸出自應用啓動到輸出該log信息耗費的毫秒數

  %c 輸出所屬的類目,通常就是所在類的全名

  %t 輸出產生該日誌事件的線程名

  %n 輸出一個回車換行符,Windows平臺爲"rn",Unix平臺爲"n"

  %d 輸出日誌時間點的日期或時間,默認格式爲ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921

  %l 輸出日誌事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。舉例:Testlog4.main(Test Log4.java:10)

  4.3.3 例子

  例子1:顯示日期和log信息

  log4j.appender.A2.layout=org.apache.log4j.PatternLayout

  log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %m%n

  打印的信息是:

  2002-11-12 11:49:42,866 SELECT * FROM Role WHERE 1=1 order by createDate desc

  例子2:顯示日期,log發生地方和log信息

  log4j.appender.A2.layout=org.apache.log4j.PatternLayout

  log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %l "#" %m%n

  2002-11-12 11:51:46,313 cn.net.unet.weboa.system.dao.RoleDAO.select(RoleDAO.java:409) "#"

  SELECT * FROM Role WHERE 1=1 order by createDate desc

  例子3:顯示log級別,時間,調用方法,log信息

  log4j.appender.A2.layout=org.apache.log4j.PatternLayout

  log4j.appender.A2.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS}

  method:%l%n%m%n

  log信息:

  [DEBUG] 2002-11-12 12:00:57,376

  method:cn.net.unet.weboa.system.dao.RoleDAO.select(RoleDAO.java:409)

  SELECT * FROM Role WHERE 1=1 order by createDate desc

  4.4 Properties配置文件實例

  log4j.rootLogger=DEBUG

  #將DAO層log記錄到DAOLog,allLog中

  log4j.logger.DAOLog=DEBUG,A2,A4

  #將邏輯層log記錄到BusinessLog,allLog中

  log4j.logger.Businesslog=DEBUG,A3,A4

  #A1--打印到屏幕上

  log4j.appender.A1=org.apache.log4j.ConsoleAppender

  log4j.appender.A1.layout=org.apache.log4j.PatternLayout

  log4j.appender.A1.layout.ConversionPattern=%-5p [%t] %37c %3x - %m%n

  #A2--打印到文件DAOLog中--專門爲DAO層服務

  log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender

  log4j.appender.A2.file=DAOLog

  log4j.appender.A2.DatePattern='.'yyyy-MM-dd

  log4j.appender.A2.layout=org.apache.log4j.PatternLayout

  log4j.appender.A2.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS}

  method:%l%n%m%n

  #A3--打印到文件BusinessLog中--專門記錄邏輯處理層服務log信息

  log4j.appender.A3=org.apache.log4j.DailyRollingFileAppender

  log4j.appender.A3.file=BusinessLog

  log4j.appender.A3.DatePattern='.'yyyy-MM-dd

  log4j.appender.A3.layout=org.apache.log4j.PatternLayout

  log4j.appender.A3.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS}

  method:%l%n%m%n

  #A4--打印到文件alllog中--記錄所有log信息

  log4j.appender.A4=org.apache.log4j.DailyRollingFileAppender

  log4j.appender.A4.file=alllog

  log4j.appender.A4.DatePattern='.'yyyy-MM-dd

  log4j.appender.A4.layout=org.apache.log4j.PatternLayout

  log4j.appender.A4.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS}

  method:%l%n%m%n

  5 Log4j高級配置

  5.1 配置記錄日誌的包路徑

  配置Log4j.logger.com.int97=debug, 只有包爲com.int97中代碼的debug信息被輸出到指定的輸出源。

  5.2 支持日誌級別繼承功能

  如果log4j.rootLogger=debug,其他logger默認級別爲debug。可以通過配置log4j.additivity.XXX=ture/false來打開或關閉繼承功能;若爲 false,表示Logger 的 appender 不繼承它的父Logger; 若爲true,則繼承,這樣就兼有自身的設定和父Logger的設定。

  5.3 爲不同的 Appender 設置日誌輸出級別

  通常所有級別的輸出都是放在一個文件裏的,如果日誌輸出的級別是DEBUG級別,查找異常不是很方便。Log4j提供僅保存異常的日誌功能,只需要在配置中修改Appender的Threshold 就能實現,比如下面的例子:

  [配置文件]

  ### set log levels ###

  log4j.rootLogger = debug , stdout , D , E

  ### 輸出到控制檯 ###

  log4j.appender.stdout = org.apache.log4j.ConsoleAppender

  log4j.appender.stdout.Target = System.out

  log4j.appender.stdout.layout = org.apache.log4j.PatternLayout

  log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{ 1 }:%L - %m%n

  ### 輸出到日誌文件 ###

  log4j.appender.D = org.apache.log4j.DailyRollingFileAppender

  log4j.appender.D.File = logs/log.log

  log4j.appender.D.Append = true

  log4j.appender.D.Threshold = DEBUG ## 輸出DEBUG級別以上的日誌

  log4j.appender.D.layout = org.apache.log4j.PatternLayout

  log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

  ### 保存異常信息到單獨文件 ###

  log4j.appender.D = org.apache.log4j.DailyRollingFileAppender

  log4j.appender.D.File = logs/error.log ## 異常日誌文件名

  log4j.appender.D.Append = true

  log4j.appender.D.Threshold = ERROR ## 只輸出ERROR級別以上的日誌!!!

  log4j.appender.D.layout = org.apache.log4j.PatternLayout

  log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

  5.4 Xml格式配置文件實例

 

<?xml version="1.0" encoding="GB2312"?>
<!--LOG4J CONFIGURATION - XML style -->
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
      
<!-- STDOUT: Outputs log information to the standard output/console -->
       <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
              <layout class="org.apache.log4j.PatternLayout">
                     <param name="ConversionPattern" value="%d %-5p - [%C{1}] %m%n"/>
              </layout>
       </appender>
      
<appender name="myApp.file.log" class="org.apache.log4j.RollingFileAppender">
              <param name="File" value="${myApp.root}/WEB-INF/logs/myApp.log"/>
              <param name="Append" value="true"/>
              <param name="MaxBackupIndex" value="3"/>
              <param name="MaxFileSize" value="2MB" />
              <layout class="org.apache.log4j.PatternLayout">
                     <param name="ConversionPattern" value="%d [%t] %p - %m%n"/>
              </layout>
       </appender>
      
       <appender name="moduleA.log"   class="org.apache.log4j.RollingFileAppender">  
        <param name="Append" value="true"   />  
        <param name="File" value="${myApp.root}/WEB-INF/logs/moduleA.log"   />  
        <param name="MaxFileSize" value="2MB"/>  
        <param name="MaxBackupIndex" value="10"   />  
        <layout class="org.apache.log4j.PatternLayout">
                     <param name="ConversionPattern" value="%d [%t] %p - %m%n"/>
              </layout>
              <filter class="org.apache.log4j.varia.StringMatchFilter">
                     <param name="StringToMatch" value=" MODULE_A _TASK_" />
                     <param name="AcceptOnMatch" value="true" />
              </filter>
    </appender>
   
    <appender name="moduleB.log"   class="org.apache.log4j.RollingFileAppender">  
        <param name="Append" value="true"   />  
        <param name="File" value="${myApp.root}/WEB-INF/logs/moduleB.log"   />  
        <param name="MaxFileSize" value="2MB"/>  
        <param name="MaxBackupIndex" value="10"   />  
        <layout class="org.apache.log4j.PatternLayout">
                     <param name="ConversionPattern" value="%d [%t] %p - %m%n"/>
              </layout>
              <filter class="org.apache.log4j.varia.StringMatchFilter">
                     <param name="StringToMatch" value="MODULE_B_TASK_" />
                     <param name="AcceptOnMatch" value="true" />
              </filter>
    </appender>
   
    <logger name="com.levinsoft.myApp.task.FileTaskThread">
           <level value="DEBUG"/>
           <appender-ref ref="moduleA.log"/>
           <appender-ref ref="moduleB.log"/>
    </logger>
   
 
    <appender name="authorization.log.debug"   class="org.apache.log4j.RollingFileAppender">  
        <param name="Append" value="true"   />  
        <param name="File" value="${myApp.root}/WEB-INF/logs/authorization_debug.log"   />  
        <param name="MaxFileSize" value="2MB"/>  
        <param name="MaxBackupIndex" value="3"   />  
        <layout class="org.apache.log4j.PatternLayout">
                     <param name="ConversionPattern" value="%d [%t] %p - %m%n"/>
              </layout>
              <filter class="org.apache.log4j.varia.LevelRangeFilter">
                     <param name="LevelMin" value="debug" />
                     <param name="LevelMax" value="debug" />
                     <param name="AcceptOnMatch" value="true" />
              </filter>
             
    </appender>
   
    <appender name="authorization.log.error"   class="org.apache.log4j.RollingFileAppender">  
        <param name="Append" value="true"   />  
        <param name="File" value="${myApp.root}/WEB-INF/logs/authorization_error.log"   />  
        <param name="MaxFileSize" value="2MB"/>  
        <param name="MaxBackupIndex" value="3"   />  
        <layout class="org.apache.log4j.PatternLayout">
                     <param name="ConversionPattern" value="%d [%t] %p - %m%n"/>
              </layout>
      
               <filter class="org.apache.log4j.varia.LevelRangeFilter">
                     <param name="LevelMin" value="error" />
                     <param name="LevelMax" value="error" />
                     <param name="AcceptOnMatch" value="true" />
              </filter>
             
    </appender>
   
    <logger name="com.levinsoft.myApp.authorization">
           <level value="DEBUG"/>
           <appender-ref ref="authorization.log.debug"/>
           <appender-ref ref="authorization.log.error"/>
    </logger>
 
       <logger name="com.levinsoft.qframe.taglib.CollectionTag">
              <level value="WARN"/>
       </logger>
      
       <appender name="moduleC_error.log"   class="org.apache.log4j.RollingFileAppender">  
        <param name="Append" value="true"   />  
        <param name="File" value="${myApp.root}/WEB-INF/logs/moduleC_error.log"   />  
        <param name="MaxFileSize" value="2MB"/>  
        <param name="MaxBackupIndex" value="10"   />  
        <layout class="org.apache.log4j.PatternLayout">
                     <param name="ConversionPattern" value="%d [%t] %p - %m%n"/>
              </layout>
               <filter class="org.apache.log4j.varia.LevelRangeFilter">
                     <param name="LevelMin" value="error" />
                     <param name="LevelMax" value="error" />
                     <param name="AcceptOnMatch" value="true" />
              </filter>
    </appender>
 
    <logger name="com.levinsoft.myApp.search.ModuleC">
              <level value="ERROR"/>
              <appender-ref ref="moduleC_error.log"/>
       </logger>
 
       <logger name="com.levinsoft">
              <level value="DEBUG"/>
              <!-- <appender-ref ref="myApp.file.log"/> -->
       </logger>
 
       <root>
              <level value="WARN"/>
              <appender-ref ref="STDOUT"/>
              <appender-ref ref="myApp.file.log"/>
              <!-- activate to log in files -->
              <!--<appender-ref ref="DAILY"/>-->
              <!--<appender-ref ref="HTML"/>-->
       </root>
</log4j:configuration>



6 Spring對log4j的支持
Log4jConfigurer、 Log4jConfigListener、Log4jConfigServlet對dom4j進行配置或封裝。org.springframework.web.util 還包括了對其他工具類的封裝。

 

發佈了35 篇原創文章 · 獲贊 9 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章