uwsgi日志分割

创建于 访问量:

uwsgi是一个很棒的程序,它能轻易的驱动任何支持WSGI协议的应用程序。但它默认的日志系统不能配置按天分割。那么我稍微查了一下资料,写了这篇文章以做记录,方便他日再用。

首先,最重要的是uwsgi配置的touch-logreopen选项,它指定监听一个文件,当这个文件的修改日期有变化时,就会重新打开日志文件。

uwsgi配置类似于

[uwsgi]
socket = %d%n/django.sock
chmod-socket = 666
processes = %k
pidfile = %d%n/master.pid
touch-logreopen = %dsplitlog.py
daemonize = %d%n/run.log
# clear environment on exit
# like pid or unix socket
vacuum = true
chdir = /website/account/
wsgi-file = main/wsgi.py
virtualenv = .venv/

利用这一点,可以考虑写一个脚本,每天0点执行。

import os
import shutil
import datetime

SELF = os.path.abspath(__file__)
BASE_PATH = os.path.dirname(SELF)


def yesterday():
    today = datetime.date.today()
    oneday = datetime.timedelta(days=1)
    yesterday = today-oneday
    return yesterday.strftime("%Y-%m-%d")


for each in os.listdir(BASE_PATH):
    path = os.path.join(BASE_PATH, each)
    if os.path.isdir(path):
        run_log = os.path.join(path, "run.log")
        if os.path.exists(run_log):
            yesterday_log = os.path.join(path, yesterday() + ".log")
            shutil.move(run_log, yesterday_log)

with open(SELF, "rb+") as file:
    all = file.read()
    file.seek(0, 0)
    file.write(all)

然后再创建一个splitlogTask,写入以下内容

0 0 * * * /usr/bin/python3 /website/uwsgi.d/splitlog.py

使用crontab splitlogTask注册这个定时任务即可。