HelloWorld 善戰(zhàn)者,求之于勢(shì),不責(zé)于人;故能擇人而任勢(shì)。

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

            BlogJava :: 首頁 ::  :: 聯(lián)系 ::  :: 管理 ::
            167 隨筆 :: 1 文章 :: 40 評(píng)論 :: 0 Trackbacks

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

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

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


          二 具體實(shí)現(xiàn)

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

                  private static Log log = LogFactory.getLog(xxxx.class);
                    為什么要使用static?因?yàn)楸苊猱a(chǎn)生多個(gè)實(shí)例
                    為什么不使用this.class?因?yàn)槭莝tatic不能用this(我經(jīng)常犯這個(gè)錯(cuò)誤。。。)
                    為什么不使new XXXX().getClass()?因?yàn)?。。。。你猜呢?br>    5.根據(jù)實(shí)際需要log.debug()、log.info()、log.warn()、log.error()、log.fatal()    就可以輸出不同等級(jí)的log


          三 log的等級(jí)

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


          四 log4j的配制

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

          }
          ========================================================================================
                運(yùn)行效果
          ========================================================================================
          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/下有l(wèi)og.xml生成,里邊的內(nèi)容為:
          ========================================================================================
          <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>
          ========================================================================================
                仔細(xì)看一下會(huì)發(fā)現(xiàn),雖然我們?cè)诖a里寫了log.debug("debug")但是debug并沒有出現(xiàn)在log中,這是因?yàn)槲覀兣渲梦募校x了log的等級(jí)為INFO,debug的等級(jí)小于info,所以不會(huì)顯示,而warn,error的大于info,所以也會(huì)被顯示出來


          2.根據(jù)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就可以了(整個(gè)log4j配制文件中只有這些就可以了 )。但是這樣會(huì)有另一個(gè)問題,如果cn.yyun.test.Main這個(gè)類中,如果有l(wèi)og操作,會(huì)報(bào)告:log4j:WARN No appenders could be found for logger (cn.yyun.test.Main).所以要加上log4j.rootCategory=INFO,F1    這樣所有的log都會(huì)被紀(jì)錄了。。但是這樣又做之后:cn.yyun.test.def里的log,會(huì)同時(shí)出現(xiàn)在def和F1中,cn.yyun.test.abc里的log,會(huì)同時(shí)出現(xiàn)在abc1,abc2和F1中。。。。。所以定義的時(shí)候一定要規(guī)劃好。
              ⑵制定package的log等級(jí)
                log4j.logger.org.hibernate=DEBUG



          </script>

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

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 伊吾县| 连平县| 綦江县| 汉源县| 新蔡县| 大荔县| 苗栗市| 贵南县| 山阴县| 襄汾县| 通州区| 扶余县| 通化市| 江源县| 吉隆县| 崇州市| 德清县| 岐山县| 连平县| 桃园县| 夏邑县| 兴隆县| 乐至县| 甘德县| 扬州市| 荣成市| 精河县| 肃宁县| 阜南县| 沈丘县| 三穗县| 时尚| 西乌珠穆沁旗| 弥渡县| 渭源县| 青龙| 鲁甸县| 皮山县| 灌阳县| 易门县| 玉山县|