1. 程式人生 > >java web中使用log4j路徑的事

java web中使用log4j路徑的事

第一次使用lo4j就出現一個很奇怪顯現。log可以在java project專案下記錄日誌到控制檯和檔案中,且不需要額外程式碼量。但是放在web專案中,只有控制檯有日誌,檔案都不生成的。為了解決這個問題花了我大半天時間,也嘗試了網上各種方法,被坑無數。下面就來說說辛酸史的解決方法。

</pre><p></p><p><span style="font-size: 18px;">首先在web專案中log4j不記錄檔案日誌原因是log4j.appender.log.File的屬性配置成簡單的相對路徑。e.g:</span></p><pre name="code" class="html">log4j.appender.log.File = log/log.log
這樣在web專案中容器無法獲取路徑,但是在控制檯專案中可以實現檔案記錄。這裡必須使用絕對路徑!但是,web專案部署的時候使用絕對路徑是非常麻煩的事情,雖然不是什麼問題。我相信log4j這麼好的東西不會不支援相對路徑。經過一番鬥爭跳坑後,發現log4j可以在File屬性配置時可以使用系統變數,格式:${xxx}. 經過測試有3中方式是有效解決該問題:

A .如果你用tomcat作為容器可以直接設定

log4j.appender.log.File=${catalina.home}/log/log.log
,這裡藉助tomcat容器現有的環境變數。非常簡單,但是有所侷限。

B. 該方法基於上面的log4j變數引數,但是不侷限tomcat換下,需要自己寫程式碼. 寫一個servlet來配置log4j相關資訊。主要有三步驟:

1. 還是配置下log4j.properties檔案中File屬性:

log4j.appender.log.File =${workPath}/log/log.log
. 這裡workPath隨便取名。但是要和2中設定系統變數一直。

2. servlet程式碼很簡單這裡貼寫上(絕對有效),主要是servlet的init方法。 這裡主要做了兩件事:1.設定系統變數,把log4j.properties檔案中workPath對應上;2.給log4j.properties檔案加上該專案字首,因為不加是無法獲取的。既然加了專案根目錄,那麼log4j.properties檔案放在專案哪裡度可以,可以是web-inf下,也可是src下。

 public void init() throws ServletException {
  String file =this.getInitParameter("log4j");
  if(file != null){
	  System.setProperty("workePath",this.getServletContext().getRealPath("/"));
    String realPathString= this.getServletContext().getRealPath("/");
	  PropertyConfigurator.configure(realPathString+file);
  }
 }

3. servlet在xml中配置如下

<servlet>
         <servlet-name>log4jInit</servlet-name>
         <servlet-class>com.yhx.servlet.Log4jInit</servlet-class>
         <init-param>
           <param-name>log4j</param-name>
           <param-value>WEB-INF/classes/log4j.properties</param-value>
         </init-param>
         <load-on-startup>0</load-on-startup>
</servlet>

三個步驟完成就可以咯。這個方法相對獨立,不會受到太多外在因素限制,但是要多動動手.

C. 該方法比較偷懶。由於我們專案使用spring框架,所以藉著spring方便之路。

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>120000</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

配置完成後不需要寫任何多餘程式碼就可以使用log4j.這裡沒有貼上webAppRootKey這個引數,預設是專案根目錄,也可以自定義。因為spring會在log4j檔案日誌前面加上${webapp.root}字首。這樣日誌檔案預設情況下就放在專案根目錄下。e.g:

log4j.appender.log.File = ${webapp.root}/log/Testlog.log