Log4j 是日誌框架,Web 容器(Tomcat/Jetty)負責管理 Servlet 生命周期。兩者不自動關聯,必須在 Web 應用啟動時主動初始化 Log4j 配置。
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/classes/log4j.properties</param-value>
</context-param>
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>60000</param-value> <!-- 60秒自動刷新 -->
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
Spring 的 Log4jConfigListener 會在上下文初始化時讀取配置文件並調用 PropertyConfigurator.configure()。
只需在 src/main/resources 下放入 logback-spring.xml(Spring Boot 2.x 默認用 Logback,兼容 Log4j2 配置),零代碼集成。
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
String path = sce.getServletContext().getRealPath("/WEB-INF/classes/log4j.properties");
PropertyConfigurator.configure(path);
}
}
並在 web.xml 註冊該 Listener。
| 現象 | 原因 | 解決 |
|---|---|---|
| 控制台無輸出 | 配置文件路徑錯誤或未被讀取 | 檢查 getRealPath 路徑,確保文件在 WAR 包內 |
| 日誌文件不生成 | FileAppender 路徑無寫權限 | 使用相對路徑 ${catalina.base}/logs/app.log 或絕對路徑並授權 |
| 雙重輸出/亂碼 | 多個 Appender 重複、編碼不一致 | 統一設置 encoding=UTF-8,去重配置 |
Log4j 1.x 已停止維護(EOL),建議遷移至 Log4j 2.x 或 Logback:
Log4j 與 Web 項目無隱式綁定,必須顯式配置監聽器或代碼初始化。現代項目優先選 Spring Boot + Logback,避免手動配置錯誤。