我要啦免费统计

          微藍領域

          我的學習檔案館
          posts - 19, comments - 57, trackbacks - 0, articles - 57
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Log4j學習筆記

          Posted on 2007-08-17 14:54 hilor 閱讀(446) 評論(0)  編輯  收藏 所屬分類: eclipse

          在網上學習了一下Log4j,以下是一些簡單的學習筆記

          Apache的開源項目Log4j是一個功能強大的日志組件,提供快速有效的日志記錄,開發者通過簡單的學習,即可為自己的程序中加入非常實用的日志功能。
          在apache網站:http://jakarta.apache.org/log4j 可以免費下載到Log4j最新版本的軟件包,解壓,將其中打包好的的log4j-1.x.x.jar文件復制到classpath相關目錄下 。

          一、快速體驗
          ok,現在就可以來體驗一下Log4j的功能,按以下步驟在程序中快速加入了日志功能。
          參看下面這個簡單的例子一:
          第一步: 用import導入Log4j需要使用的相關的類
          第二步: 定義獲取一個日志記錄器Logger的對象
          第三步: 裝入Log4j的配置文件,或者使用缺省環境的配置
          第四步:現在可以在你的程序中想輸出日志的地方,使用Logger類提供的以下方法,插入不同優先級的日志了。
           debug(Object message ) ;
           info(Object message ) ;
           warn(Object message ) ;
           error(Object message ) ;

          大功告成!是不是非常簡單呢?完全可以取代以前常用來調試程序的System.out.println("xxxxxxxxxxxx")這樣的語句,而且log4j可以通過自定義配置文件來靈活地對日志輸出的級別進行控制。
          #########################################
          例子一:
          package com.study;

          /**導入Log4j需要使用的相關的類*/
          import org.apache.log4j.Logger;
          import org.apache.log4j.BasicConfigurator;

          /**
           * <p>Title: Log4j例子</p>
           * <p>Description: 快速在程序中使用Log4j</p>
           * <p>Copyright: Copyright (c) 2004</p>
           * @author Robin
           * @version 1.0
           */
          public class HelloLog4j {

            //定義日志記錄器logger,所有的日志由它來負責記錄,
            static Logger logger=Logger.getLogger(HelloLog4j.class.getClass());

            public static void main(String[] args) {
              //使用缺省環境來配置Log4j
              BasicConfigurator.configure();
           //使用配置文件來配置Log4j
           //PropertyConfigurator.configure ( "D:\\testLog4j.properties" ) ;

              //插入日志信息
              logger.info("HelloLog4j開始執行");
              try {
                HelloLog4j helloLog4j1 = new HelloLog4j();
                int count=helloLog4j1.count(1,-32);
                logger.debug("count的值為:"+count);
              }
              catch (Exception e) {
                logger.error("error"+e.getMessage());
              }
              logger.info("HelloLog4j執行完成");   
            }
            /**
             * 求兩整數數之和
             * */
            public int count(int a,int b) {
              int add=a+b;
              if (add<0){
                logger.warn("兩數之和小于零");
              }
              return add;
            }
          }
          #########################################
          二、配置Log4j
          我們可以通過自定義定義配置文件來對日志的輸出進行動態的控制。
          Log4j支持兩種配置文件格式,一種是XML格式的文件,一種是Java特性文件(鍵=值)。
          可以用以下方式來載入配置文件:
           1、載入使用Java 鍵—值對的屬性文件編寫的配置文件。
           PropertyConfigurator.configure ( String configFilename)
           2、載入XML形式的配置文件
           DOMConfigurator.configure ( String filename )。

          看一個簡單的java屬性配置文件testLog4j.properties:
          #########################################
          #指定根Logger,及日志輸出級別,大于等于該級別的日志將被輸出( DEBUG < INFO < WARN < ERROR < FATAL ) 設為OFF可以關閉日志
          log4j.rootLogger=DEBUG, A1,A2
          #指定log輸出目的,這里設為輸出日志到指定目錄的文件my.log中
          log4j.appender.A1=org.apache.log4j.FileAppender
          log4j.appender.A1.File=d:\\study\\my.log
          #指定日志信息的格式
          log4j.appender.A1.layout=org.apache.log4j.PatternLayout
          log4j.appender.A1.layout.ConversionPattern=%r %d{yyyy-MM-dd HH:mm:ss} %c %p -%m%n

          #把A2輸出到控制臺
          log4j.appender.A2=org.apache.log4j.ConsoleAppender
          log4j.appender.A2.layout=org.apache.log4j.SimpleLayout

          #還可以單獨指定輸出某個包的日志級別
          #log4j.logger.com.study.HelloLog4j=INFO

          #########################################

          1、配置根Logger,其語法為:
          log4j.rootLogger = [ level ] , appenderName, appenderName2
          level:日志的級別,指定這條日志信息的重要性。分為ALL < DEBUG < INFO < WARN <ERROR < FATAL < OFF
          一般常用的為 DEBUG , INFO ,WARN ,ERROR四種,分別對應Logger類的四種方法
           debug(Object message ) ;
           info(Object message ) ;
           warn(Object message ) ;
           error(Object message ) ;
          如果設置級別為INFO,則優先級大于等于INFO級別(如:INFO、WARN、ERROR)的日志信息將可以被輸出,小于該級別的如:DEBUG將不會被輸出
          appenderName :就是指定日志信息輸出目的地,比如(打印到控制臺,輸出到文件等)。同一條日志信息可以配置多個輸出目的地。

          2、配置log輸出目的地
           Log4j提供以下幾種:
           org.apache.log4j.ConsoleAppender(控制臺)
           org.apache.log4j.FileAppender(文件)
           org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件)
           org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件)
           org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方)
          3、log信息的格式
           org.apache.log4j.HTMLLayout(HTML表格形式)
           org.apache.log4j.SimpleLayout(簡單格式的日志,只包括日志信息的級別和指定的信息字符串 ,如:DEBUG - Hello)
           org.apache.log4j.TTCCLayout(日志的格式包括日志產生的時間、線程、類別等等信息)
           org.apache.log4j.PatternLayout(靈活地自定義日志格式)

          當使用org.apache.log4j.PatternLayout來自定義信息格式時,可以使用
          log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p -%m%n 來格式化信息
          %c    輸出所屬類的全名,可寫為 %c{Num} ,Num類名輸出的范圍  如:"com.sun.aaa.classB", %C{2}將使日志輸出輸出范圍為:aaa.classB
          %d    輸出日志時間其格式為 可指定格式 如 %d{HH:mm:ss}等
          %l    輸出日志事件發生位置,包括類目名、發生線程,在代碼中的行數
          %n    換行符
          %m    輸出代碼指定信息,如info(“message”),輸出message
          %p    輸出日志的優先級,即 FATAL ,ERROR 等
          %r    輸出從啟動到顯示該條日志信息所耗費的時間(毫秒數)
          %t    輸出產生該日志事件的線程名
          更詳細參數信息可參看類org.apache.log4j.PatternLayout的API doc文檔

          關于性能:
          加入日志總是會帶來一些性能損耗,當然絕大多數情況下可以忽略不計。
          1、當某個級別的日志被屏蔽輸出時,比如,配置級別為INFO,那么程序中DEBUG級別的日志語句將被禁止輸出
          如:
           logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
          以上語句中,雖然debug語句里的消息不會輸出到日志里,但消息中字符串構造的操作依然會執行,當操作比較復雜時,有時會帶來一些性能損耗,可以改成一下寫法:
           if(logger.isDebugEnabled() {
                  logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
              }
          則一旦DEBUG級別被禁止輸出,則不會執行日志信息后面的字符串操作。
          2、由于日志記錄器Logger,支持命名的層次,所以在子層次向上查找繼承自父層次的日志級別時,也可能會有一些性能損耗。

          總之,Log4j的設計目標已經充份考慮到了速度優先。經過多次的改寫,性能問題已經幾乎基本完全不是問題,它是一個非常優秀的工具組件,使用它帶來的好處,大大多于失去的那一點點性能損耗。完全可以大膽使用。


          ============================================
          commons-logging和log4j結合:http://dev.csdn.net/develop/article/29/29531.shtm

          我在web-inf/classses目錄下建了commons-logging.properties和log4j.properties,我建了兩個appender,
          commons-logging.properties內容:
          org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
          log4j.properties內容:
          log4j.rootLogger=debug, dest1,dest2

          log4j.appender.dest1=org.apache.log4j.ConsoleAppender
          log4j.appender.dest1.layout=org.apache.log4j.PatternLayout
          log4j.appender.dest1.layout.ConversionPattern=%d %-5p %-5c{3} %x -> %m%n


          log4j.appender.dest2=org.apache.log4j.RollingFileAppender
          log4j.appender.dest2.File=c://bridge.log

          log4j.appender.dest2.MaxFileSize=100KB
          # Keep one backup file
          log4j.appender.dest2.MaxBackupIndex=3

          log4j.appender.dest2.layout=org.apache.log4j.PatternLayout
          log4j.appender.dest2.layout.ConversionPattern=%d [%t] %-5p %-5c{3}(%L) %x -> %m%n

          主站蜘蛛池模板: 白河县| 庆云县| 大同市| 宝鸡市| 鄂托克前旗| 黄陵县| 遵义县| 邻水| 竹溪县| 渑池县| 定远县| 凌海市| 屏东市| 景洪市| 高平市| 南木林县| 年辖:市辖区| 桃源县| 永年县| 黎川县| 无极县| 伊川县| 杭锦后旗| 贵定县| 扎赉特旗| 长兴县| 岑溪市| 侯马市| 泰州市| 英德市| 曲靖市| 萨迦县| 沾益县| 始兴县| 札达县| 嘉黎县| 建宁县| 溧阳市| 临漳县| 南木林县| 贞丰县|