兩種Nginx日誌切分方案,狼廠主要在用第1種

nginx的日誌切分問題一直是運維nginx時需要重點關注的。本文將簡單說明下nginx支持的兩種日誌切分方式。

一、定時任務切分

所謂的定時任務切分,是指通過定時任務(比如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)。後續會再爲介紹。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章