Systemd

Logrotate 不寫入新的 .log 文件

  • July 12, 2021

我有 4 個自定義 systemd 服務寫入自定義日誌/var/log/。我設置了一個logrotate配置文件,但它沒有寫入最新的日誌。它仍在寫入舊.log.1文件。新的已創建,只是沒有數據。

這是我的 logrotate 配置:

/var/log/dealer*.log {
       daily
       missingok
       rotate 7
       delaycompress
       notifempty
       su root root
       postrotate
       /bin/systemctl reload dealer*.service > /dev/null 2>/dev/null || true
       endscript
       create 0644 root root

}

最新的日誌文件是空的:

-rw-r--r--  1 root      root               0 Jul 12 11:39 dealerF2f.log
-rw-r--r--  1 root      root               0 Jul 12 11:39 dealerOutbound.log
-rw-r--r--  1 root      root               0 Jul 12 11:39 dealerTimeout.log
-rw-r--r--  1 root      root               0 Jul 12 11:39 dealerWeb.log

它仍在寫信給.log.1

-rw-r--r--  1 root      root             36M Jul 12 12:52 dealerOutbound.log.1
-rw-r--r--  1 root      root            9.2M Jul 12 12:52 dealerF2f.log.1
-rw-r--r--  1 root      root             19M Jul 12 12:52 dealerWeb.log.1
-rw-r--r--  1 root      root            171M Jul 12 12:52 dealerTimeout.log.1

通常,當程序仍然打開文件時,我會看到類似的內容-它將繼續寫入舊文件,直到程序重新啟動。

我敢打賭,如果您重新啟動而不是重新載入,它將按預期工作。

如果您無法完全重新啟動該過程,請查看 copytruncate 選項而不是 postrotate 腳本。

copytruncate 創建副本後將原始日誌文件截斷為零大小,而不是移動舊日誌文件並選擇性地創建新日誌文件。當某些程序無法被告知關閉其日誌文件並因此可能永遠繼續寫入(附加)到前一個日誌文件時,可以使用它。請注意,複製文件和截斷文件之間的時間片非常短,因此可能會失去一些日誌數據。使用此選項時,create 選項將不起作用,因為舊日誌文件保留在原處。

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