uwsgi日志按天分割保存

573 阅读4分钟

最近网站被频繁的攻击,需要经常查看uwsgi日志,进行分析,查找可疑ip,进行黑名单设置;在查看uwsgi日志的时候发现uwsgi日志很大,有上百M,下载很不方面,并且打开日志和查看日志均不是很方便; ` 最理想的就是每天一个日志文件,方面管理和查看。

uwsgi没有提供按天切割日志的配置,只提供了一个log-maxsize配置,当文件达到多大的时候自动切分,对于查找历史日志还是很不方便,我们一般是按照时间查询。

我是小白,根据网上的资料,归纳总结,并加以菜鸟备注呈现给大家; ` 原理就是:配合sh+crontab脚本技术,用mv+touch-logreopen参数,移动日志文件后,让uwsgi重新打开日志并记录。

系统:centos 7 (其他系统也是一样的)

应用:django + uwsgi + nginx 的 web 应用 (只要有uwsgi,配置也是一样的)

1、在uwsgi的配置文件 uwsgi.xml 中,添加 touch-logreopen配置 (我的情况是uwsgi 的配置文件在django项目根目录下,其他情况也是一样的原理):

./logs/uwsgi.log

./logs/.touchforlogrotat

如果你的uwsgi配置文件是 ini 格式的,可以新增如下内容 #进程在后台运行,并将日志打印到指定文件 daemonize = ./logs/uwsgi.log #设置一个监听对象 touch-logreopen = ./logs/.touchforlogrotat 关于路径问题,大家根据自己的情况规划即可,因为uwsgi配置文件在项目根目录,因此上面的路径 ./logs/uwsgi.log的意思是在uwsi配置文件所在的目录中的一个文件夹logs,uwsgi.log就在logs这个文件夹内。

以上配置结合下面的脚本文件作用的原理是:当监听对象 touch-logreopen 所指向的文件被touch,时间戳改变后,当前的uwsgi.log文件会重新按照日期命名,并保存在相应的文件夹,同时uwsgi会重新新建uwsgi.log文件进行写入新日志,且不会中断当前程序的执行。如果没有touch-logreopen这个监听对象,是无法对uwsgi.log进行转储的。

2、创建脚本文件 在系统根目录的shell目录中,新建一个.sh的脚本文件uwsgi_log_cut.sh,内容如下:

#!/bin/bash LOGDIR="/www/logs/" #当前日志所在目录 DATE=date -d "yesterday" +"%Y-%m-%d" NEWDIR="/www/logs/history" #新建文件夹history用来放旧日志 mkdir -p NEWDIRmv{NEWDIR} mv {LOGDIR}/uwsgi.log N E W D I R / u w s g i − {NEWDIR}/uwsgi- NEWDIR/uwsgi−{DATE}.log #将旧日志重新以日期命名 touch /www/logs/.touchforlogrota 这里面的文件路径www在系统根目录,我django项目就在www文件夹。

3、脚本的运行设置 通过crontab设置定时任务,命令行下输入:

crontab -e 会进入一个当前用户的文件,在这个文件中添加下面这行操作:

‘’’

执行任务 第一个* 一小时当中的第几分钟:0-59 第二个* 一天当中的第几个小时:0-23 第三个* 一月当中的第几天:1-31 第四个* 一年当中的第几个月:1-12 第五个* 一周当中的第几个星期:0-7 0,7都代表周日 ‘’’ 0 0 * * * sh /shell/uwsgi_log_cut.sh #代表每天0点执行脚本 uwsgi_log_cut.sh 这里的原理就是每天0点执行系统根目录中shell文件夹中的uwsgi_log_cut.sh文件。 最后重启uwsgi,logs文件中的history文件夹都会有每天的日志了 `#!/bin/bash #0 0 * * * sh /home/lizhihua/ranger2020/restart.sh echo "重启开始"

切换目标文件夹

cd /home/lizhihua/ranger2020/

拉到当前目录

#gitee.com/gistide_1/r…

激活环境

source /home/lizhihua/ranger2020/venv/bin/activate

更新或者下载依赖包

查看进程

ps -ef|grep python3.7

#这里的-d 参数判断$myPath是否存在 ,! -d 表示不存在 if [ ! -d "/var/log/uwsgi" ]; then mkdir -p /var/log/uwsgi fi

NEWDIR="/var/log/uwsgi/history" #新建文件夹history用来放旧日志 if [ ! -d "NEWDIR"];thenmkdirpNEWDIR" ]; then mkdir -p {NEWDIR} fi

myPath="/var/log/uwsgi/ranger2020.log" if [ ! -f "myPath"];thentouch"myPath" ]; then touch "myPath" fi

dd=date +%Y%m%d%H%M%S

mv -f /var/log/uwsgi/ranger2020.log NEWDIR/ranger2020{NEWDIR}/ranger2020-{dd}.log #将旧日志重新以日期命名

mystart="/home/lizhihua/ranger2020/restart.sh" #这里的-x 参数判断myPath是否存在并且是否具有可执行权限if[!x"myPath是否存在并且是否具有可执行权限 if [ ! -x "mystart" ]; then chmod -R 777 "$mystart" fi

sleep 3s echo "正在关闭Python服务" mypid="/var/run/ranger2020.pid" if [ ! -f "mypid"];thenPID=1elsePID=mypid" ]; then PID=-1 else PID=(cat "mypid")fiPIDEXIST=mypid") fi PID_EXIST=(ps aux | awk '{print 2}'| grep -w PID)

if [ ! PIDEXIST];thenechotheprocessPID_EXIST ];then echo the process PID is not exist pkill -9 -f uwsgi echo "启动Python服务" #启动: uwsgi --ini run.ini else echo the process PID exist echo "重启Python服务" #重启: uwsgi --reload "mypid" fi

#保存备份个数 number=30 #找出需要删除的日志 delfile=ls -l -crt $NEWDIR/*.log | awk '{print $9 }' | head -1

#判断现在的备份数量是否大于numbercount=lslcrtnumber count=`ls -l -crt NEWDIR/*.log | awk '{print $9 }' | wc -l`

if [ countgtcount -gt number ] then #删除最早生成的备份,只保留number数量的备份 rm delfile #写删除文件日志 #echo "delete delfile" >> $backup_dir/*.log fi

echo "重启结束"

`