1. 程式人生 > >Jboss日誌詳解與優化例項

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,程式碼如下

<!-- 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了,程式碼如下

<!-- 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檔案裡靠下的地方,有很多下面這類程式碼

<!-- 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,你不想看到它,你就這樣寫

<!-- Limit the org.apache category to INFO as its DEBUG is verbose -->
   <category name="org.apache">
      <priority value="INFO" />
   </category>

我們的專案中,經常會列印很多資訊,如

2015-01-07 14:59:16,268 DEBUG [org.jboss.logging.Log4jService] Installed System.out adapter

2015-01-07 14:59:16,904 DEBUG [com.arjuna.ats.tsmx.logging.tsmxLogger] Registering mbean for module 'jta'

我們怎麼優化這種語句,不要將這類debug打印出來?

/jboss-log4j.xml中增加如下程式碼:

<category name="org.jboss">《!--可在原檔案中找到,取消註解即可--》
      <priority value="INFO"/>
   </category>
  
   <category name="com.arjuna">
      <priority value="INFO"/>
   </category>

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

<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,然後在後面加多一行,如下

<!-- Self Define Appender -->
   <category name="com.mycompany">
      <priority value="INFO" />
      <appender-ref ref="MYAPPENDER"/>
   </category>

配置好了,下面貼一段程式碼中使用log的程式碼中,怎麼用不講了,很簡單的,

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 )