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

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

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

    HelloWorld 善戰者,求之于勢,不責于人;故能擇人而任勢。

    知止而后有定,定而后能靜,靜而后能安,安而后能慮,慮而后能得。物有本末,事有終始。知所先后,則近道矣。

      BlogJava :: 首頁 ::  :: 聯系 ::  :: 管理 ::
      167 隨筆 :: 1 文章 :: 40 評論 :: 0 Trackbacks

    一 最好與commons-logging一起用,why?

        1.標準接口,即使將來脫離了log4j也一樣用
        2.簡化了編碼,減少耦合度:不需在代碼中指定log4j配制文件位置,代碼中不需要引用log4j的包
        3.基本所有框架都是這么用的。。。。。。(我相信群眾)

        附加提供一下commons-logging尋找配置文件的順序(從別人那抄的)
          1) 首先在classpath下尋找自己的配置文件commons-logging.properties,如果找到,則使用其中定義的Log實現類;
          2) 如果找不到commons-logging.properties文件,則在查找是否已定義系統環境變量org.apache.commons.logging.Log,找到則使用其定義的Log實現類;
          3) 否則,查看classpath中是否有Log4j的包,如果發現,則自動使用Log4j作為日志實現類;
          4) 否則,使用JDK自身的日志實現類(JDK1.4以后才有日志實現類);
          5) 否則,使用commons-logging自己提供的一個簡單的日志實現類SimpleLog;


    二 具體實現

        1.把commons-logging的jar加到classpath中
        2.把log4j的jar加到classpath中
        3.在classpath的根目錄下,建立log4j.properties(必須是這個地方,必須叫這個名,才不用特殊配置),可以直接復制后邊的模板
        4.在需要log的類中:
            import org.apache.commons.logging.Log;
            import org.apache.commons.logging.LogFactory;

            private static Log log = LogFactory.getLog(xxxx.class);
              為什么要使用static?因為避免產生多個實例
              為什么不使用this.class?因為是static不能用this(我經常犯這個錯誤。。。)
              為什么不使new XXXX().getClass()?因為。。。。你猜呢?
        5.根據實際需要log.debug()、log.info()、log.warn()、log.error()、log.fatal()    就可以輸出不同等級的log


    三 log的等級

        1.為什么需要等級?寫代碼的時候可能需要很多調試信息,運行的時候可能需要顯示提示信息,如果在服務器上發生嚴重錯誤的時候,可能需要給管理員發郵件。這種:調試,提示,錯誤就是等級。
        2.都有什么等級? 調試(DEBUG)<信息(INFO)<警告(WARN)<錯誤(ERROR)<致命錯誤(FATAL)
        3.怎么用?         log.debug() log.info() log.warn() log.error() log.fatal()依次對應上邊的等級


    四 log4j的配制

    1.基本參數解釋:
        ⑴全局配制
          log4j.rootLogger = [ level ] , appenderName, appenderName,..........appenderName
          ★log4j.rootLogger的意思可以理解為:根log或者所有的log
          ★level就是輸出級別,只能設置一個值。
           ·關于等級,前邊已經說過了有5種,他們之間的關系可以理解為:
              調試(DEBUG):包含調試(DEBUG)、信息(INFO)、警告(WARN)、錯誤(ERROR)、致命錯誤(FATAL)
              信息(INFO):包含信息(INFO)、警告(WARN)、錯誤(ERROR)、致命錯誤(FATAL)
              警告(WARN):包含警告(WARN)、錯誤(ERROR)、致命錯誤(FATAL)
              錯誤(ERROR):包含錯誤(ERROR)、致命錯誤(FATAL)
              致命錯誤(FATAL):只有他自己
              這樣,如果log4j.rootLogger = INFO,那么 INFO,WARN,ERROR,FATAL就全部會被輸出
              如果log4j.rootLogger = ERROR,那么ERROR,FATAL就全部會被輸出
          ★appenderName就是記錄的目標,目標可以多個,中間用『,』分割,appenderName是自己定義的,換句話說,名字是隨便起的,起了名之后,就需要在下邊設定具體配制
          總結一下這部分,比如說有這么一句log4j.rootLogger = INFO , F1,F2那么就以為著要將所有INFO,WARN,ERROR,FATAL的log全部輸出到F1,F2上。F1,F2是什么?往下看。。。。
        ⑵具體配制
          log4j.appender.F1=org.apache.log4j.ConsoleAppender
          log4j.appender.F1.layout=org.apache.log4j.PatternLayout
          log4j.appender.F1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n
          ★log4j.appender.F1=org.apache.log4j.ConsoleAppender的意思就是:將F1設置為控制臺輸出
           ·還可以設置成什么?
              org.apache.log4j.ConsoleAppender(控制臺),
              org.apache.log4j.FileAppender(文件),
              org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件),
              org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件),
              org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方)
          ★log4j.appender.F1.layout=org.apache.log4j.PatternLayout的意思就是:將F1的輸出布局設置為自定義輸出布局。
           ·還可以設置成什么?
              org.apache.log4j.HTMLLayout(以HTML表格形式布局)
              org.apache.log4j.xml.XMLLayout(以XML形式布局)
              org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
              org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串),
              org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息)
          ★log4j.appender.F1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n既然上邊定義的是自定義輸出布局,那么就要定義一下具體輸出什么樣了~~上邊的%c %p %m 等以%開頭的都是模式字符串,除了模式字符串外[]-空格等這些字符會按照原樣顯示。
           ·模式字符串解釋:
              %m:消息本身
              %p:消息的級別INFO,WARN,ERROR。。。
              %r:從程序開始執行到當前日志產生時的時間間隔(微秒)
              %c:輸出當前日志動作所在的category名稱。例如:如果category名稱是"a.b.c","%c{2}"將會輸出"b.c". {2}意謂著輸出“以點分隔開的category名稱的后兩個組件”,如果 {n}沒有,將會輸出整個category名稱.
              %t:輸出當前線程的名稱
              %x:輸出和當前線程相關聯的NDC,尤其用到像java servlets這樣的多客戶多線程的應用中。
              %n:輸出平臺相關的換行符。
              %%:輸出一個"%"字符
              %d:輸出日志產生時候的日期,當然可以對日期的格式進行定制。例如:%d{HH:mm:ss,SSSS}或者是%d{dd MMM yyyy HH:mm:ss,SSSS},如果沒有指定后面的格式,將會輸出ISO8601的格式。
              %l:輸出位置信息,相當于%C.%M(%F:%L)的組合。
              %C:輸出日志消息產生時所在的類名,如果類名是“test.page.Class1”%C{1}表示輸出類名"Class1",%C{2}輸出"page.Class1",而%C則輸出"test.page.Class1"。
              %M:輸出日志消息產生時的方法名稱
              %F:輸出日志消息產生時所在的文件名稱
              %L:輸出代碼中的行號
           ·可以在%與模式字符之間加上修飾符來控制其最小寬度、最大寬度、和文本的對齊方式。如:
              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字符,就從左邊交遠銷出的字符截掉。
          總結一下,現在來我們所配制的F1的全部內容
          ·我們把它配制成了屏幕輸出
          ·輸出的布局為:自定義布局
          ·我們又定義了自定義布局的格式:日期時間(格式為:yyyy-MM-dd HH:mm:ss,SSS)[產生該日志的包名類名方法名] [等級] 信息+回車
          如果想配制F2為每天產生一個日志文件,并且保存為xml,就這么寫:
          log4j.appender.F2=org.apache.log4j.DailyRollingFileAppender
          log4j.appender.F2.layout=org.apache.log4j.xml.XMLLayout
          這樣就可以了嗎?當然不是,既然保存為文件。。至少要指定一個文件名吧
          log4j.appender.F2.File=c:/logs/log.xml
          可以了嗎?可以運行了。。。但是。。既然每天都產生一個文件,那么前一天的怎么辦呢?
          log4j.appender.F2.DatePattern=yyyyMMdd'.xml.back'
          這樣log4j會在第一次產生今天的log的同時,將昨天的log備份為 log文件名.擴展名yyyyMMdd.xml.back。對應我們這個文件,今天的log到明天有新log產生的時候,就會變為log.xml20070420.xml.back
          這樣的參數到底有多少?常用的有:
          ★ConsoleAppender選項
           ·Threshold=WARN:指定日志消息的輸出最低層次。
           ·ImmediateFlush=true:默認值是true,意謂著所有的消息都會被立即輸出。
           ·Target=System.err:默認情況下是:System.out,指定輸出控制臺
          ★FileAppender 選項
           ·Threshold=WARN:指定日志消息的輸出最低層次。
           ·ImmediateFlush=true:默認值是true,意謂著所有的消息都會被立即輸出。
           ·File=mylog.txt:指定消息輸出到mylog.txt文件。
           ·Append=false:默認值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內容。
          ★RollingFileAppender 選項
           ·Threshold=WARN:指定日志消息的輸出最低層次。
           ·ImmediateFlush=true:默認值是true,意謂著所有的消息都會被立即輸出。
           ·File=mylog.txt:指定消息輸出到mylog.txt文件。
           ·Append=false:默認值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內容。
           ·MaxFileSize=100KB: 后綴可以是KB, MB 或者是 GB. 在日志文件到達該大小時,將會自動滾動,即將原來的內容移到mylog.log.1文件。
           ·MaxBackupIndex=2:指定可以產生的滾動文件的最大數。
          ★DailyRollingFileAppender 選項
           ·Threshold=WARN:指定日志消息的輸出最低層次。
           ·ImmediateFlush=true:默認值是true,意謂著所有的消息都會被立即輸出。
           ·File=mylog.txt:指定消息輸出到mylog.txt文件。
           ·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: 每分鐘
          ★PatternLayout 選項
           ·ConversionPattern=%m%n :指定怎樣格式化指定的消息。
          ★HTMLLayout 選項
           ·LocationInfo=true:默認值是false,輸出java文件名稱和行號
           ·Title=my app file: 默認值是 Log4J Log Messages.
          ★XMLLayout 選項
           ·LocationInfo=true:默認值是false,輸出java文件和行號
          現在來看一下我們完整的第一個配制文件:
    ========================================================================================
    log4j.rootLogger = INFO,F1,F2

    log4j.appender.F1=org.apache.log4j.ConsoleAppender
    log4j.appender.Threshold=DEBUG
    log4j.appender.F1.Target=System.out
    log4j.appender.F1.layout=org.apache.log4j.PatternLayout
    log4j.appender.F1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n

    log4j.appender.F2=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.F2.File=c:/logs/log.xml
    log4j.appender.F2.DatePattern=yyyyMMdd-HH'.xml.back'
    log4j.appender.F2.layout=org.apache.log4j.xml.XMLLayout
    ========================================================================================
          編段代碼看看效果
    ========================================================================================
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    public class Main{
          private static Log log = LogFactory.getLog(Main.class);
          public static void main(String[] args) throws Exception{
              log.info("info");
              log.debug("debug");
              log.warn("warn");
              log.error("error");
          }

    }
    ========================================================================================
          運行效果
    ========================================================================================
    2007-04-20 12:36:22,531 [cn.yyun.test.Main]-[INFO] info
    2007-04-20 12:36:22,531 [cn.yyun.test.Main]-[WARN] warn
    2007-04-20 12:36:22,531 [cn.yyun.test.Main]-[ERROR] error
    ========================================================================================
          并且在c:/logs/下有log.xml生成,里邊的內容為:
    ========================================================================================
    <log4j:event logger="cn.yyun.test.Main" timestamp="1177043782531" level="INFO" thread="main">
    <log4j:message><![CDATA[info]]></log4j:message>
    </log4j:event>

    <log4j:event logger="cn.yyun.test.Main" timestamp="1177043782531" level="WARN" thread="main">
    <log4j:message><![CDATA[warn]]></log4j:message>
    </log4j:event>

    <log4j:event logger="cn.yyun.test.Main" timestamp="1177043782531" level="ERROR" thread="main">
    <log4j:message><![CDATA[error]]></log4j:message>
    </log4j:event>
    ========================================================================================
          仔細看一下會發現,雖然我們在代碼里寫了log.debug("debug")但是debug并沒有出現在log中,這是因為我們配置文件中,定義了log的等級為INFO,debug的等級小于info,所以不會顯示,而warn,error的大于info,所以也會被顯示出來


    2.根據package生成不同的log文件
        ⑴配置
          log4j.logger.cn.yyun.test.abc=INFO,abc2,abc1

          log4j.appender.abc2=org.apache.log4j.ConsoleAppender
          log4j.appender.abc2.layout=org.apache.log4j.PatternLayout
          log4j.appender.abc2.layout.ConversionPattern=abc:[%p] %m%n

          log4j.appender.abc1=org.apache.log4j.DailyRollingFileAppender
          log4j.appender.abc1.File=C:/logs/abc.log
          log4j.appender.abc1.DatePattern='.'yyyyMMdd
          log4j.appender.abc1.layout=org.apache.log4j.PatternLayout
          log4j.appender.abc1.layout.ConversionPattern=%d %r [%t] %5p - %m%n

          log4j.logger.cn.yyun.test.def=INFO,def
          log4j.appender.def=org.apache.log4j.ConsoleAppender
          log4j.appender.def.layout=org.apache.log4j.PatternLayout
          log4j.appender.def.layout.ConversionPattern=def: [%p] %m%n

          把logger.cn.yyun.test.abc換成需要的package就可以了(整個log4j配制文件中只有這些就可以了 )。但是這樣會有另一個問題,如果cn.yyun.test.Main這個類中,如果有log操作,會報告:log4j:WARN No appenders could be found for logger (cn.yyun.test.Main).所以要加上log4j.rootCategory=INFO,F1    這樣所有的log都會被紀錄了。。但是這樣又做之后:cn.yyun.test.def里的log,會同時出現在def和F1中,cn.yyun.test.abc里的log,會同時出現在abc1,abc2和F1中。。。。。所以定義的時候一定要規劃好。
        ⑵制定package的log等級
          log4j.logger.org.hibernate=DEBUG



    </script>

    posted on 2007-08-13 19:04 helloworld2008 閱讀(716) 評論(0)  編輯  收藏

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


    網站導航:
     
    主站蜘蛛池模板: 中文字幕版免费电影网站| 羞羞视频免费网站入口| 亚洲自偷自偷在线成人网站传媒 | 亚洲电影唐人社一区二区| 亚洲乱码一区av春药高潮| 亚洲狠狠婷婷综合久久蜜芽| 成人国产网站v片免费观看| 久久久久成人精品免费播放动漫| 亚洲高清视频免费| 日本免费一区尤物| 亚洲精品蜜桃久久久久久| 亚洲综合网美国十次| 日韩精品亚洲专区在线影视| 国产精品极品美女自在线观看免费 | 夜夜亚洲天天久久| 亚洲中文字幕AV每天更新| 成人a毛片免费视频观看| 永久在线免费观看| 四虎www成人影院免费观看| 久久精品国产亚洲Aⅴ香蕉| 亚洲视频一区网站| 国产精品亚洲一区二区无码| 精品免费视在线观看| 成年在线观看免费人视频草莓| 亚洲国产精品尤物yw在线| 久久亚洲AV成人无码国产| 亚洲精品色在线网站| 国产免费无码一区二区| 四虎影院在线免费播放| 久久国产精品亚洲综合| 亚洲a∨无码一区二区| 中文字幕无码免费久久| 色妞WWW精品免费视频| 伊人久久大香线蕉亚洲五月天| 亚洲人妖女同在线播放| 九九热久久免费视频| 免费黄色网址入口| 亚洲第一中文字幕| 色哟哟国产精品免费观看| 99久久99这里只有免费费精品 | 永久在线毛片免费观看|