banner
niracler

niracler

长门大明神会梦到外星羊么?
github
email
steam_profiles
douban
nintendo switch
tg_channel
twitter_id

使用 logrotate 做日誌輪換以及自動歸檔

logrotate 可以對日誌文件進行輪換、壓縮並刪除舊日誌文件,在大多數的 Linux 發行版中都默認安裝了 logrotate,而且自動每天執行。

logrotate 的配置文件#

創建並編輯文件 /etc/logrotate.d/app ,一般來說,/etc/logrotate.conf 中會有 include /etc/logrotate.d 這樣的配置,這樣就會自動加載 /etc/logrotate.d 目錄下的配置文件。

/root/app/log/app.log {
    daily          # 每天輪換
    missingok      # 如果日誌文件不在也不報錯
    rotate 100     # 保留 100 個日誌文件
    compress       # 對舊的日誌文件進行壓縮
    delaycompress  # 延遲壓縮直到下一次輪換
    notifempty     # 只有在日誌文件不為空的時候才輪換
    dateext             # 使用當前日期作為日誌文件的後綴
    dateformat -%Y%m%d  # 設置日期格式
    olddir /root/app/log/old # 設置舊日誌文件的存放目錄,這個目錄必須事先創建好
    sharedscripts # 腳本將在所有日誌輪換後一次運行,而不是對每個文件都運行一次
    postrotate    # 日誌輪換後執行的腳本
        /usr/bin/docker restart app
    endscript     # 腳本結束
}

注意:重啟服務的時候,可能會導致網絡斷開,這個需要注意一下。可以使用這種方式來進行測試,測試 restart 過程中的網絡是否會斷開

for i in {1..1000}; do { curl -I https://example.com/; sleep 0.3; } ; done

測試#

此處直接使用 logrotate 命令來測試,-d 表示 debug 模式,-f 表示強制執行,-v 表示 verbose 模式,可以看到執行的過程。debug 模式下不會真正執行,只是打印出執行的過程,可以用來測試。

logrotate -dfv /etc/logrotate.d/app

取消 debug 模式後,結果如下

$ tree
.
├── app.log
└── old
    ├── app.log-20231116.gz
    └── app.log-old

1 directory, 3 files

可能還存在的問題#

  1. 權限: 我當前這邊直接用的是 root 用戶,所以沒有遇到權限問題,如果是其他用戶,可能會遇到權限問題,需要注意一下。
  2. 重啟: postrotate 中的腳本是在日誌輪換後執行的,所以如果是重啟服務,可能會導致網絡斷開,這個需要注意一下。
  3. 根據文件大小輪換: 如果是根據文件大小輪換,那麼可能會出現日誌文件被截斷的情況,這個需要注意一下。我此處沒用根據文件大小輪換,所以沒遇到這個問題。

參考資料#

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。