使用logrotate来轮转你的日志

简介

之前一直是使用定时任务去切割日志的,今天使用了下logrotate还不错

操作

大部分操作系统都应该安装了logrotate,所以就不需要安装了,只需要配置就好了。

logrotate的配置文件在

/etc/logrotate.conf

里面你可以看到

include /etc/logrotate.d

这么一行配置,所以你只要在/etc/logrotate.d里面配置你要切割的日志就好了

给个我的配置

1
2
3
4
5
6
7
8
9
/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的时候就需要加上
    1
    2
    3
    postrotate
    [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
    endscript

什么时候进行转储

默认linux在

/etc/cron.daily/

下面有一个logrotate文件,里面大致是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/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

欢迎关注我的其它发布渠道