1. 程式人生 > >在Spring的項目中配置Log4j存放日誌文件到指定目錄下

在Spring的項目中配置Log4j存放日誌文件到指定目錄下

先生 tom tle -i cat path let junit測試 屬性

在Spring中使用LOG4J為日誌輸出的插件已有一段日子了,但有時候發現日誌文件雖然是已經在根據自己的理想存放了,但還會有些莫名其妙的項目日誌文件出現tomcat內(因為項目的日誌文件都以項目命名嘛,所以比較容易區分這些log)。這些令我糾結的日誌文件,讓我在改善一下LOG4J的配置。才發現,之前用的配置方式真是弱爆了。

1.先說自己比較理想的存放日誌路徑。

我比較喜歡把日誌文件放在項目的WEB-INF下,然後當然有個文件夾叫logs。logs相信很多人都會存在在這樣的目錄下,但放在WEB-INF目錄下相信還是有些人不理解。其實當然是為了資源保護了。

2.舊的方式

編寫Servlet在項目部署的時候重置log4j配置文件中的日誌文件存放路徑。

web.xml配置如下:

Xml代碼 技術分享
  1. <servlet>
  2. <servlet-name>log4j-init</servlet-name>
  3. <servlet-class>com.foo.log.Log4jInit</servlet-class>
  4. <init-param>
  5. <param-name>log4j_properties_path</param-name>
  6. <param-value>WEB-INF/classes/log4j.properties</param-value>
  7. </init-param>
  8. <load-on-startup>1</load-on-startup>
  9. </servlet>

Log4Init的代碼就不貼了,網上也比較多。主要作用就是修改原有的log4j.appender的File配置修改為現在項目部署的絕對路徑,方法多樣,功能都一樣!

問題產生了:

這種方式在Spring環境中還是會生成一些多余日誌文件。因為在項目部署時,spring初始化比配置的Servlet啟動的還早,所以原有的默認日誌存放路徑就先生效了(雖然沒什麽內容,也不對項目有什麽影響)。

3.有沒有更好的配置方式呢?

使用Spring提供的日誌配置方法

web.xml添加如下代碼:

Xml代碼 技術分享
  1. <context-param>
  2. <param-name>webAppRootKey</param-name>
  3. <param-value>project</param-value>
  4. </context-param>
  5. <context-param>
  6. <param-name>log4jConfigLocation</param-name>
  7. <param-value>WEB-INF/classes/log4j.properties</param-value>
  8. </context-param>
  9. <listener>
  10. <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
  11. </listener>

webAppRootKey: 配置項目的別名,上面配置別名為project。若你部署的項目不在tomcat中的話這個可以忽略,因為tomcat沒為每個應用配置不同的webappRoot屬性,所以如果出現兩個或以上相同的應用屬性名的話就會報錯了。

然後修改log4j.properties的配置,把日誌文件輸出的路徑配置修改為:

log4j.appender.A1.File=${project}WEB-INF/logs/Project.log

A1是我的appender命名。 ${project}是使用上述web.xml中的應用別名從而獲取應用的絕對路徑。

註:若不需要配置應用別名的話,即沒配置webAppRootKey。可以直接這麽寫:

log4j.appender.A1.File=${webapp.root}WEB-INF/logs/Project.log

webapp.root為默認屬性。若有配置webAppRootKey的話就被覆蓋。

題外:

1.還有一種方式是使用環境變量,例如${catalina.home}。不過這樣同樣也會產生多余的log的,道理跟用Servlet一樣。

當然,如果你不像我這麽糾結這些多余的log的話。活得也比較輕松。。。

2.而在不同的操作系統中的路徑分割符是不同的,linux是 "/" ,而windows是 "\",但目前的寫法在兩個環境中同樣用tomcat測試是沒問題的。雖然在windows的時候,初始化的日誌看到的路徑有點別扭。不過仿佛記得在一些應用服務器中會產生不兼容....

3.推薦默認情況下配置文件log4j.appender.A1.File=poject.log,而項目發布前,用ANT等腳本把路徑修改為log4j.appender.A1.File=${project}WEB-INF/logs/Project.log 這樣做的好處是,在用junit測試時,生成的日誌文件就在項目的根路徑中,容易處理或忽略。

在Spring的項目中配置Log4j存放日誌文件到指定目錄下