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

时间:2015-02-05 11:52:29

标签: logging uwsgi log-rotation

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

然而,这个文件变得越来越大,我想将它分成更小的部分。每天一个会更好。我已经为nginx做了这个,使用日期变量很容易指定日志文件名。是否有可能为uwsgi做同样的事情?

类似的东西:

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

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

4 个答案:

答案 0 :(得分:15)

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

答案 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

更友好的方式