jboss日誌輸出詳解

如果不進行優化配置,JBOSS下的項目查錯將非常麻煩,在JBOSS4.2.2GA版本中,默認將所有的DEBUG信息都輸了個遍,剛運行JBOSS,Server.log的日誌就差不多1M了,再停掉JBOSS,什麼正事都沒做,都己經生成看不到的LOG了,只能用一個字來形容:費物!

  不過話先別說得這麼激,年輕人,應該控制好自己的心態,衝動是魔獸咧!LOG太多確實一點用也沒有,本來這些LOG最大的功能是方便查錯的,但如果生成N行的LOG,從中找到你想要的,我還不如把程序檢查一遍算了!因此,在不同的應用場合下,配置好你的LOG,才能讓項目更加順利地進行哦!
  好了,轉入正題,本文針對的是JBOSS4的LOG4J配置,其它的請參閱相應的文章。
  JBOSS4的LOG4J配置默認放在Deploy目錄的conf/目錄下,比如現在我將ear放到jboss的default目錄下,那麼log4j的文件就是jboss/server/default/conf/jboss-log4j.xml,找到它,我們再分析一下它裏面的內容吧。
  首先是第一段,一個FILE的appender,代碼如下
Xml代碼 複製代碼

<!-- A time/date based rolling appender -->  
   <appender name="FILE" class="org.jboss.logging.appender.DailyRollingFileAppender">  
      <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>  
      <param name="File" value="${jboss.server.log.dir}/server.log"/>  
      <param name="Append" value="false"/>  

      <!-- Rollover at midnight each day -->  
      <param name="DatePattern" value="'.'yyyy-MM-dd"/>  

      <!-- Rollover at the top of each hour   
      <param name="DatePattern" value="'.'yyyy-MM-dd-HH"/>  
      -->  

      <layout class="org.apache.log4j.PatternLayout">  
         <!-- The default pattern: Date Priority [Category] Message/n -->  
         <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>  

         <!-- The full pattern: Date MS Priority [Category] (Thread:NDC) Message/n   
         <param name="ConversionPattern" value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>  
          -->  
      </layout>  
   </appender>  
[xml] view plain copy
<!-- A time/date based rolling appender -->  
   <appender name="FILE" class="org.jboss.logging.appender.DailyRollingFileAppender">  
      <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>  
      <param name="File" value="${jboss.server.log.dir}/server.log"/>  
      <param name="Append" value="false"/>  

      <!-- Rollover at midnight each day -->  
      <param name="DatePattern" value="'.'yyyy-MM-dd"/>  

      <!-- Rollover at the top of each hour  
      <param name="DatePattern" value="'.'yyyy-MM-dd-HH"/>  
      -->  

      <layout class="org.apache.log4j.PatternLayout">  
         <!-- The default pattern: Date Priority [Category] Message/n -->  
         <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>  

         <!-- The full pattern: Date MS Priority [Category] (Thread:NDC) Message/n  
         <param name="ConversionPattern" value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>  
          -->  
      </layout>  
   </appender>  

