我從轉到java開發後,一直在開發application server,是以基本沒有和大型的web server打過交道,是以關于common logging在這些server上部署時遇到的問題也隻能是從理論上去解釋。感覺這篇文章介紹的不錯,是以轉載過來。
目前的很多商業和非商業的伺服器中間件都預設內建了common-log甚至是log4j.是以當我門把我們的應用釋出在上面的時候,都會遇到關于log方面的問題.
1.webshpere下面內建log4j.
"websphere的類裝入器方式有兩種方式:parent_first和parent_last。預設值是parent_first,這種方式在載入目前classpath的類之前先載入其上一級classloader能夠裝入的類。這是标準的jvm classloader的預設政策。如果采用parent_last,則過程正好相反,即先載入目前classpath的類,再載入其上一級classloader能夠裝入的類,這樣可以用目前classpath中更新的類覆寫其上一級classloader的相同類。受類裝入器方式影響的classloader包括application classloader、war classloader以及共享類庫的classloader。"
因為websphere在共享類庫的classloader中有一套common logging,但是确沒有合适配置檔案.如果我們把配置正确的log4j.properties檔案放在共享類庫下,我們會發現log4j可以運作.但還有另外一個很通用的方式--改變webshpere的類庫加載順序.我們讓他先加載我們web應用所需的類庫.即我們把web應用的加栽方式改為parent_last.
哎,盡管我小心的提防,今天還是中招了,在我的配置裡,log4j的配置檔案隻能讀取一次,不能一個應用一個配置檔案.為了讓它加載自己的配置,可以自己寫(或者用spring的)servlet/listener去手動加載這個配置檔案.
2.jboss下面的內建log4j
大家可能都曾在為jboss下面配置log4j郁悶過.jboss比webshpere走的還遠.無論你的項目是否使用了log4j,jboss在自己啟動的時候就已經運作他了.也就是說在jboss加載自己共享類庫的時候,已經讀取了自己log4j.xml檔案配置.這個檔案在conf中可以找到.如果你需要為你的應用單獨配置一個catagory,你需要直接在這裡配置.
在webloader裝載應用的時候,如果應用中有log4j的包,似乎總出現appender已被占用的問題.筆者把log4j的包連帶應用中的log4j配置檔案一并移去,世界清淨了.
關于為了讓應用自帶的log4j配置檔案生效,有人建議修改
<attribute name="java2classloadingcompliance">false</attribute>
和
<attribute name="usejbosswebloader">false</attribute>
這兩個屬性.
3.sunone下面內建log4j
距離上次用sunone伺服器已經好長時間了,似乎sunone的log有些類似jboss,也是一個伺服器的log集中管理.由于使用的不是很多,暫且在這裡站個位子.
随手貼點關于log的資訊:
<a href="http://wiki.apache.org/jakarta-commons/logging/frequentlyaskedquestions">http://wiki.apache.org/jakarta-commons/logging/frequentlyaskedquestions</a>
<a href="http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0408_baigang/part3.html">http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0408_baigang/part3.html</a>