简介
之前一直是使用定时任务去切割日志的,今天使用了下logrotate还不错
操作
大部分操作系统都应该安装了logrotate,所以就不需要安装了,只需要配置就好了。
logrotate的配置文件在
/etc/logrotate.conf
里面你可以看到
include /etc/logrotate.d
这么一行配置,所以你只要在/etc/logrotate.d
里面配置你要切割的日志就好了
给个我的配置
/data/nginx/nginx/logs/xxl-job.log {
compress
dateext
copytruncate
ifempty
rotate 100
olddir /data/nginx/nginx/logs/old
size 500M
}
里面几个参数说下
- compress 压缩日志
- dateext 让日志以日期的形式去命名
- copytruncate logrotate有两种方式滚动日志,一种是copytruncate,就是把老的日志复制一份,然后去做压缩重命名清空等操作,这种方式有个缺点就是当你在复制的时候有新的日志产生,那么这些日志可能会丢失,但是对于我的nginx丢了就丢了嘛,还有一种是create方式,这种是logrotate默认的方式,就是把原来的日志重命名,然后创建新的日志,之后告诉应用我创建了一个新的日志,这种方式可以避免日志丢失,但是也有一个缺点,就是当你的应用如果不支持重新打开新的日志文件,那么就不能使用了。简单来说create是移动老日志文件然后创建新的日志文件,copytruncate是先复制日志文件,然后清空
- ifempty 表示即使是空的日志,那么我也要做转储,对应的是notifempty,表示如果是空日志,那么我就不转储了
- rotate 100 表示保留100个日志转储文件,这个最好配置下,因为如果不配置,那么默认的是0,也就是你只会有一个转储文件
- olddir 表示转储后的文件存放位置对应的是noolddir,表示日志文件和转储文件在同一个目录下面
- size 500M 表示日志到了500M才做转储
其他常用参数
- daily weekly monthly 表示每周每天每个月去转储一次
- nocopytruncate 表示备份日志文件,但是不截断
- nocreate 不创建新的日志
- delaycompress 转储的日志在下一次转储的时候才压缩
- nodelaycompress 转储的时候压缩
- prerotate/endscript 在转储之前要执行的命令,比如使用create转储nginx的时候就需要加上
postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
什么时候进行转储
默认linux在
/etc/cron.daily/
下面有一个logrotate文件,里面大致是
#!/bin/sh
# skip in favour of systemd timer
if [ -d /run/systemd/system ]; then
exit 0
fi
# this cronjob persists removals (but not purges)
if [ ! -x /usr/sbin/logrotate ]; then
exit 0
fi
/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit $EXITVALUE
也就是系统每天会定时使用cron去执行下/usr/sbin/logrotate /etc/logrotate.conf
这个命令
如果你想要每一小时执行一次,那么添加到crontab里面把
欢迎关注我的博客www.bboy.app
Have Fun