如何每天创建一个 uwsgi 日志文件?

How to create one uwsgi log file per day?

我使用带有参数 --daemonize /logs/uwsgi.log

的 uwsgi

但是这个文件越来越大,我想把它分成小块。最好每天一个。我已经为 nginx 做到了,它很容易使用日期变量指定日志文件名。是否可以对 uwsgi 做同样的事情?

类似于:

[uwsgi]
daemonize=/logs/uwsgi-$year-$month-$day.log

或者是否有另一种方法可以获得相同的结果,而无需太多其他过程的参与?

uWSGI 本身只能 "split by size",加上 --log-maxsize 选项。

基于时间的方法使用经典的 logrotate 或 apache rotatelogs (http://httpd.apache.org/docs/2.2/programs/rotatelogs.html),您可以将它们与 uWSGI logpipe 插件结合使用。

最后你可以有一个类似于 nginx 的行为在 uWSGI 实例的午夜触发重新加载(你甚至可以使用嵌入式 cron 工具):

[uwsgi]
daemonize = /logs/uwsgi-@(exec://date +%%Y-%%m-%%d).log
log-reopen = true

根据 roberto 的回答,这里是将轮换日志的配置。它将保留多达 14 个日志文件。每日轮换 3:15.

[uwsgi]
set-placeholder = log_dir=/var/log
set-placeholder = log_prefix=myservice-
set-placeholder = log_num=14
pidfile = /var/run/uwsgi-myservice.pid
logto = %(log_dir)/%(log_prefix)@(exec://date +%%Y-%%m-%%d).log
log-reopen = true
unique-cron = 15 3 -1 -1 -1 { sleep 66 && kill -HUP $(cat %(pidfile)) && ls -tp %(log_dir)/%(log_prefix)* | grep -v '/$' | tail -n +%(log_num)  | xargs -d '\n' -r rm --; } &

需要睡眠,因为在重新加载后 uwsgi 将再次执行 cronjob,因为它会匹配当前时间。所以我们需要在重新加载之前休眠 60 秒以上。它还会在每次旋转时重新加载配置文件,这种行为可能是不希望的。

为什么需要这样的 hack?好吧,就我而言,我无权在系统中正确配置日志记录,但我有权更改 uwsgi 配置。

每小时重新加载 uwsgi 感觉 heavy-handed,我想要一个更有效的解决方案。 uWSGI 有一个内置的循环机制,但是(截至目前)只能在日志达到一定大小时自动触发。 uWSGI 通过 fifo 支持强制日志轮换,这让我想到了以下解决方案,它避免了重新加载并且完全在 uwsgi 中处理。以下 ini 应该在 uWSGI 1.9.11+ 中工作:

[uwsgi]
# Directory for demo purposes
uwsgi-directory = /var/uwsgi
master-fifo = %(uwsgi-directory)/uwsgi.fifo
logto = %(uwsgi-directory)/logs/uwsgi.log

# Destination for rotated log
log-backupname = %(uwsgi-directory)/logs/uwsgi.log.rotated

log-master = true
log-reopen = true

# Cron to trigger log rotation each hour
cron2 = hour=-1,minute=0,unique=1 echo L > %(master-fifo) && sleep 5 && mv %(log-backupname) %(logto).$(/bin/date -u -d '-1 hour' +%%Y-%%m-%%d-%%H)

每小时,零分钟,uwsgi 将"L"写入uwsgi fifo(触发日志轮转)。然后它将休眠几秒钟,然后移动旋转日志以在文件名中具有所需的日期格式。睡眠可能是无关紧要的,但我想确保 uwsgi 有时间轮换日志。此外,如果 uwsgi 在该小时内的任何其他时间重新启动,cron 会在第 0 分钟显式触发以避免日志轮换。

通过适应旧样式的 uwsgi cron 选项或使用 crontab,这可能可以与旧版本的 uWSGI 一起使用。