一、背景:
我们的nginx日志文件之前没有做归档保存,导致日益增大,以后会越来越大直到打不开,因此我们希望实现自定义归档保存,比如:按天切割日志归档保存,最多保存30天的日志文件。
二、logrotate实现全流程记录:
(1)检查是否安装了logrotate,默认系统自带:
执行命令:logrotate --help
(2)在任意你想存放的目录下新建一个配置文件,比如我直接放在了nginx的日志目录logs下: /app/nginx/nginx/logs/nginx_log_split.conf
# 需要注意,下面内容中的路径需要根据实际进行调整
/app/nginx/nginx/logs/*.log {
daily
dateext
missingok
rotate 30
compress
delaycompress
notifempty
create 0644 root root
sharedscripts
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi \
endscript
postrotate
[ -s /app/nginx/nginx/logs/nginx.pid ] && kill -USR1 `cat /app/nginx/nginx/logs/nginx.pid`
endscript
}
(3)测试配置是否正确:
执行sudo logrotate -f /app/nginx/nginx/logs/nginx_log_split.conf ,查看结果是否符合预期
(4)添加到crontab中:
执行sudo crontab -e进入编辑页面,添加任务到最下方:
# nginx log
59 23 * * * sudo logrotate -f /app/nginx/nginx/logs/nginx_log_split.conf >/dev/null 2>&1
(5)验证定时任务是否正常
三、补充说明:
需要注意的是,默认情况下,系统会自动执行放在/etc/logrotate.d/目录下的配置文件,默认的定时任务配置如下图,在每天早上6:25会执行daily的任务,
因此,如果上面第(2)步中将配置文件放在/etc/logrotate.d/目录下,那么就不需要自己添加crontab任务了。
但是这样有个问题就是,在每天早上6:25进行归档日志文件不符合我们的预期(一般是每天的23:59),为了符合我们的预期,有两个方法:
1、修改下图中的默认配置,将 25 6 改成我们想要的 59 23,但是这样会影响到所有daily的归档任务,风险较大。因此没有采用
2、自定义存放配置文件的位置,通过crontab -e自行添加定时任务来实现(详见上面步骤),这样符合了我们的预期,也不影响其它全局性的默认配置。