首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Log4j 錯誤「Failed to rename」根因分析與升級修復指南

     編輯:Java 綜合教學

Log4j 錯誤「Failed to rename」根因與修復

項目啟動日志報錯:

log4j:ERROR Failed to rename [/log/xxx.log] to [/log/xxx.log.2016-11-23.log]

經排查屬於 Log4j 1.2.x 版本已知 Bug,升級至 1.2.15+ 即可徹底解決。

Bug 根因分析

  • 觸發條件:使用 DailyRollingFileAppender(RFA)進行按日期滾動時,多線程併發重命名文件導致競態條件。
  • 官方 Bug 報告:Bug 29726、Bug 41735
  • 修復版本:
    • Log4j 1.3(已廢棄)引入 org.apache.log4j.rolling.RollingFileAppender (DRFA) 徹底重寫滾動邏輯
    • Log4j 1.2.15 回港修復至 RFA
    • 1.2.15 之後所有版本(含 1.2.17)均已包含修復

解決方案:升級 Log4j 依賴

Maven 專案

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version> <!-- 推薦 1.2.17,最後穩定版 -->
</dependency>

Gradle 專案

implementation 'log4j:log4j:1.2.17'

進階建議:遷移至 Log4j 2.x 或 SLF4J + Logback

Log4j 1.x 已於 2015 年停止維護,存在 CVE-2019-17571 等安全風險。生產環境強烈建議遷移:

方案 A:Log4j 2.x(API 兼容性較好)

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.23.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.23.1</version>
</dependency>
<!-- 若代碼大量使用 log4j 1.x API,加橋接包 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-1.2-api</artifactId>
    <version>2.23.1</version>
</dependency>

配置文件改為 log4j2.xml,支援非阻塞異步日志、自動重載、JSON/CSV 輸出等現代特性。

方案 B:SLF4J + Logback(Spring Boot 默認,社區活躍)

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.5.6</version>
</dependency>
<!-- 移除 log4j 依賴,加橋接包統一門面 -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>2.0.13</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jul-to-slf4j</artifactId>
    <version>2.0.13</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>log4j-over-slf4j</artifactId>
    <version>2.0.13</version>
</dependency>

驗證修復步驟

  1. 更新依賴並重新打包部署
  2. 觀察啟動日志無 Failed to rename 報錯
  3. 檢查日志目錄下滾動文件命名正常:xxx.log.2024-01-15.log
  4. 壓測驗證高併發寫入無文件鎖定/丟失

總結

Failed to rename 是 Log4j 1.2.14 及之前版本 DailyRollingFileAppender 併發 Bug,升級至 1.2.15+ 即可修復。長遠看,應盡快遷移至 Log4j 2.x 或 Logback,獲得安全更新、異步性能、豐富輸出格式等現代日志能力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved