1. 使用linux中的logrotate转储
vim /etc/logrotate.conf
/data/log/uwsgi.log {
daily
rotate 10
dateext
missingok
notifempty
copytruncate
nocompress
sharedscripts
}
daily:每天转储一次,该参数还有 weekly/monthly/yearly 值。
rotate 10:最多保留 10 个转储日志文件。
dateext:以日期格式作为转储日志文件名后缀。
missingok:如果源日志不存在,忽略错误。
notifempty:如果源日志为空,不执行转储。
copytruncate:将源日志内容截取出来,用其内容新建转储文件。
nocompress:不压缩。
sharedscripts:对一批日志文件使用同一个脚本一次执行,而不是每个单独执行。
1. uwsgi日志转储
daemonize=/data/log/uwsgi/uwsgi.log,uwsgi的日志转储经过验证使用logrotate是不可行的,uwsgi本身提供根据文件大小来rotate的功能,如果想要通过日期每天转储,首先需要使用touch-logreopen来设置一个监听对象:
daemonize=/data/log/uwsgi/uwsgi.log
# 使得uwsgi.log文件被转存后能继续在uwsgi.log文件中写入日志,且不会中断当前程序的执行
touch-logreopen =/data/log/uwsgi/.touchforlogrotat
在创建脚本touchforlogrotat.sh
#!/bin/bash
DIR=`echo $(cd "$(dirname "$0")"; pwd)` #获取当前目录
LOGDIR="/data/log/uwsgi/" #log目录
sourcelogpath="${LOGDIR}uwsgi.log" #log源地址
touchfile="${LOGDIR}.touchforlogrotat" #需要touch的文件
DATE=`date -d "yesterday" +"%Y%m%d"`
destlogpath="${LOGDIR}uwsgi-${DATE}.log" #重命名后的文件
mv $sourcelogpath $destlogpath
touch $touchfile # 更新文件时间戳
当监听对象touch-logreopen所指向的文件被touch,时间戳改变后,uwsgi会重新打开uwsgi.log文件进行写入,且不会中断当前程序的执行。如果没有touch-logreopen这个监听对象,是无法对uwsgi.log进行转储的。通过crontab设置定时任务
$ crontab -e
输入以下行,表示每天0点进行转储。
0 0 * * * sh /data/LogParserServer/touchforlogrotate.sh