Logging

如何在打開/實時文件上手動旋轉日誌而不使用 logrotate?

  • March 16, 2015

我的 Google-Fu 讓我如此接近,但還不夠,而且我想我在 Linux 中太陌生了,無法將這些部分組合在一起。

我有一個非常大的 >200GB 日誌文件,仍在寫入。在磁碟空間成為問題之前,Logrotate 不會及時處理。另外,我不想啟動另一輪logrotate,因為我不希望它影響其配置中的所有其他目標。我在我的logrotate.conf文件中添加了新的節:

/log/myDevice/myDevice.log {
 compress
 daily
 rotate 360
 maxage 360
 missingok
 compresscmd /usr/bin/xz
 dateext
 compressext .xz
 copytruncate
 olddir /log/archive/myDevice
}

我想手動做這些事情:

  1. copytruncate :獲取目前日誌文件,但允許 syslog-ng 繼續在目前打開/實時文件上執行
  2. (不在 logrotate.conf 上面) split:將目前日誌滾動分解成更小的塊
  3. xz: 壓縮到存檔文件夾

我可以split(1)而且xz(1)很好,但是當我試圖抓住目標文件時,沒有骰子。

我試過sudo mv myDevice.log ZmyDevice.log && touch myDevice.log了,但是 syslog-ng 只是隨著原始文件(及其新名稱)移動,並愉快地保持寫入。自從我想到 syslog-ng 是如何引用該文件的時候,這產生了一些影響。

因此,我試圖弄清楚如何編寫某種手冊copytruncate,以便將文件“原樣”切割成另一個文件,並讓 syslog-ng 繼續處理它想要的內容。

移動文件,然後向 syslog-ng 程序發送 SIGHUP:

殺死-HUP

這將導致它重新打開所有打開的文件,從而釋放您剛剛移動/重命名的文件並允許您繼續。然後它將重新打開 /log/myDevice/myDevice.log 並開始寫入。

查找哪些程序打開了文件:fuser /path/to/file. 然後用於kill -SIGSTOP掛起正在寫入文件的程序。然後旋轉文件,複製它,截斷它,無論您需要做什麼,然後使用kill -SIGCONT.

引用自:https://serverfault.com/questions/655266