我使用uwsgi和参数--daemonize /logs/uwsgi.log
然而,这个文件变得越来越大,我想将它分成更小的部分。每天一个会更好。我已经为nginx做了这个,使用日期变量很容易指定日志文件名。是否有可能为uwsgi做同样的事情?
类似的东西:
[uwsgi]
daemonize=/logs/uwsgi-$year-$month-$day.log
或者是否有另一种方法可以获得相同的结果,而不会过多地参与其他过程?
答案 0 :(得分:15)
基于时间的方法使用经典的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
答案 1 :(得分: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配置。
答案 2 :(得分:1)
每小时重装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会将“L”写入uwsgi fifo(触发日志轮换)。然后它会在移动旋转的日志之前休眠几秒钟,以便在文件名中包含所需的日期格式。睡眠可能是无关紧要的,但我想确保uwsgi有时间旋转日志。此外,如果在一小时内的任何其他时间重新启动uwsgi,则cron会在零分钟时明确触发以避免日志轮换。
这可能适用于较旧版本的uWSGI,可以使用旧版uwsgi cron选项或使用crontab。
答案 3 :(得分:0)
[uwsgi]
wsgi-file = bean/wsgi.py
# 重启时间
# harakiri = 10
# 主进程
master = true
# 4个进程/workers
processes = 4
# 两个核心
threads = 2
# 开启线程
enable-threads = true
# 单个进程最大请求数
max-requests = 5000
# 解包缓冲区大小
buffer-size = 65536
reload-mercy = 8
stats = 127.0.0.1:5000
pidfile = /var/run/itpserver.pid
vacuum = true
disable-logging = true
logto = /opt/logs/uwsgi.log
touch-logreopen = /opt/logs/.touchforlogrotat
和
#!/bin/bash
if [ ${ITM_CONFIG}=="test" ]
then
LOGDIR="/home/logs"
else
LOGDIR="/opt/logs"
fi
DATE=`date -d "yesterday" +"%Y-%m-%d"`
BACKUPCOUNT="7"
DELDATE=`date -d "${BACKUPCOUNT} day ago" +"%Y-%m-%d"`
mv ${LOGDIR}/uwsgi.log ${LOGDIR}/uwsgi.${DATE}.log
rm -f ${LOGDIR}/uwsgi.${DELDATE}.log
touch ${LOGDIR}/.touchforlogrotat
并使用以下sh添加crontab:
@daily sh /home/share/logbackups.sh # uwsgilogrotat
更友好的方式