1.Jboss的日志系統(standalone模式) 在介紹案例分析之前先來介紹一下Jboss提供的日志系統,下載EAP的zip包解壓后的結構如下:
在standalone目錄下有兩個文件standalone.xml和logging.properties,eap啟動時會讀取並解析standalone.xml文件。
在standalone.xml這份配置文件中有關於日志子系統的相關配置,基本結構如下所示: <subsystem xmlns="urn:jboss:domain:logging:1.3"> <console-handler name="CONSOLE"> <level name="DEBUG"/> <formatter> <pattern-formatter pattern="%K{level}%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/> </formatter> </console-handler> <periodic-rotating-file-handler name="FILE" autoflush="true"> <formatter> <pattern-formatter pattern="%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/> </formatter> <file relative-to="jboss.server.log.dir" path="server.log"/> <suffix value=".yyyy-MM-dd"/> <append value="true"/> </periodic-rotating-file-handler> <logger category="com.arjuna"> <level name="WARN"/> </logger> <logger category="org.apache.tomcat.util.modeler"> <level name="WARN"/> </logger> <logger category="org.jboss.as.config"> <level name="DEBUG"/> </logger> <logger category="sun.rmi"> <level name="WARN"/> </logger> <logger category="jacorb"> <level name="WARN"/> </logger> <logger category="jacorb.config"> <level name="ERROR"/> </logger> <root-logger> <level name="DEBUG"/> <handlers> <handler name="CONSOLE"/> <handler name="FILE"/> </handlers> </root-logger> </subsystem> 在eap解析到這個subsystem之前,jboss會使用logging.properties中的配置進行日志輸出,一旦eap解析完成這個subsystem就會由其來接管日志輸出這項工作,另外如果subsystem中的內容被修改,則其修改會被反應到logging.properties中,因而修改日志配置,最好是修改subsystem中的內容而不是logging.properties。 logging subsystem中的日志配置有多種模式,下面給出三種: console-handler 控制台顯示 periodic-rotating-file-handler 定期新建一個log文件 size-rotating-file-handler 滿足指定大小就重新新建一個log文件
2. 案例分析 在實際部署運行的系統經常是跑在物理機的一個虛擬機中,而且應用服務器(例如Jboss)通常不會只有一個war包而是會有多個,如果使用subsystem的日志輸出方式,日志輸出會雜在一起,對排查問題沒有多大幫助,反而會讓人找不到方向,最好是能夠讓war包自己管理自己的日志輸出(當然是在單機模式下,如果是集群的話還是交給Jboss吧),這樣不僅便於我們修改日志配置(總是感覺修改jboss的subsystem不是那么方便),還能得到特定應用的全部日志輸出。 經過一番搜索找到了一個解決方案,通過一個啟動參數關閉Jboss對日志的托管 <span style="white-space:pre"> </span>-Dorg.jboss.as.logging.per-deployment=false 將其加入jre的啟動參數中,eap啟動時會檢測這個參數,如果其值為false則關閉對應用日志的接管,這樣應用就可以控制自己的日志輸出了。有兩種方式來使用這個參數,一個是利用eap的啟動過程(就是其啟動腳本)中加載的配置,在其中加入對這個參數的使用,另一個是寫一個腳本控制jre與eap的啟動。 (1)利用eap的啟動配置
在standalone.conf中添加下面這一行 <span style="white-space:pre"> </span>JAVA_OPTS="$JAVA_OPTS -Dorg.jboss.as.logging.per-deployment=false"
(2)jre啟動腳本 在linux系統中使用shell腳本控制jre以及eap的啟動是很方便的,寫一個這樣的腳本在jre的啟動命令中添加上述參數就可以實現將應用自己控制log的輸出,腳本樣本如下: kill -9 `ps aux | grep -v 'awk' |awk '/jboss-eap-6.2/{print $2}'`echo 'kill jboss service'rm -rf ./*.logrm -rf ./nohup.outecho 'clean log files'rm -rf /usr/jboss/jboss-eap-6.2/standalone/tmp/vfs/rm -rf /usr/jboss/jboss-eap-6.2/standalone/tmp/work/echo 'clean tmp workspace'/bin/cp -f ./example.war /usr/jboss/jboss-eap-6.2/standalone/deployments/echo 'copy ams.war to workspace'sleep 1snohup /usr/jboss/jboss-eap-6.2/bin/standalone.sh -Dorg.jboss.as.logging.per-deployment=false -b 192.168.2.160 &echo 'start nohup job'sleep 1stail -f ./nohup.out使用腳本啟動時,需要注意如果當前系統中已經運行了一個Jboss服務了則需要先清除(關閉或者殺掉進程)之前的服務,然后如果有必要可以清除之前應用生成的log文件,如果不希望之前應用的緩存對新的應用造成影響,可以把Jboss的緩存清空,之后就可以將war包拷貝到Jboss的deployments目錄下,拷貝完成后進行jre及eap的啟動,使用nohup命令進行任務托管,並附上控制log托管的參數配置,腳本執行到這里,如果想要觀察啟動的過程可以使用tail命令監控nohup的輸出,腳本運行過程基本就是這個流程,當然也可以添加其它的條件判斷比如war包是否存在等。 --------------------- 作者:北海飛舞 來源:CSDN 原文:https://blog.csdn.net/liupin_2011/article/details/42388907?utm_source=copy 版權聲明:本文為博主原創文章,轉載請附上博文鏈接!