a) 切割日志问题:由于一期的任务系统采用的是记录事件日志的形式,事件日志会定期的由logback删除,但是定时器的日志parser.log并没有采用logback来管理删除,在运行了一段时间之后发现parser.log文件过大,于是采用shell脚本的形式来切割日志文件:
#!/bin/bash
logs_path="/data/lobbytask-src/schedule"
ymonth=`date -d "yesterday" +"%Y%m"`
ydate=`date -d "yesterday" +"%d"`
back_path="${logs_path}/log/${ymonth}/${ydate}"
echo "${ydate}"
echo "${back_path}"
mkdir -p ${back_path}
cp ${logs_path}/*.log ${back_path}/
> ${logs_path}/parser.log
最终发现,这种情况是有问题的,发现最后一句“> ${logs_path}/parser.log” 将日志文件清空的功能是有效的,但是,就在清空的瞬间变成0大小之后,又瞬间变回去了。于是采用专门的日志切割工具来尝试:
采用 logrotate :
一般情况,ubuntu会自带这个工具,没有话,也可以用apt-get安装,主配置文件:/etc/logrotate.conf,这个文件里include文件夹;etc/logrotate.d,那么我就在这个文件夹下面新建我的文件:lobbytask:
/data/lobbytask-src/schedule/parser.log
{
daily
rotate 10
copytruncate
compress
notifempty
prerotate
echo `du -sh /data/lobbytask-src/schedule/parser.log`
endscript
postrotate
echo `du -sh /data/lobbytask-src/schedule/parser.log`
endscript
}
然后使用命令 `/usr/sbin/logrotate /etc/logrotate.conf ` 来执行,最后结果发现跟自己写shell一样,日志文件大小瞬间变成0之后又变回去了。
得出结论:像这样跑出来的日志文件,由于一直处于打开的读写状态,所以无法清空。与nginx不同的是,nginx的日志切割普遍采用将日志文件移除,然后采用kill -USR1 $(cat /usr/local/nginx/nginx.pid) 发信号给nginx主程序,通知其重新打开一次日志文件。那么,我的这个parser.log只能每次切割的时候停掉定时器,然后再重启,代价太大,最终改成了由logback来管理,每个30天自动删除,问题解决。