我使用带有参数的 uwsgi --daemonize /logs/uwsgi.log
然而,这个文件变大了,我想把它分成更小的部分。最好每天一个。我已经为 nginx 做到了,使用日期变量很容易指定日志文件名。是否可以为 uwsgi 做同样的事情?
就像是:
[uwsgi]
daemonize=/logs/uwsgi-$year-$month-$day.log
或者是否有其他方法可以获得相同的结果,而无需过多参与其他过程?
我使用带有参数的 uwsgi --daemonize /logs/uwsgi.log
然而,这个文件变大了,我想把它分成更小的部分。最好每天一个。我已经为 nginx 做到了,使用日期变量很容易指定日志文件名。是否可以为 uwsgi 做同样的事情?
就像是:
[uwsgi]
daemonize=/logs/uwsgi-$year-$month-$day.log
或者是否有其他方法可以获得相同的结果,而无需过多参与其他过程?
uWSGI 本身只能通过 --log-maxsize 选项“按大小拆分”。
基于时间的方法使用经典的 logrotate 或 apache rotatelogs ( http://httpd.apache.org/docs/2.2/programs/rotatelogs.html ),您可以将它们与 uWSGI logpipe 插件结合使用。
最后,您可以在 uWSGI 实例的午夜触发重新加载的类似 nginx 的行为(您甚至可以使用嵌入式 cron 工具):
[uwsgi]
daemonize = /logs/uwsgi-@(exec://date +%%Y-%%m-%%d).log
log-reopen = true
每小时重新加载 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 有时间轮换日志。此外,如果 uwsgi 在一小时内的任何其他时间重新启动,cron 会在零分钟显式触发以避免日志轮换。
通过适应旧样式的 uwsgi cron 选项或使用 crontab,这可能与旧版本的 uWSGI 一起使用。
根据 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 配置。