這篇文章是基於流傳在網上較為完整的關於“log4j中配置日志文件相對路徑”問題的解決方法。該篇博文幾經轉載,流傳至今。這是此文的轉載[ http://www.linuxidc.com/Linux/2014-09/106571.htm ],為了能夠清楚本文所要解決的問題,建議閱讀此文。
該文中最後提到關於log4j配置文件初始化時產生的一些異常和警告信息。在這個疑問下和我在實際生產情況下的一些理解,認為log4j的配置日志文件相對路徑化是必須的,采用系統環境變量將依賴於系統不利於移植,使用絕對路徑顯然更不可取,故繼續探討log4j的配置文件相對路徑問題。
在初始化Web應用中的所有Filter和Servlet之前通知ServletContextListener關於上下文初始化信息。那麼可以嘗試在contextInitialized()方法中來完成log4j配置中文件的路徑設置和配置文件初始化。
1.創建的Log4jListenter:
public class Log4jListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent arg0) {
ServletContext context = arg0.getServletContext();
String prefix = context.getRealPath("/");
String file = context.getInitParameter("log4j");
String filePath = prefix + file;
Properties props = new Properties();
try {
FileInputStream istream = new FileInputStream(filePath);
props.load(istream);
istream.close();
String logFile = prefix
+ props.getProperty("log4j.appender.FILE.File");
// 設置路徑
props.setProperty("log4j.appender.FILE.File", logFile);
// 裝入log4j配置信息
PropertyConfigurator.configure(props);
} catch (IOException e) {
System.out.println("Could not read configuration file [" + filePath
+ "].");
System.out.println("Ignoring configuration file [" + filePath
+ "].");
}
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
}
}
通過獲取項目路徑,log4j配置文件相對與項目路徑二者組合獲取到配置文件的絕對路徑;讀取配置信息;然後重置“log4j.appender.File.File”的值,該值即為日志輸入的路徑,這樣就靈活多了。
這裡的“log4j.appender.File.File”具體寫法更加log4j.properties的實際配置內容而定。如下是使用的日志配置文件內容:
#日志
log4j.rootLogger=INFO, FILE
#FILE
log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.FILE.Threshold=INFO
log4j.appender.FILE.ImmediateFlush=true
log4j.appender.FILE.File=brs.log
log4j.appender.FILE.DatePattern='.'yyyy-MM-dd
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss\} %-5p] [%t] {%c:%L}-%m%n
根據1中的代碼可得出輸出的日志文件路徑是:工程目錄/brs.log
2.在web.xml進行配置
<context-param>
<param-name>log4j</param-name>
<param-value>WEB-INF/classes/log4j.properties</param-value>
</context-param>
<listener>
<listener-class>com.test.Log4jListener</listener-class>
</listener>
上面配置了log4j配置文件相對應項目路徑的路徑和ServletContextListener實現類。當然這裡的context-param是否需要設置可以根據Log4jListener類中據說使用情況而定。
3.啟動web應用將不存在“log4j中配置日志文件相對路徑”這篇文章最後提到的問題。
寫到這裡不由感歎一下,Spring的作者已經想到了,而且如果在Web應用中用到Spring的話則更加簡便。日志配置文件中關於日志文件輸出路徑這樣配置即可:
log4j.properties文件:
log4j.appender.FILE.File=${webapp.root}/WEB-INF/logs/brs.lo
web.xml文件:
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener
是的沒錯!Spring就是這樣來監聽日志配置的!
不過上面用到的“webapp.root”這個變量則是Web應用的根目錄了。至於“webapp.root”的來龍去脈可以查看源代碼:org.springframework.web.util.WebUtils類。
Log4j入門使用教程 http://www.linuxidc.com/Linux/2013-06/85223.htm
Hibernate配置Log4j顯示SQL參數 http://www.linuxidc.com/Linux/2013-03/81870.htm
Log4j學習筆記(1)_Log4j 基礎&配置項解析 http://www.linuxidc.com/Linux/2013-03/80586.htm
Log4j學習筆記(2)_Log4j配置示例&Spring集成Log4j http://www.linuxidc.com/Linux/2013-03/80587.htm