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
Logo

更多推荐