我使用带有参数--daemonize /logs/uwsgi.log的uwsgi。
然而,这个文件变得很大,我想将它拆分成较小的部分。每天一个文件最好。我已经在nginx上做到了这一点,因为可以使用日期变量指定日志文件名。是否可以对uwsgi执行相同的操作?
类似于:
[uwsgi]
daemonize=/logs/uwsgi-$year-$month-$day.log
还有没有其他方法可以获得相同的结果,而不需要涉及太多其他的过程?
我使用带有参数--daemonize /logs/uwsgi.log的uwsgi。
然而,这个文件变得很大,我想将它拆分成较小的部分。每天一个文件最好。我已经在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日志管道插件结合使用。
最后,您可以像nginx一样触发在午夜重新加载uWSGI实例的行为(您甚至可以使用内置的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)
根据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 --; } &