您的位置:首页 > 其它

Jboss-eap-6日志输出与案例分析

2015-01-04 11:46 253 查看
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 ./*.log
rm -rf ./nohup.out
echo '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 1s
nohup /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 1s
tail -f ./nohup.out
使用脚本启动时,需要注意如果当前系统中已经运行了一个Jboss服务了则需要先清除(关闭或者杀掉进程)之前的服务,然后如果有必要可以清除之前应用生成的log文件,如果不希望之前应用的缓存对新的应用造成影响,可以把Jboss的缓存清空,之后就可以将war包拷贝到Jboss的deployments目录下,拷贝完成后进行jre及eap的启动,使用nohup命令进行任务托管,并附上控制log托管的参数配置,脚本执行到这里,如果想要观察启动的过程可以使用tail命令监控nohup的输出,脚本运行过程基本就是这个流程,当然也可以添加其它的条件判断比如war包是否存在等。

参考链接:

http://rainbow702.iteye.com/blog/2142666
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jboss logging 脚本