Ricky Hao

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正确地重新打开日志文件。

点赞

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据