項目啟動日志報錯:
log4j:ERROR Failed to rename [/log/xxx.log] to [/log/xxx.log.2016-11-23.log]
經排查屬於 Log4j 1.2.x 版本已知 Bug,升級至 1.2.15+ 即可徹底解決。
DailyRollingFileAppender(RFA)進行按日期滾動時,多線程併發重命名文件導致競態條件。org.apache.log4j.rolling.RollingFileAppender (DRFA) 徹底重寫滾動邏輯<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version> <!-- 推薦 1.2.17,最後穩定版 -->
</dependency>
implementation 'log4j:log4j:1.2.17'
Log4j 1.x 已於 2015 年停止維護,存在 CVE-2019-17571 等安全風險。生產環境強烈建議遷移:
<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 輸出等現代特性。
<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>
Failed to rename 報錯xxx.log.2024-01-15.logFailed to rename 是 Log4j 1.2.14 及之前版本 DailyRollingFileAppender 併發 Bug,升級至 1.2.15+ 即可修復。長遠看,應盡快遷移至 Log4j 2.x 或 Logback,獲得安全更新、異步性能、豐富輸出格式等現代日志能力。