上面這一段就是JBOSS默認輸出到log/server.log文件的基本配置,它的name是FILE,這是自己定的,在其它地方會用這引name引用到它,然後appender的類型是DailyRollingFileAppender,意思是每天生成一個新的server.log文件,此時有人就會問,怎麼每天都是server.log,那麼昨天的豈不覆蓋掉了?別擔心,這種事情開發者早就想到了,它裏面會有一些參數去設置它,自動讓你前一天的log改其它名,當然appender的類型還有好幾種,本文最後面有參考,根據你的項目的需要去設置它。
  中間第一個參數是log文件的輸出地址,大家明白的了,改動一下就行了。
  第二個參數,意思是運行jboss時,要不要覆蓋之前的log,這在開發調試時很有用,你設成false後,每次你重新運行jboss,新生成的log都覆蓋了舊的,這樣找起來比較方便,也不用自己專門去刪除它,但如果是正式使用了,可以根據需要將成設成true,這樣所有的日誌都會被保存起來了,隔一段時間,你就可以找到之前任一時候的log信息哦。
  上面講到了有一些參數設置文件換前一天的log的文件名的,大家可以注意到配置的中間有個DatePattern,這個就是設置你前一天的log將會被改成什麼名,它在每天晚上的午夜進行,很自動吧,你看它後面的’.’yyyy-MM-dd,你就會知道前一天的log的文件名將會被換成什麼樣的了!這裏不進行填鴨!它還可以表現得更狠一下,每小時生成一個log怎麼樣,你想怎麼樣就怎麼樣,學學去配它吧。
  再往下,有一個PatternLayout,這個是輸出文本的樣式,這個是文本的,不過它還有得換哦,可以換成網頁形式的日誌(看起來會爽點),還有另外幾個,大家有空可以玩玩,不過這個PatternLayout是最常用,也是最專業的,想成爲專業人士,就用它吧!呵呵,開玩笑的,其它幾個也很專業,甚至更專業!
  剛接觸log4j的人會不太理解PatternLayout的作用,不過你用過之後,就知它是多麼強悍的了,日誌顯示的形式隨你心意改變,可以輸出很多信息,如類名,類行號,詳細時間,日誌正文,還有日誌級別等,如果你自己開發一個log工具,你會做到這麼強嗎?我以前做過一個,只能硬編碼,其它什麼都不能幹,用了它,準會把你氣死一半。我就氣了三分之一,因爲我寫的嘛,呵呵,親生的,不能什麼都怪它,那怪誰。。。
  再往下有個ConversionPattern的參數,它是配置log的顯示格式的,它的詳細格式使用在本文後面會貼出,有需要就去看看,不過用它默認的都挺好的了。
  好了,之前介紹了一個默認的FILE Appender,還有一個CONSOLE的Appender,不用介紹了吧,就是顯示在jboss控制檯的日誌樣式,在此我們就不詳談了。
  徐了這兩個默認的,還可以自定義Appender哦,比如你項目有不同類型的日誌輸出到不同的log日誌中,或者你不想改動默認的log配置,另找高明,反正就是很個性化啦,生成多少個不同的log都行!
  在這裏我拷貝了一個FILE的的appender,然後作了小小改動,就可以生成我自定義的log了,代碼如下
Xml代碼 複製代碼

<!-- A time/date based rolling appender -->  
<appender name="MYAPPENDER" class="org.jboss.logging.appender.DailyRollingFileAppender">  
   <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>  
   <param name="File" value="${jboss.server.log.dir}/mylog.log"/>  
   <param name="Append" value="false"/>  

   <!-- Rollover at midnight each day -->  
   <param name="DatePattern" value="'.'yyyy-MM-dd"/>  

   <!-- Rollover at the top of each hour   
   <param name="DatePattern" value="'.'yyyy-MM-dd-HH"/>  
   -->  

   <layout class="org.apache.log4j.PatternLayout">  
      <!-- The default pattern: Date Priority [Category] Message/n -->  
      <!--<param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>-->  

      <!-- The full pattern: Date MS Priority [Category] (Thread:NDC) Message/n-->  
      <param name="ConversionPattern" value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>  

   </layout>  
</appender>  
[xml] view plain copy
<!-- A time/date based rolling appender -->  
<appender name="MYAPPENDER" class="org.jboss.logging.appender.DailyRollingFileAppender">  
   <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>  
   <param name="File" value="${jboss.server.log.dir}/mylog.log"/>  
   <param name="Append" value="false"/>  

   <!-- Rollover at midnight each day -->  
   <param name="DatePattern" value="'.'yyyy-MM-dd"/>  

   <!-- Rollover at the top of each hour  
   <param name="DatePattern" value="'.'yyyy-MM-dd-HH"/>  
   -->  

   <layout class="org.apache.log4j.PatternLayout">  
      <!-- The default pattern: Date Priority [Category] Message/n -->  
      <!--<param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>-->  

      <!-- The full pattern: Date MS Priority [Category] (Thread:NDC) Message/n-->  
      <param name="ConversionPattern" value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>  

   </layout>  
</appender>  

  它將會在log目錄生成一個mylog.log文件,不過有一點需要注意,在沒有其它代碼引用這些appender之前,它什麼也不會幹的,怎麼引用還得往下看。
在jboss-log4j.xml文件裏靠下的地方,有很多下面這類代碼
Xml代碼 複製代碼

<!-- Limit the org.jboss category to INFO as its DEBUG is verbose -->  
<category name="org.jboss">  
   <priority value="INFO" />  
</category>  
[xml] view plain copy
<!-- Limit the org.jboss category to INFO as its DEBUG is verbose -->  
<category name="org.jboss">  
   <priority value="INFO" />  
</category>  

