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
注册这个定时任务即可。