上面两篇文件讲完Linux系统中流行的日志管理系统rsyslog和syslog-ng。
我们知道在系统中会产生各种各样的日志,那么这个时候就需要一个简易的日志管理程序了,比如说对日志进行压缩,切割等操作。CentOS或Debian都自带了logrotate日志管理工具,简单好用,下面就详细说说logrotate工具。
logrotate
logrotate是一个日志管理程序,用来把旧的日志文件删除(备份),并创建新的日志文件,这个过程称为“转储”。我们可以根据日志的大小,或者根据其使用的天数来转储。
logrotate 的执行由crond服务实现。在/etc/cron.daily目录中,有个文件logrotate,它实际上是个shell script,用来启动logrotate。logrotate程序每天由cron在指定的时间(/etc/crontab)启动。因此,使用ps是无法查看到logrotate的。如果它没有起来,就要查看一下crond服务有没有在运行。在执行logrotate时,需要指定其配置文件/etc/logrotate.conf。这 个配置文件的注释写得很清楚,没有必要再罗嗦了。只想强调下面这行,它的作用包含存放在/etc/logrotate.d目录下面的配置文件,不可或缺。 如果你安装了一个新的服务,它的日志转储的规则可以建立一个专门的配置文件,放在/etc/logrotate.d下面。它其实也因为下面的这句话,在 logrotate服务启动时被读取。
每个存放在/etc/logrotate.d目录里的文件,都有上面格式的配置信息。在{}中定义的规则,如果与logrotate.conf中的冲突,以/etc/logrotatate.d/中的文件定义的为准。
Logrotate的运行分为三步,判断系统的日志文件,建立转储计划以及参数,通过cron daemon 运行下面的代码是 Red Hat Linux 缺省的crontab 来每天运行logrotate。logrotate启动脚本放在/etc/cron.daily/logrotate中.
1 2 3 4 |
#!/bin/sh test -x /usr/sbin/logrotate || exit 0 /usr/sbin/logrotate /etc/logrotate.conf |
可人工执行命令进行测试:
1 |
/usr/sbin/logrotate -f /etc/logrotate.conf |
看一下主配置文件/etc/logrotate.conf的参数解释:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# see "man logrotate" for details # rotate log files weekly weekly #每周轮转一次 # keep 4 weeks worth of backlogs rotate 4 #保留四个日志文件 # create new (empty) log files after rotating old ones create #rotate后,创建一个新的空文件 # uncomment this if you want your log files compressed #compress #默认是不压缩的 # RPM packages drop log rotation information into this directory include /etc/logrotate.d #这个目录下面配置文件生效 # no packages own wtmp — we’ll rotate them here /var/log/wtmp { #定义/var/log/wtmp这个日志文件; monthly #每月轮转一次,取代了上面的全局设定的每周轮转一次; minsize 1M #定义日志必须要大于1M大小才会去轮转; create 0664 root utmp #新的日志文件的权限,属主,属主; rotate 1 #保留一个,取代了上面的全局设定的保留四个; } /var/log/btmp { #定义/var/log/btmp这个日志文件; missingok #如果日志丢失, 不报错; monthly create 0600 root utmp rotate 1 } |
如果在对应的文件下没有设定对应的参数,那么此日志会继承全局配置参数,如:/var/log/btmp文件没有指定monthly,那么机会继承全局参数weekly进行日志轮换了。
logrotate常用参数介绍:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
daily #指定转储周期为每天 weekly #指定转储周期为每周; monthly #指定转储周期为每月; rotate count #指定日志文件删除之前转储的次数,0指没有备份,5指保留5个备份; compress #通过gzip压缩转储以后的日志; nocompress #不需要压缩时,用这个参数; delaycompress #延迟压缩,和compress一起使用时,转储的日志文件到下一次转储时才压缩; nodelaycompress #覆盖delaycompress选项,转储同时压缩; copytruncate #用于还在打开中的日志文件,把当前日志备份并截断; nocopytruncate #备份日志文件但是不截断; create mode owner group #转储文件,使用指定的文件模式创建新的日志文件; nocreate #不建立新的日志文件; errors address #专储时的错误信息发送到指定的Email地址; ifempty #即使是空文件也转储,这个是logrotate的缺省选项; notifempty #如果是空文件的话,不转储; mail address #把转储的日志文件发送到指定的E-mail地; nomail #转储时不发送日志文件; olddir directory #转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统; noolddir #转储后的日志文件和当前日志文件放在同一个目录下; prerotate/endscript #在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行; postrotate/endscript #在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行; tabootext [+] list #让logrotate不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave,v,和~ ; size size #当日志文件到达指定的大小时才转储,Size可以指定bytes(缺省)以及KB(sizek)或者MB(sizem); postrotate <s> endscript #日志轮换过后指定指定的脚本,endscript参数表示结束脚本; sharedscripts #共享脚本,下面的postrotate <s> endscript中的脚本只执行一次即可; |
以上参数都可以已定义在全局配置,或者指定为某个日志文件对的配置,但注意使用时参数之间不要冲突。
一个新系统准备上线前,应该做好以下日志的配置,配置到/etc/logrotate.d/目录下即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
/var/log/syslog { rotate 7 #保留7份日志文件; daily #每天轮换一次; missingok #如果日志丢失,不报错; minsize 10M #定义日志必须大于10M才会去轮换; notifempty #如果是空文件就不进行转存; compress #压缩日志; delaycompress #延迟压缩,和compress一起使用时,转储的日志文件到下一次转储时才压缩; postrotate #轮换过后重启rsyslog服务; invoke-rc.d rsyslog rotate > /dev/null endscript #结束脚本; } /var/log/mail.info /var/log/mail.warn /var/log/mail.err /var/log/mail.log /var/log/daemon.log /var/log/kern.log /var/log/auth.log /var/log/user.log /var/log/lpr.log /var/log/cron.log /var/log/debug /var/log/messages { rotate 4 weekly missingok notifempty compress delaycompress sharedscripts #共享脚本,下面的postrotate脚本只执行一次即可; postrotate invoke-rc.d rsyslog rotate > /dev/null endscript } |
在定义日志文件时也可以使用通配符,但最好少用通配符,因会它会包括已经切换过的日志,要用的话最好在*号后加上扩展名, 如*.log。
一般除了这些系统日志需要配置一下,还有一些应用日志以及组件日志可能也需要配置,如Nginx、php、tomcat、zabbix-agent等。
NGINX日志
1 2 3 4 5 6 7 8 9 10 11 12 |
/var/log/nginx/*log { daily rotate 10 missingok notifempty compress sharedscripts su root postrotate /bin/kill -USR1 $(cat /var/run/nginx.pid 2>/dev/null) 2>/dev/null || : endscript } |
PHP日志
1 2 3 4 5 6 7 8 9 10 |
/var/log/php-fpm/*log { missingok notifempty sharedscripts delaycompress create 0664 www www postrotate /bin/kill -SIGUSR1 `cat /var/run/php-fpm/php-fpm.pid 2>/dev/null` 2>/dev/null || true endscript } |