它是幹嘛用的?它就是log4j的強悍之一,它檢測到是org.jboss輸出的信息的話,就限制DEBUG的信息輸出,之前說過jboss的log信息超多,因爲它默認將所有Debug信息都輸出來了,這些jboss的debug信息對於我們這些平民百姓來說,沒啥用,你加上我上面這一段,所有的JBOSS DEBUG信息都不會輸出來的了,試試吧,其它的category你怎麼改?講一個我的經驗給你們吧,你運行過jboss,然後停掉它,打開server.log,會看到很多的log信息,像下面這種
2008-10-18 16:00:59,203 DEBUG[org.apache.resource.deployment.RARDeployment] Required license terms exist, view META-INF/ra.xml in …/deploy/jboss-ha-local-jdbc.rar
看上面粗體部份,它是由類org.apache.resource.deployment.RARDeployment產生的log,你如果看到很多,你覺得沒用,又或者你看到是DEBUG信息,你也不想要,就寫一段category吧,將類的前面部分截取一段,寫進category的name屬性裏,比如上面這類log,你不想看到它,你就這樣寫

Xml代碼 複製代碼

<category name="org.apache">  
   <priority value="INFO" />  
</category>  
[xml] view plain copy
<!-- Limit the org.apache category to INFO as its DEBUG is verbose -->  
<category name="org.apache">  
   <priority value="INFO" />  
</category>  

這樣所有org.apache屬下的類的debug log都不會再輸出來了,你還可以更狠一點,寫下面這段
Xml代碼 複製代碼

<category name="org.apache">  
      <priority value="ERROR" />  
</category>  
[xml] view plain copy
<category name="org.apache">  
      <priority value="ERROR" />  
</category>  

這樣org.apache下的普通INFO信息也不會輸出了,只有錯誤的信息纔會被輸出!
  至於其它的log信息,你就運行多幾次jboss,每次根據server.log,找到你不想要的,再加多一些category,這樣你的server.log就會變得非常精簡的了,試試吧,一勞永逸,以後log就有得控制了,調試查錯也更方便了。
  到了這裏,事情還沒完呢,最後一點了。
  之前我們自定義了一個appender,我們要用它來輸出自己的項目的log,我們只是定義好了這個appender,還沒用上它,它暫時還是不會起作用的(它會生成文件,但是沒log往裏面寫),項目的log,還是只會在server.log裏出現,不會寫進你自定義的log裏。下面我們幹最後一點,完成所有工作。
  寫多一個category,name填上自己項目對應的,比如com.mycompany,然後在後面加多一行,如下

Xml代碼 複製代碼

<!-- Self Define Appender -->  
   <category name="com.mycompany">  
      <priority value="INFO" />  
      <appender-ref ref="MYAPPENDER"/>  
   </category>  
[xml] view plain copy
<!-- Self Define Appender -->  
   <category name="com.mycompany">  
      <priority value="INFO" />  
      <appender-ref ref="MYAPPENDER"/>  
   </category>  

配置好了,下面貼一段代碼中使用log的代碼中,怎麼用不講了,很簡單的,
Java代碼 複製代碼

public class TestLog4j   
{   
    public static void main(String[] args)    
    {   
        Logger logger = Logger.getLogger(TestLog4j. class);   
        logger.debug( " debug " );   
        logger.error( " error " );   
        logger.info("info");   
    }    
}   
[java] view plain copy
public class TestLog4j  
{  
    public static void main(String[] args)   
    {  
        Logger logger = Logger.getLogger(TestLog4j. class);  
        logger.debug( " debug " );  
        logger.error( " error " );  
        logger.info("info");  
    }   
}   

下面,貼出一些常用的配置參考文檔

1\日誌輸出級別,共有5級:

FATAL 0
ERROR 3
WARN 4
INFO 6
DEBUG 7

2\Log4j提供的appender有以下幾種:

org.apache.log4j.ConsoleAppender(控制檯),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌文件),
org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件),
org.apache.log4j.WriterAppender(將日誌信息以流格式發送到任意指定的地方)

3\Log4j提供的layout有以下幾種:
org.apache.log4j.HTMLLayout(以HTML表格形式佈局),
org.apache.log4j.PatternLayout(可以靈活地指定佈局模式),
org.apache.log4j.SimpleLayout(包含日誌信息的級別和信息字符串),
org.apache.log4j.TTCCLayout(包含日誌產生的時間、線程、類別等等信息)

4\Log4J採用類似C語言中的printf函數的打印格式格式化日誌信息,如下:
%m 輸出代碼中指定的消息
%p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL
%r 輸出自應用啓動到輸出該log信息耗費的毫秒數
%c 輸出所屬的類目,通常就是所在類的全名
%t 輸出產生該日誌事件的線程名
%n 輸出一個回車換行符,Windows平臺爲“/r/n”,Unix平臺爲“/n”
%d 輸出日誌時間點的日期或時間,默認格式爲ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS},輸出類似:2002年10月18日 22 : 10 : 28 , 921
%l 輸出日誌事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。舉例:Testlog4.main(TestLog4.Java: 10 )

轉自:http://blog.csdn.net/sdd00001/article/details/18319647

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章