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

11

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

然而,这个文件变得很大,我想将它拆分成较小的部分。每天一个文件最好。我已经在nginx上做到了这一点,因为可以使用日期变量指定日志文件名。是否可以对uwsgi执行相同的操作?

类似于:

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

还有没有其他方法可以获得相同的结果,而不需要涉及太多其他的过程?

3个回答

20

uWSGI本身只能使用--log-maxsize选项进行“按大小拆分”。

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

最后,您可以像nginx一样触发在午夜重新加载uWSGI实例的行为(您甚至可以使用内置的cron工具):

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

使用daemonize-row后,我得到了一个名为“/logs/uwsgi-.log”的日志文件,缺少日期部分。这是否需要某个特定版本或插件? - Markus Johansson
1
2.x 版本肯定能用,也许你的路径下没有 'date' 命令? - roberto
1
问题是我使用的uwsgi版本太旧了(1.9.x)。升级后问题得到解决,现在您的解决方案似乎可以工作了。(至少它创建了一个带有今天日期的文件)。谢谢! - Markus Johansson

4

每小时重新加载uwsgi感觉过于繁琐,我想找到更有效的解决方案。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会向uwsgi fifo写入"L"(触发日志轮换)。然后它会在几秒钟内休眠一段时间,然后将已经轮换的日志文件移动到所需的日期格式中。虽然这个休眠可能是多余的,但我希望确保uwsgi有足够的时间来旋转日志。此外,cron明确地在整点触发,以避免在整个小时内的其他任何时间重新启动uwsgi时发生日志轮换。
这也可以用于旧版本的uWSGI,只需根据旧版样式的uwsgi cron选项进行调整或使用crontab即可。

1

根据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秒。每次旋转时它还会重新加载配置文件,这种行为可能不被期望。
为什么需要这样的黑客?好吧,在我的情况下,我无法正确配置系统中的日志记录,但我有权限更改uwsgi配置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接