- A+
7月 30, 2018 0条评论
7,453次阅读
9人点赞
0x00 概述
首先,uWSGI没有提供原生的日志分片功能,目前好像只有按大小进行分片的功能log-maxsize
。因此我们只能手动来实现按天(或者其他时间段)来进行日志的切割。
0x01 使用工具
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正确地重新打开日志文件。
- 我的微信
- 这是我的微信扫一扫
- 我的微信公众号
- 我的微信公众号扫一扫