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正確地重新打開日誌文件。