Logrotate入门了解及生产实践
# 1,简单了解
logrotate 在 CentOS 系统中是默认安装的日志轮替组件,通过如下命令可以看到主配置内容:
egrep -v '^$|^#' logrotate.conf
weekly
rotate 4
create
dateext
include /etc/logrotate.d
/var/log/wtmp {
monthly
create 0664 root utmp
minsize 1M
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
这个配置当中其他内容基本上可以忽略,主要内容是第 6 行的引用,我们新增一些日志管理策略也都可以在这个目录下创建相关策略来维护。
logrorate 默认在系统的 /etc/cron.daily
中存放了一个执行脚本,因此默认情况下脚本将会每天执行一次:
$cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
2
3
4
5
6
7
8
了解了这些基本信息之后,就可以对这个工具投入使用了,不过还需要了解一下配置文件中的参数意义,以便配制出符合自己需求的轮替脚本。
# 2,配置了解
compress
:通过 gzip,压缩转储以后的日志nocompress
:不需要压缩时,用这个参数copytruncate
:用于还在打开中的日志文件,把当前日志备份并截断nocopytruncate
:备份日志文件但是不截断createmodeownergroup
:转储文件,使用指定的文件模式创建新的日志文件nocreate
:不建立新的日志文件delaycompress
和compress
:一起使用时,转储的日志文件到下一次转储时才压缩missingok
:在日志轮循期间,任何错误将被忽略,例如 “文件无法找到” 之类的错误。nodelaycompress
:覆盖 delaycompress 选项,转储同时压缩。errorsaddress
:专储时的错误信息发送到指定的 Email 地址ifempty
:即使是空文件也转储,这个是 logrotate 的缺省选项。notifempty
:如果是空文件的话,不转储mailaddress
:把转储的日志文件发送到指定的 E-mail 地址nomail
:转储时不发送日志文件dateext
:转储后的日志文件以日期命名olddirdirectory
:转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统noolddir
:转储后的日志文件和当前日志文件放在同一个目录下prerotate/endscript
:在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行postrotate/endscript
:在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行daily
:指定转储周期为每天weekly
:指定转储周期为每周monthly
:指定转储周期为每月rotatecount
:指定日志文件删除之前转储的次数,0 指没有备份,5 指保留 5 个备份size
(或 minsize):size 当日志文件到达指定的大小时才转储,Size 可以指定 bytes(缺省) 以及 KB(sizek) 或者 MB(sizem)
以上是一些常用的配置,可以按需定义自己的配置文件。
# 3,生产案例
接下来介绍几个生产当中常用的例子,可以直接借鉴以使用。
# 1,NGINX 日志
NGINX 日志的处理是一种常见的场景,处理的方式用的较多的是结合 logrotate 来进行处理,当然也可以基于 NGINX 自身的配置文件策略对日志进行自动切割,此种方案可以参考另外一篇文章:从 NGINX 自身配置文件中定义访问日志按时间切割 (opens new window),这里则介绍 logrotate 方案的具体配置方式。
在 /etc/logrotate.d
下添加如下配置:
$ cat /etc/logrotate.d/nginx
/data/log/access.log
/data/log/error.log
{
daily
dateext
missingok
rotate 7
notifempty
create 755 www
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
这个案例是针对这种提供了平滑过渡日志写操作的脚本,其他类似的应用日志也可以套用这个地方的配置。
当我们配置添加之后,等不了系统的执行,想要自己看一下效果,可用如下命令手动运行:
logrotate -f /etc/logrotate.d/nginx
# 2,catalina 日志
catalina 是一个代指,与上边配置相对的,特指那种始终写到一个文件里,自身没有任何轮替策略,也无法通过调用所有平滑过渡来处理的情况下,可以使用如下配置对日志进行处理。
配置如下:
$ cat /etc/logrotate.d/catalina
/data/log/catalina.log
{
missingok
copytruncate
compress
dateext
notifempty
daily
rotate 7
create 755 root root
}
2
3
4
5
6
7
8
9
10
11
12
这个配置文件看起来与上边的区别除了脚本的处理之外,还多了一个重要的配置是 copytruncate
,如果你在配置了 rotate 策略之后,发现日志转储了,但是写的对象也转移到了转储之后的文件了,那么应该就是漏了这个配置项。
# 3,日志量大
有时候可能业务量非常大,默认的按天切割就有点不大能够满足我们的需求,磁盘可能很快就要满了,这个时候可以将策略自定义为每小时执行一次。
$ cat /etc/logrotate.d/nginx
/data/log/access.log
/data/log/error.log
{
hourly
dateext
missingok
rotate 7
notifempty
create 755 www
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
然后记得把执行脚本往小时执行池子里拷贝一份:
$ cp /etc/cron.daily/logrotate /etc/cron.hourly/
当然也可将策略调整为按大小进行切割,这个方案也是可以的,这里就不做示例了。