一、定時任務切分
所謂的定時任務切分,是指通過定時任務(比如crontab
),發送信號給nginx,讓其重新打開文件。該方法也是nginx官網上面比較推薦的,原文說明比較清楚,這裏在說明下:
發送USR1
信號會讓nginx主動重新打開日誌文件,故操作如下:
$ mv access.log access.log.0 $ kill -USR1 `cat master.nginx.pid` $ sleep 1 $ gzip access.log.0 # do something with access.log.0
總結 :優點是思路較爲簡單,但效果明顯,而且對error_log 同樣適用;缺點是有外部依賴(比如 crontab)
二、自切分
自切分是指讓nginx自身實現日誌切分功能,不依賴crontab等東西。 其主要原理是依賴access_log的強大功能---- 可以用變量定義請求的log路徑。
nginx的acess_log 功能非常強大,其完整指令說明如下,這裏主要說明定義日誌路徑的功能;關於syslog還有gzip, buffer等特性,後續再說明。
access_log指令:
Syntax: access_log path [format [buffer=size [flush=time]] [if=condition]]; access_log path format gzip[=level] [buffer=size] [flush=time] [if=condition]; access_log syslog:server=address[,parameter=value] [format [if=condition]]; access_log off; Default: access_log logs/access.log combined; Context: http, server, location, if in location, limit_except
注意path部分是支持nignx變量的,這也就意味這我們只要通過配置正確的nginx變量,就可以實現小時等級別的日誌自動拆分了。
一個簡單的問題就出現了,假設nginx要實現這個機制,那豈不是每打印一個請求log就得打開文件,寫日誌,關閉文件? 這樣顯然效率太差了,爲了解決這個問題,nginx又引入了一個機制,叫做 open_file_cache,簡單的說,這個東西的功能就是會緩存打開的文件,只有滿足一定條件的時候纔會重新去check當前fd對應的文件是否合法,是否需要重新打開。 open file cache的指令如下:
Syntax: open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time]; open_log_file_cache off; Default: open_log_file_cache off; Context: http, server, location open_log_file_cache 裏面幾個參數的含義爲:
- max : 設置緩存中描述符的最大數量;如果緩存被佔滿,最近最少使用(LRU)的描述符將被關閉。
- inactive : 設置緩存文件描述符在多長時間內沒有被訪問就關閉; 默認爲10秒。
- min_uses : 設置在inactive參數指定的時間裏, 最少訪問多少次才能使文件描述符保留在緩存中;默認爲1。
- valid :設置一段用於檢查超時後文件是否仍以同樣名字存在的時間; 默認爲60秒。
- off :禁用緩存。
綜上,要讓nginx自切分,需要兩個步驟,其一,配置合理的access_log;其二,開啓open_log_file_cache提升性能; 下面是用實現小時級別日誌切分的配置demo
#提取nginx變量 if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})") { set $year $1; set $month $2; set $day $3; set $hour $4; set $minutes $5; set $seconds $6; } #配置access_log ;以 hour 爲界 access_log logs/access.log.$year$month$day$hour; #配置open_log_file_cache open_log_file_cache max=10 inactive=60s valid=1m min_uses=2;
總結 : 自切分可一定程度上面滿足日誌切分的需求;但是對性能會有一定的影響; 另外,並不支持error_log的切分,個人更推薦產品線採用方式一的方法切。
三、其他
本文主要闡述了nignx日誌切分的方案,希望能夠幫助大家提升對nginx的理解。另外nginx的日誌管理,還是很多值得學習,注意的點,包括syslog支持,gzip支持(想想protobuf)。後續會再爲介紹。