客戶使用 Tivoli 監控 WebLogic server.log,每當 Server 重啟或日誌輪轉,Tivoli 報錯 FileId is changed,導致監控中斷。
原始碼 weblogic.logging.FileStreamHandler.rotateLog() 呼叫:
logFile.renameTo(rotatedFile); // 僅重命名檔案
// java.io.File
public boolean renameTo(File dest) {
return fs.rename(this, dest); // 委派給 FileSystem 抽象類
}
// Win32FileSystem.java
private native boolean rename0(File f1, File f2); // 本地方法
關鍵發現:renameTo 為原子操作,**inode 不變**(同一文件系統內重命名僅修改目錄項)。
// 測試程式
File src = new File("test");
src.createNewFile();
src.renameTo(new File("test1"));
src = new File("test"); // 重新建立同名檔案
src.createNewFile();
執行結果 (ls -il):
6033514 -rw-r--r-- 1 fjin staff 0 Sep 26 23:56 test ← 原檔案 inode 6033506 -rw-r--r-- 1 fjin staff 0 Sep 27 01:03 test ← 新檔案 inode(不同!) 6033514 -rw-r--r-- 1 fjin staff 0 Sep 26 23:56 test1 ← 重命名後檔案(保留原 inode)
結論:
renameTo 保留 inode(test1 繼承 test 的 inode)server.log 時,**產生新 inode**| 方案 | 可行性 | 優缺點 |
|---|---|---|
| 修改 WebLogic 使用 copy+truncate | 低 | 需修改原始碼/字節碼,升級維護困難 |
| Tivoli 配置追蹤檔名而非 inode | 高 | 監控端調整,無侵入性,推薦 |
| 使用 logrotate + copytruncate | 中 | OS 層面處理,需停用 WebLogic 內建輪轉 |
| Symlink 指向最新日誌 | 中 | Tivoli 監控 symlink,inode 固定 |
RollingFileAppender 由框架管理輪轉