log4j高階技巧--動態配置日誌輸出檔案的位置
log4j的通常用法就是通過在其配置檔案(xml或properties)中直接將輸出檔案寫死,在很多情況下,這樣做是非常簡單而又有效的。但這樣做的缺點是,如果想讓這個web應用執行起來,必須要修改log4j的配置檔案。比如struts2.x中log4j的配置,每個人都得按照自己的路徑進行配置。這無疑增加了配置的複雜性。因此,在某些情況下,我們更希望日誌檔案預設就輸出到web應用的某個目錄裡,比如如果想輸出日誌到webroot/logs/log.log中,這該如何實現呢?
在配置檔案中(我是在properties檔案中使用的,xml我未測試,理論上一樣)使用${user.dir}類似的方式,這裡變數必須是System.getPropertities裡的變數。而我們則就是要利用這一點。首先在一個Listener裡或高優先順序、自啟動的Servlet裡獲得應用的釋出目錄,這是很容易得到的,比如String home = servletContext.getRealPath("/");然後呼叫System.setPropertity("web_home",home),“web_home”名字可以隨意。則log4j.properties裡的配置為:log4j.appender.TRACE.File=${web_home}/logs/log.log.則日誌會輸出到web應用釋出目錄裡的logs目錄裡。
==============================
from : http://www.blogjava.net/hello-yun/archive/2012/07/29/384259.html
通常在專案中我們都會把log4j的配置放到classpath裡,
log4j的輸出路徑也就直接寫在log4j.xml或log4j.properties中了,
原本就這樣了不用麻煩什麼了,可是在我們公司什麼都要配置分離。
所以 log4j的輸出目錄也就不再開發人員指定了,
那麼如何做到分離呢。
有的是直接把log4j.xml或properties檔案分離,在專案啟動時載入進來,
那麼這樣一來 整個log4j的配置檔案都不由開發人員控制,
可是通常log4j的配置由運維人員配置的東東也就一個輸出目錄了,
而log4j的其它配置還是由開發人員控制,
這時可以用${},來指定
<param name="file" value="${log4j.home}/test.log" />
log4j.home由容器啟動時指定,jvm中加上 -Dlog4j.home=D:/log
這樣在Log4j.xml中的${log4j.home}就知道了實際的輸出目錄了,
同樣也可以把這個log4j.home放到分離的properties中,這時候可以
在容器啟動時在監聽器來解析properties,獲取到log4j.home變數後
把值設定到system.env中
System.setProperties("log4j.home");
這樣一來 ,log4j一樣可以找到輸出目錄