日志是一个系统必不可少的组成部分,它可以记录系统运行的状况,当系统出现bug能让我们快速找到并解决。不过对应uWSG只提供了log-maxsize配置来按文件大小分割,这似乎不太合理,在这里介绍一下使用cron+shell工具来帮我们按天定时分割日志。
在本人的工作场使用docker来部署整个项目,并将日志的目录通过data volume的持久化保存,也不需要进docker容器才能查看日志,但是碰到了一个问题是,网上很多博客日志分割通过touch uWsgi中touch-logreopen配置的文件来触发生成新的日志。但在本人的项目中并没起效果,一直没有新的日志文件产生,开始怀疑是不是touch-logreopen参数不起效果,然后本人做了很多测试终于发现了一点,touch-logreopen触发事件与daemonize配置指定的日志路径没有关系,而是跟pidfile配置的文件有关,它触发事件会在pidfile配置的同级路径下生成一个同名的log文件
下面是本人的ini文件:
# uwsgi.ini file
[uwsgi]
# Django-related settings
# the base directory (full path)
uid = www-data
gid = www-data
# logs
daemonize = ./logs/uwsgi_in_docker.log
# 该文件变动时重新指定新的输出流到新的日志文件
touch-logreopen = ./logs/.touchforlogrotate
# Django s wsgi file
module = Backend.wsgi
# the sock file path
socket = :8000
# the number of worker
workers = 5
# 值得注意的式网上很多uwsgi分割日志教程中都没提到一点是,touch-logreopen监控文件时间发生时,
# 不会生成daemonize指定的文件,而生成pidfile同名前缀且同目录的的log文件
pidfile = ./logs/.uwsgi_in_docker.pid
# process-related settings
# master
master = true
# serializer requests
thunder-lock = true
# enable threads support
enable-threads = true
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true
# Concurrenc socket connection num, default=100
listen = 128
下面是shell文件:
#!/bin/bash
DIR=`echo $(cd "$(dirname "$0")"; pwd)`
LOGDIR="${DIR}/logs"
sourcelogpath="${LOGDIR}/uwsgi_in_docker.log"
touchfile="${DIR}/.touchforlogrotate"
DATE=`date -d "yesterday" +"%Y-%m-%d"`
destlogpath="${LOGDIR}/uwsgi_in_docker.log.${DATE}"
# 保留的日志备份数
BACKUP=30
# 删除30天以前的日志,+${BACKUP}代表多少天前
find ${LOGDIR} -mtime +${BACKUP} -name "uwsgi*.log*" -exec rm -rf {} \;
# 将日志前一天的日志分割
mv $sourcelogpath $destlogpath
# 触发uWSGI中的监听事件,uWSGI生成新的日志
touch $touchfile
crontab定时调用
0 0 * * * sh /路径/touchforlogrotate.sh