uwsgi和nginx的log一样都是在一个文件名上写log,无法按天进行rotate,所以单个文件的体积会越来越大,不利于log的备份。
nginx的log切分方法
在网络上研究了nginx的log切分方法,原理比较简单。
- 先重命名文件,mv access.log access-20150215.log
- 然后reload一下nginx。
- nginx继续在access.log上写log
我想这种方法也是应该可以应用到uwsgi上面的。但是没有那么容易。
尝试应用到uwsgi
- 先重命名文件,mv uwsgi.log uwsgi-20150215.log
- 然后reload一下uwsgi。
- 没有看到uwsgi.log文件
与想象中的完全不一样。发现uWSGI的reload操作根本重不会新打开log文件。这样就需要变更一下思路了。
解决方案一
参数touch-logreopen
可以重新打开日志。
logto = /data/log/MODULE/uwsgi.log
touch-logreopen=/data/log/MODULE/.touchforlogrotate
touch-logreopen
当指定的文件被touch过后,时间戳发生变化,会让uWSGI重新打开日志文件,并且不会终止当前的服务(不是stop+start,而是reload的概念)。
#!/bin/bash
module="module_name"
DIR=`echo $(cd "$(dirname "$0")"; pwd)` #获取当前目录
LOGDIR="/data/log/$module/" #log目录
sourcelogpath="${LOGDIR}uwsgi.log" #log源地址
touchfile="${LOGDIR}.touchforlogrotate" #需要touch的文件
DATE=`date -d "yesterday" +"%Y%m%d"`
destlogpath="${LOGDIR}uwsgi-${DATE}.log" #重命名后的文件
mv $sourcelogpath $destlogpath
#echo $touchfile
touch $touchfile # 更新文件时间戳
然后在crontab
中加入这个,让每天0点0分的时候切分日志,当然了也可以23点59分,不过要更改一下shell脚本。
00 00 * * * /data/you_module_name/bin/uwsgirotate.sh > /dev/null 2>&1
当然了,也可以不用crontab,如果你有logrorate
服务,可以往里面添加一些事件,来进行日志的滚动。
解决方法二
官方说参数log-maxsize <bytes>
,可以让uWSGI的日志文件达到一定大小后重新打开。不过我记得当达到一定大小后,并没有重新写入到uwsgi.log文件中,比较奇怪。而且按日志大小来切分,感觉没有按时间来切分的好。
解决方案三
使用参数log-master
,让主进程监听一些信号,当想master进程发送信号后,日志就会重新打开,这个也是要配合mv操作先更改文件名才能的。具体参考官方的使用。The Master FIFO
声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客
本文链接地址: uwsgi log rotate按天切割日志 – https://www.chenyudong.com/archives/uwsgi-log-rotate-by-date.html
近期评论