JBoss中Web應用程式利用Spring設定自行定義的Log4j
將在tomcat 上測好的程式包成war檔後deploy到jboss 後發現jboss 讀到log4j時會出現以下訊息
ERROR: invalid console appender config detected, console stream is looping.
或不出現錯誤訊息。而無法使用war檔中的log4j.properties
是的,jboss本身在[JBOSS_HOME]serverdefaultconflog4j.xml 就有這個設定檔作loger形式的初始化,如果再讓自己的webapp 有一個servlet去讀自己設定的lo4j的output type,無論是log4j.properties or log4j.xml都會造成 ----->ERROR: invalid console appender config detected, console stream is looping.
所以如果你要deploy自己的webapp到jboss上時 ,一般而言只要去以上的路徑的log4j.xml去修改你想要的輸出型式就ok了。
去[JBOSS_HOME]serverdefaultconflog4j.xml 改或加自己的設定這不太make sense,最好還是要針對個別application有自己的log4j設定檔比較合理。因此,我們可以透過Spring對Log4j的補強,得到較彈性的設定,並且額外的解決log4j設定無法在JBoss使用的問題。
Spring最擅長的,就是在別家的蛋糕上再加些cream,讓你J2EE without Spring的時候心癢癢。
log4j,可以有如下的cream:
1. 動態的改變記錄級別和策略,不需要重啓Web應用,如《Effective Enterprise Java》所說。
2. 把log文件定在 /WEB-INF/logs/ 而不需要寫絕對路徑。
3. 可以把log4j.properties和其他properties一起放在/WEB-INF/ ,而不是Class-Path。
在web.xml 添加
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>WEB-INF/log4j.properties</param-value>
</context-param>
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>60000</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
在上文的配置裏,
Log4jConfigListener會去WEB-INF/log4j.propeties 讀取配置文件;開一條watchdog線程每60秒掃描一下配置文件的變化;並把web目錄的路徑壓入一個叫webapp.root的系統變數。
然後,在log4j.properties 裏就可以這樣定義logfile位置
log4j.appender.logfile.File=${webapp.root}/WEB-INF/logs/myfuse.log
如果有多個web應用,怕webapp.root變數重復,可以在context-param裏定義webAppRootKey。
但透過Spring的設定會導致JBoss出現如下另外的錯誤訊息:
15:03:32,531 INFO [STDOUT] log4j:ERROR A "org.jboss.logging.util.OnlyOnceErrorHandler" object is no
15:03:32,546 INFO [STDOUT] log4j:ERROR The class "org.apache.log4j.spi.ErrorHandler" was loaded by
15:03:32,546 INFO [STDOUT] log4j:ERROR [WebappClassLoader
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader:
java.net.FactoryURLClassLoader@1f808e6
] whereas object of type
關於這個問題只需進行以下修正即可。
1.開啟JBoss相關設定檔%jboss_home%/server/default/deploy/jbossweb-tomcat55.sar/META-INF/jboss-service.xml
2.修改指定屬性即可
<attribute name="Java2ClassLoadingCompliance">true</attribute>
<attribute name="UseJBossWebLoader">true</attribute>
沒有留言:
張貼留言