2007年6月8日 星期五

JBoss中Web應用程式利用Spring設定自行定義的Log4j

將在tomcat 上測好的程式包成war檔後deployjboss 後發現jboss 讀到log4j時會出現以下訊息

ERROR: invalid console appender config detected, console stream is looping.

或不出現錯誤訊息。而無法使用war檔中的log4j.properties




是的,jboss本身在[JBOSS_HOME]serverdefaultconflog4j.xml 就有這個設定檔作loger形式的初始化,如果再讓自己的webapp 有一個servlet去讀自己設定的lo4joutput type,無論是log4j.properties or log4j.xml都會造成 ----->ERROR: invalid console appender config detected, console stream is looping.

所以如果你要deploy自己的webappjboss上時 ,一般而言只要去以上的路徑的log4j.xml去修改你想要的輸出型式就ok了。

[JBOSS_HOME]serverdefaultconflog4j.xml 改或加自己的設定這不太make sense,最好還是要針對個別application有自己的log4j設定檔比較合理。因此,我們可以透過SpringLog4j的補強,得到較彈性的設定,並且額外的解決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>


沒有留言: