posts - 22,comments - 35,trackbacks - 0

          Log4j日志輸出路徑只能設(shè)定成絕對路徑,這個(gè)在web項(xiàng)目中就變得很不方便了。
          比如我想要設(shè)定日志保存在webapp/log

          參考了網(wǎng)上資料:
          http://hi.baidu.com/suofang/blog/item/6cf2befbd1ff07234f4aea90.html
          下面是引入內(nèi)容:

          方法一主要是擴(kuò)展了log4j的RollingFileAppender類,其他的FileAppender同樣道理。擴(kuò)展的方法,就是用一個(gè)子類去覆蓋setFile方法,這個(gè)方法在log4j讀取配置文件生成appender的時(shí)候調(diào)用,傳入的就是配置文件中的路徑,這樣我就可以按照自己的想法在路徑前面加上根路徑了。這種方法可以在log4j.properties中用相對路徑自由配置log4j.appender.A1.File屬性來決定生成的日志相對web應(yīng)用根目錄的位置。

          方法二是利用服務(wù)器vm中已經(jīng)存在的環(huán)境變量如${catalina.home}來設(shè)置相對于${catalina.home}的日志路徑,日志只能放到服務(wù)器子目錄里,而且如果是用的其它服務(wù)器,則要改對應(yīng)的環(huán)境變量。此方法平臺(tái)移植不方便。

          方法三是擴(kuò)展ActionServlet類,覆蓋其init()方法,新方法中載入log4j.properties位置的參數(shù),可以自由配置log4j的配置文件的名字和存放位置。也可自由配置log4j日志文件的相對于當(dāng)前應(yīng)用的路徑。

          對于第三個(gè)方法,作者提出了個(gè)問題:
          log4j配置文件的位置,不讓其在web-inf/classes目錄,因?yàn)樵诩虞d此Servlet之前,服務(wù)器如tomcat啟動(dòng)時(shí)會(huì)自動(dòng)搜索web-inf目錄和web-inf/classes目錄中log4j.properties文件,如有則自動(dòng)加載。log4j屬性文件加載后,由于該屬性文件中log4j.appender.A1.File的值用的是相對路徑,自動(dòng)加載配置便會(huì)出錯(cuò):
          log4j:ERROR setFile(null,true) call failed.
          java.io.FileNotFoundException: WEB-INF\logs\bysxxglxt.log
          (系統(tǒng)找不到指定的路徑。)

          盡管后面加載擴(kuò)展的ActionServlet中正確設(shè)置了log4j屬性文件并正常加載了,但還是報(bào)的這個(gè)錯(cuò),怪不爽的。只有更改log4j屬性文件名字或者更改其存放位置,讓其不能自動(dòng)加載了,不過還是有兩個(gè)警告:
          log4j:WARN No appenders could be found for logger (org.apache.commons.digester.Digester.sax).
          log4j:WARN Please initialize the log4j system properly.

          新的發(fā)現(xiàn):
          由于spring也會(huì)加載log4j.properties,如果加載不到就往控制臺(tái)打log信息,總覺得有些礙眼,于是想辦法去掉。Spring提供了一個(gè)Log4jConfigListener,本身就能通過web.xml中配置來指定位置加載log4j配置文件和log輸出路徑,注意該listener需要放在spring的Listener之前。
          事實(shí)上,Log4jConfigListener更適合log4j在web工程中使用,原因如下:
          1. 動(dòng)態(tài)的改變記錄級(jí)別和策略,不需要重啟Web應(yīng)用,如《Effective Enterprise Java》所說。
             2. 把log文件定在 /WEB-INF/logs/ 而不需要寫絕對路徑。
          因?yàn)?系統(tǒng)把web目錄的路徑壓入一個(gè)叫webapp.root的系統(tǒng)變量。這樣寫log文件路徑時(shí)不用寫絕對路徑了.
          log4j.appender.logfile.File=${webapp.root}/WEB-INF/logs/myfuse.log
             3. 可以把log4j.properties和其他properties一起放在/WEB-INF/ ,而不是Class-Path。
             4.log4jRefreshInterval為60000表示 開一條watchdog線程每60秒掃描一下配置文件的變化;
             在web.xml 添加

          Xml代碼
          1. <context-param>  
          2.     <param-name>log4jConfigLocation</param-name>  
          3.     <param-value>WEB-INF/log4j.properties</param-value>  
          4. </context-param>  
          5.   
          6. <context-param>  
          7.     <param-name>log4jRefreshInterval</param-name>  
          8.     <param-value>60000</param-value>  
          9. </context-param>  
          10.   
          11. <listener>  
          12.     <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>  
          13. </listener>  
          posted on 2009-06-29 16:11 kelven 閱讀(2295) 評(píng)論(0)  編輯  收藏 所屬分類: javaStructsHTMLXMLjsp/servlet
          主站蜘蛛池模板: 南江县| 江孜县| 新营市| 湘潭市| 白玉县| 南皮县| 营山县| 吴旗县| 探索| 新昌县| 日土县| 城固县| 临沧市| 英超| 育儿| 外汇| 札达县| 石阡县| 石城县| 闽清县| 昔阳县| 乡城县| 含山县| 西乌珠穆沁旗| 加查县| 漳平市| 宣化县| 错那县| 温州市| 竹北市| 金门县| 措美县| 汾阳市| 当阳市| 正安县| 德惠市| 徐州市| 襄城县| 许昌县| 邵东县| 正阳县|