[踩坑篇]logrotate切割日誌後,日誌還是寫在老日誌文件中

背景


   公司的生產環境中,使用gunicorn部署後端後端django服務,每天會產生很多前端掉調用後端api的日誌文件,爲了方便管理這些文件,使用了Linux自帶的日誌切割工具logrotate,每天對log目錄下的日誌文件進行切割備份,使用起來十分方便。

    但是在使用兩天後發現了一個問題:雖然日誌文件每天凌晨三點會進行切割,並將老的日誌文件以時間戳爲結尾進行備份,但是程序依然會將日誌信息寫入老文件中,新的日誌文件一直爲空。配置及測試結果如下:

切割結果:

由上圖可見,日誌切割認爲已經完成了,但是日誌文件依舊會寫進老文件中。

原因


    在網上查閱資料後發現了問題原因所在:雖然日誌文件已經切割,老文件已經備份,但是rsyslog並不知道新文件的存在,在存儲日誌時依舊會打開舊日誌文件。這是因爲logrotate在切割備份時只是修改了文件名稱,inode號並沒有修改,rsyslog依舊會根據舊inode號打開日誌文件。

 解決方案


針對此問題,有兩種解決方案供大家選擇:

1、在配置/etc/logrotate.d/目錄下的配置文件中添加參數copytrancate

原理:可以理解爲把內容拷貝走作爲備份,然後清空當前文件。

不足:拷貝和截斷之間有時間差,如果在切割時期日誌寫入量比較大的話會造成大量日誌丟失,個人覺得不適用於生產環境。

2、給rsyslog發信號。重新打開log文件,配置文件如下:

在每次進行日誌切割後,給rsyslog進程發送信號,讀取新的日誌文件。

配置後使用logrotate -f /etc/logrotate.d/xxx進行測試,日誌切割正常,信息也正常寫入日誌文件中!!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章