<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    相信自己!

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      26 隨筆 :: 3 文章 :: 13 評論 :: 0 Trackbacks

    1. Log4j 的優點


    Log4j
    Apache的一個開放源代碼項目,通過使用Log4j,我們可以控制日志信息輸送的;我們也可以控制每一條日志的輸出格式;通過定義每一條日志信息的級別,我們能夠更加細致地控制日志的生成過程。最令人感興趣的就是,這些可以通過一個配置文件來靈活地進行配置,而不需要修改應用的代碼。
    log4j
    的好處在于:
    1)
    通過修改配置文件,就可以決定log信息的目的地——控制臺、文件、GUI組件、甚至是套接口服務器、NT的事件記錄器、UNIX Syslog守護進程等
    2)
    通過修改配置文件,可以定義每一條日志信息的級別,從而控制是否輸出。在系統開發階段可以打印詳細的log信息以跟蹤系統運行情況,而在系統穩定后可以關閉log輸出,從而在能跟蹤系統運行情況的同時,又減少了垃圾代碼(System.out.println(......))
    3)
    使用log4j,需要整個系統有一個統一的log機制,有利于系統的規劃。

    2. 配置文件


    Log4j
    由三個重要的組件構成:日志信息的優先級,日志信息的輸出目的地,日志信息的輸出格式。日志信息的優先級從高到低有FATALERRORWARNINFODEBUG,分別用來指定這條日志信息的重要程度;日志信息的輸出目的地指定了日志將打印到控制臺還是文件中;而輸出格式則控制了日志信息的顯示內容。

    2.1. 日志信息的優先級

    分為OFFFATALERRORWARNINFODEBUGALL或者您定義的級別。
    Log4j
    建議只使用四個級別,優先級從高到低分別是ERRORWARNINFODEBUG。通過在這里定義的級別,您可以控制到應用程序中相應級別的日志信息的開關。 假如在一個級別為qLogger中發生一個級別為p的日志請求,如果p>=q,那么請求將被啟用。這是Log4j的核心原則。 比如在這里定義了INFO級別,則應用程序中所有DEBUG級別的日志信息將不被打印出來;

    2.2. 輸出源的使用

    有選擇的能用或者禁用日志請求僅僅是Log4j的一部分功能。Log4j允許日志請求被輸出到多個輸出源。用Log4j的話說,一個輸出源被稱做一個Appender
    Appender
    包括console(控制臺), files(文件), GUI components(圖形的組件), remote socket serverssocket 服務), JMSjava信息服務), NT Event LoggersNT的事件日志), and remote UNIX Syslog daemons(遠程UNIX的后臺日志服務)。它也可以做到異步記錄。 一個logger可以設置超過一個的appender addAppender 方法添加一個appender到一個給定的logger。對于一個給定的logger它每個生效的日志請求都被轉發到該logger所有的appender上和該logger的父輩loggerappender上。

    2.2.1. ConsoleAppender

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

    2.2.2. FileAppender

    使用FileAppender,那么log信息將寫到指定的文件中。這應該是比較經常使用到的情況。 相應地,在配置文件中應該指定log輸出的文件名。如下配置指定了log文件名為dglog.txt
    log4j.appender.A2.File=dglog.txt
    注意將A2替換為具體配置中Appender的別名。

    2.2.3. DailyRollingAppender

    使用FileAppender可以將log信息輸出到文件中,但是如果文件太大了讀起來就不方便了。這時就可以使用DailyRollingAppenderDailyRollingAppender可以把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

    2.2.4. org.apache.log4j.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文件,依次輪轉。

    2.2.5. org.apache.log4j.WriterAppender

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

    2.3. Layout的配置


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

    2.3.1. 布局樣式


    org.apache.log4j.HTMLLayout
    (以HTML表格形式布局),
    org.apache.log4j.PatternLayout
    (可以靈活地指定布局模式),
    org.apache.log4j.SimpleLayout
    (包含日志信息的級別和信息字符串),
    org.apache.log4j.TTCCLayout
    (包含日志產生的時間、線程、類別等等信息)

    2.3.2. 格式


    %m
    輸出代碼中指定的消息
    %p
    輸出優先級,即DEBUGINFOWARNERRORFATAL
    %r
    輸出自應用啟動到輸出該log信息耗費的毫秒數
    %c
    輸出所屬的類目,通常就是所在類的全名
    %t
    輸出產生該日志事件的線程名
    %n
    輸出一個回車換行符,Windows平臺為"rn"Unix平臺為"n"
    %d
    輸出日志時間點的日期或時間,默認格式為ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 221028921
    %l
    輸出日志事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。舉例:Testlog4.main(Test Log4.java:10)

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

    2.4. 配置文件的例子:


    log4j.rootLogger=DEBUG
    #
    DAOlog記錄到DAOLog,allLog
    log4j.logger.DAO=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

    3. API使用


    log4j
    使用步驟有3個:

    3.1. 初始化

    3.1.1. Tomcat下的初始化

    默認的Log4j initialization典型的應用是在web-server 環境下。在tomcat3.xtomcat4.x下,你應該將配置文件Log4j.properties放在你的web應用程序的WEB-INF/classes 目錄下。
    Log4j
    將發現屬性文件,并且以此初始化。這是使它工作的最容易的方法。 你也可以選擇在運行tomcat前設置系統屬性Log4j.configuration 。對于tomcat 3.xTOMCAT_OPTS 系統變量是用來設置命令行的選項。對于tomcat4.0,用系統環境變量CATALINA_OPTS 代替了TOMCAT_OPTS
    UNIX
    命令行
    export TOMCAT_OPTS="-DLog4j.configuration=foobar.txt"
    告訴Log4j用文件foobar.txt作為默認的配置文件。這個文件應該放在WEB-INF/classes 目錄下。這個文件將被PropertyConfigurator所讀。每個web-application將用不同的默認配置文件,因為每個文件是和它的web-application 相關的。
    1. export TOMCAT_OPTS="-DLog4j.debug -DLog4j.configuration=foobar.xml" export TOMCAT_OPTS="-DLog4j.debug -DLog4j.configuration=foobar.xml"
    告訴Log4j輸出Log4j-internal的調試信息,并且用foobar.xml作為默認的配置文件。這個文件應該放在你的web-applicationWEB-INF/classes 目錄下。因為有.xml的擴展名,它將被DOMConfigurator所讀。每個web-application將用不同的默認配置文件。因為每個文件都和它所在的web-application 相關的。
    2. set TOMCAT_OPTS=-DLog4j.configuration=foobar.lcf
    -DLog4j.configuratorClass=com.foo.BarConfigurator
    告訴Log4j用文件foobar.lcf作為默認的配置文件。這個文件應該放在你的web-applicationWEB-INF/classes 目錄下。因為定義了Log4j.configuratorClass 系統屬性,文件將用自定義的com.foo.barconfigurator類來解析。每個web-application將用不同的默認配置文件。因為每個文件都和它所在的web-application 相關的。
    3. set TOMCAT_OPTS=-DLog4j.configuration=file:/c:/foobar.lcf set TOMCAT_OPTS=-DLog4j.configuration=file:/c:/foobar.lcf
    告訴Log4j用文件foobar.lcf作為默認的配置文件。這個配置文件用URL file:/c:/foobar.lcf定義了全路徑名。這樣同樣的配置文件將被所有的web-application所用。 不同的web-application將通過它們自己的類裝載器來裝載Log4j。這樣,每個Log4j的環境將獨立的運作,而沒有任何的相互同步。例如:在多個web-application中定義了完全相同的輸出源的FileAppenders將嘗試寫同樣的文件。結果好象是缺乏安全性的。你必須確保每個不同的web-applicationLog4j配置沒有用到同樣的系統資源。

    3.1.2. Servlet 的初始化

    用一個特別的servlet來做Log4j的初始化也是可以的。如下是一個例子:
    public class Log4jInit extends HttpServlet {
    public void init() {
    String prefix = getServletContext().getRealPath("/");
    String file = getInitParameter("Log4j-init-file");
    if(file != null) {
    PropertyConfigurator.configure(prefix+file);
    }
    }
    public void doGet(HttpServletRequest req, HttpServletResponse res) {
    }
    }
    web.xml中定義隨后的servlet為你的web-application
    <servlet>
    <servlet-name>Log4j-init</servlet-name>
    <servlet-class>xx.xx.Log4jInit</servlet-class>
    <init-param>
    <param-name>Log4j-init-file</param-name>
    <param-value>WEB-INF/classes/Log4j.properties</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    </servlet>
    寫一個初始化的servlet是最有彈性的初始化Log4j的方法。代碼中沒有任何限制,你可以在servletinit方法中定義它。

    3.2. 根據配置文件初始化log4j


    log4j
    可以使用3中配置器來初始化:BasicConfigurator,DOMConfigurator,PropertyConfigurator 其語法為:
    BasicConfigurator.configure ()
    : 自動快速地使用缺省Log4j環境。
    PropertyConfigurator.configure ( String configFilename)
    :讀取使用Java的特性文件編寫的配置文件。
    DOMConfigurator.configure ( String filename )
    :讀取XML形式的配置文件。 這里用的是PropertyConfigurator。使用PropertyConfigurator適用于所有的系統。如下的語句:
    PropertyConfigurator.configure("log4j.properties");
    就以log4j.properties為配置文件初始化好了log4j環境。 注意一點:這個語句只需要在系統啟動的時候執行一次。例如,在ActionServletinit()方法中調用一次。
    public class ActionServlet extends HttpServlet{
    ...
    /**
    * Initialize global variables
    */
    public void init() throws ServletException {
    //
    初始化Action資源
    try{
    initLog4j();
    ...
    }catch(IOException e){
    throw new ServletException("Load ActionRes is Error");
    }
    }
    ...
    protected void initLog4j(){
    PropertyConfigurator.configure("log4j.properties");
    }
    ...
    }//end class ActionServlet

    3.3. 在需要使用log4j的地方獲取Logger實例

    使用Log4j,首先就是獲取日志記錄器,這個記錄器將負責控制日志信息。其語法為:
    public static Logger getLogger( String name)
    通過指定的名字獲得記錄器,如果必要的話,則為這個名字創建一個新的記錄器。Name一般取本類的名字,比如:
    static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () ) ;
    Log4j
    使得通過軟件組件命名logger很容易。我們可以通過Logger的靜態的初始化方法在每一個類里定義一個logger,令logger的名字等于類名的全局名,而實現logger的命名。這是一個實效的簡單的定義一個logger的方法。因為日志輸出帶有產生日志的類的名字,這個命名策略使得我們更容易定位到一個日志信息的來源。雖然普通,但卻是命名logger的常用策略之一。
    Log4j
    沒有限制定義logger的可能。開發員可以自由的按照它們的意愿定義logger的名稱。 然而,以類的所在位置來命名Logger好象是目前已知的最好方法。

    3.4. 使用Logger對象的debug,info,fatal...方法


    log.debug("it is the debug info");

    4. 優化

    一個經常引用的依靠于logging的參數是可以計算的花費。這是一個合理的概念,一個適度的應用程序可能產生成千上萬個日志請求。許多努力花在測量和調試logging的優化上。Log4j要求快速和彈性:速度最重要,彈性是其次。

    4.1. 日志為禁用時,日志的優化。

    當日志被徹底的關閉,一個日志請求的花費等于一個方法的調用加上整數的比較時間。在233mhzPentium II 機器上這個花費通常在5-50納秒之間。 然而,方法調用包括參數構建的隱藏花費。 例如,對于logger catlogger.debug("Entry number: " + i + " is " + String.valueOf(entry[i])); 引起了構建信息參數的花費,例如,轉化整數ientry[i]到一個string,并且連接中間字符串,不管信息是否被輸出。這個參數的構建花費可能是很高,它主要決定于被調用的參數的大小。 避免參數構建的花費應如下,


    if(logger.isDebugEnabled())
    {
    logger.debug("result is" + result );
    }

    如果loggerdebug被關閉這將不會招致參數構建的花費。另一方面,如果loggerdebug的話,它將產生兩次判斷 logger是否能用的花費。一次是在debugenabled,一次是debug。這是無關緊要的,因為判斷日志的能用 只占日志實際花費時間的約1% Log4j里,日志請求在Logger 類的實例里。Logger 是一個類,而不是一個接口。這大量的減少了在方法調用上的彈性化的花費。 當然用戶采用預處理或編譯時間技術去編譯出所有的日志聲明。這將導致完美的執行成效。然而因為二進制應用程序不包括任何的日志聲明的結果,日志不可能對那個二進制程序開啟。以我的觀點,以這種較大的代價來換取較小的性能優化是不值得的。

    4.2. 當日志狀態為啟用時,日志的優化。

    這是本質上的優化logger的層次。當日志狀態為開,Log4j依然需要比較請求的級別與logger的級別。然而, logger可能沒有被安排一個級別;它們將從它們的father繼承。這樣,在繼承之前,logger可能需要搜索它的ancestor 這里有一個認真的努力使層次的搜索盡可能的快。例如,子logger僅僅連接到它的存在的father logger 在先前展示的BasicConfigurator 例子中,名為com.foo.bar logger是連接到跟根logger,因此繞過了不存在的logger comcom.foo。這將顯著的改善執行的速度,特別是解析logger的層結構時。 典型的層次結構的解析的花費是logger徹底關閉時的三倍。

    4.3. 日志信息的輸出時,日志的優化。

    這是主要花費在日志輸出的格式化和發送它到它的輸出源上。這里我們再一次的付出努力以使格式化執行的盡可能快。同appender一樣。實際上典型的花費大約是100-300毫秒。 詳情看org.apache.log4.performance.Logging 雖然Log4j有許多特點,但是它的第一個設計目標還是速度。一些Log4j的組件已經被重寫過很多次以改善性能。不過,投稿者經常提出了新的優化。你應該滿意的知道,以SimpleLayout的配置執行測試已經展示了Log4j的輸出同System.out.println一樣快。

    posted on 2007-10-20 15:38 北極雪 閱讀(3517) 評論(0)  編輯  收藏 所屬分類: Log4J

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲日韩一中文字暮| 国产精品无码一区二区三区免费| 亚洲 无码 在线 专区| avtt天堂网手机版亚洲| 日韩免费在线视频| 最近2019中文免费字幕| 久久亚洲AV午夜福利精品一区| 免费一区二区无码视频在线播放 | 亚洲人成电影院在线观看| 国产精品亚洲а∨无码播放| 色网站在线免费观看| 鲁啊鲁在线视频免费播放| 大地资源中文在线观看免费版| 国产亚洲精品免费| 亚洲H在线播放在线观看H| 久久久久国产免费| 久久国产免费一区二区三区 | 国产性生交xxxxx免费| 亚洲综合色一区二区三区| 91免费人成网站在线观看18| 精品亚洲综合在线第一区| 日韩大片在线永久免费观看网站| 永久久久免费浮力影院| 久久国产免费福利永久| 久久久久久亚洲AV无码专区| 亚洲午夜精品一区二区公牛电影院 | 啦啦啦完整版免费视频在线观看| 亚洲日韩VA无码中文字幕| 国产人成网在线播放VA免费| 精品国产亚洲男女在线线电影| 中文字幕亚洲第一| 人妻在线日韩免费视频| 亚洲国产精品久久66| 久久精品成人免费观看97| 中国亚洲女人69内射少妇| 免费人成毛片动漫在线播放 | 亚洲夜夜欢A∨一区二区三区 | 亚洲视频中文字幕| 亚洲午夜免费视频| 国产亚洲sss在线播放| 91免费人成网站在线观看18|