fbpx

Nginx Log 以日期歸檔(筆記)

linux-log

Nginx Log 自動歸檔

最近剛好查 Nginx Log 的時候,發現虛擬主機沒有以日期來區分檔名,查起來很麻煩,所以順手來改了一下。要在 Nginx 以日期命名 Log 檔案,有兩個方法,一個是透過 Nginx conf 設定檔來設定,需要自行組成需要的日期參數,設定檔如下:

if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})") {
    set $year $1;
    set $month $2;
    set $day $3;
}

access_log /var/log/your-log-pathnginx/access-$year-$month-$day.log debug;

但是上述的方法對於 Error Log 沒有作用,是什麼原因我也不知道。另一個方法就是,使用傳統的 Linux logrotate 機制。Linux 中的 logrotate 服務是專門把 log 進行歸檔的好用工具,直接在 /etc/logrotate.d/ 底下建立設定檔即可,Nginx Log Rotate 設定範例如下 (GitHub):

/var/log/your-log-path/*.log {
	daily
	dateext
	dateformat -%Y-%m-%d
	missingok
	rotate 90
	copytruncate
	compress
	delaycompress
	notifempty
	create 0640 www-data adm
	sharedscripts
	postrotate
		[ -s /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid`
	endscript
}

上述的設定會把 /var/log/your-log-path 底下所有 *.log 檔案進行處理,說明一下:

daily 表示每天一份

dateext 表示歸檔加上日期字串

dateformat 設定日期字串格式

missingok 如果 log 不存在也沒關係(有些服務如果當日沒有 Log 連檔案都不會產生)

rotate 設定保留份數

copytruncate 採用複製一份再清空原本的 Log File,滿足某些服務無法直接更名 Log File 來實現 Rotate 功能

compress 把歸檔的 Log 進行壓縮 (預設用 gz)

delaycompress 前一次的檔案才進行壓縮,這個功能很好用,主要常常會看前一天的 Log,延後一次進行壓縮比較方便

notifempty 允許空白的 Log 檔

sharedscripts 等待 log 都處理完才執行一次 Hook Script

補充一下,上述的「kill -USR1」主要是將 Log 檔案重新命名後,通知 Nginx 重新開啟 Log File,但是我實際的測試下,有時後會失效導致 Log 依然寫在已經 rotate 的檔案上,後來加了「copytruncate」就沒有問題了。怪怪的.......-_-,用 copytruncate 參數在 Rotate Log 的當下有可能會有遺失 Log 的風險,只能萬事拜託了。

要測試寫好的設定檔可以用以下命令:

sudo logrotate -vf /etc/logrotate.d/your-conf-file

筆記一下,下課哩!

  1 comment for “Nginx Log 以日期歸檔(筆記)

發佈留言