
我發現了一個在 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)