nginx 中的日誌輪換

nginx 中的日誌輪換

我發現了一個在 Nginx 中進行日誌輪換的範例這裡

但一個簡單的測試:

    set $date "2018-08-24";
    access_log /home/tim/log/access-http-$date.log default;

產生一個名為access-http-.log.我正在使用 nginx 1.13.6(帶有 openresty)。

更新

經過多次修改和調整,我想出了以下 logrotate 腳本來輪換 nginx 產生的不同日誌檔案。我已將其放入 /etc/logrotate 中。剩下的問題是日誌不會每天輪換(我目前不確定為什麼),但 alogrotate -f <filename>產生的正是我想要的結果。

一個有趣的註解是nginx -s reload可以用來取代 USR1。不幸的是,nginx 日誌頁面中沒有引用它,但我找到了它(在手冊頁 IIRC 中)。我手動建立 openresty/nginx 來合併我需要的額外模組,這樣我就不會得到打包版本中的各種額外功能,例如 pid 保留。

/path/to/log/access-http.log /path/to/log/access-https.log /path/to/log/api.log /path/to/log/error.log {
    daily
    missingok
    notifempty
    create 664 nobody tim
    dateext
    dateformat -%Y-%m-%d
    dateyesterday
    rotate 10
    su tim tim
    postrotate
        /usr/local/bin/openresty -s reload
    endscript
}

我認為這對於擁有大型 nginx 配置(同時提供網頁和 API)的人來說很有用。我將 http 分開,因為我不提供非 https 頁面,它會將腳本小子廢話排除在我的頁面日誌之外。

答案1

只需設定一個 cron 任務,持續一分鐘到午夜,以移動日誌檔案並用日期重命名它,然後向 Nginx 發送 USR1 訊號。這將觸發它重新打開日誌檔案並為第二天建立新日誌檔案。

59 23 * * * mv /var/log/nginx/access.log /var/log/nginx/$(date +%F).access.log && kill -USR1 $(cat /run/nginx.pid)

相關內容