Jboss日誌詳解與優化例項
不過話先別說得這麼激,年輕人,應該控制好自己的心態,衝動是魔獸咧!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 )