uWSGI按時間進行日誌分片

 

0x00 概述

首先,uWSGI沒有提供原生的日誌分片功能,目前好像只有按大小進行分片的功能log-maxsize。因此我們只能手動來實現按天(或者其他時間段)來進行日誌的切割。

0x01 使用工具

logrotate

0x02 uWSGI配置

首先,我們在uwsgi.ini配置文件中,新增關於日誌的配置項:

logto = /path/for/you/log
touch-logreopen = /path/for/you/touch/file

這裏的logto很好理解,就是日誌存儲的位置,而touch-logreopen則是一個trigger,具體作用我們結合下面的logrotate再說。

0x03 Logrotate配置

我們將日誌的配置文件放在/etc/logrotate.d/下面,例如
/etc/logrotate.d/uwsgi

/var/log/uwsgi/app.log {
    daily       # 每日分片
    rotate 30   # 最多儲存30份
    compress    # 儲存的日誌採用gzip壓縮
    create
    postrotate  # 分片後執行的腳本
        touch /var/log/uwsgi/app.touch
    endscript
}

這裏的第一行是日誌的位置,而下面的參數如註釋所述。
其中,比較重要的是postrotate下的腳本。
這裏我們要明白一點就是,uWSGI不會reopen日誌文件。換句話說,當你將日誌app.log分片時,舊的日誌會被命名爲app.log.1.gz,而app.log則會是一個新的空文件。在這時,uWSGI並不會重新打開app.log文件來寫入日誌,而是直接繼續往app.log.1.gz寫入日誌。因此,我們需要一個事件來觸發uWSGI重新打開日誌文件,將接下來的日誌寫入app.log裏。
爲了達到這個目的,uWSGI提供了touch-logreopen配置。這個配置的意思是,uWSGI監控一個文件,當這個文件的寫入時間被更新的時候,就自動重新打開日誌文件。因此,我們需要在logrotate的配置中寫入一個腳本,讓其在每次分片之後能夠touch一下這個文件,改變其修改時間,讓uWSGI正確地重新打開日誌文件。

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