日志就像程序的生命记录仪,详细记录下了程序运行的点点滴滴。
记录哪些日志需要你在编写应用程序慎重决定,本文讲述如何使用linux自带的logrotate程序来精心组织我们可爱的日志文件。
日志,实际就是本文文件,且是个内容不断在增长的文件。处理通常就是按天或者按大小来备份、压缩或转储,非常简单。
/var/log/messages
是大家熟悉的系统日志存放位置。如果该文件内容增长特别快,几天可能就撑满了整个硬盘,那么对该文件的备份、压缩或转储就显得尤为重要。
手动怎么处理呢?可能是:
Logrotate实际就是起着上述脚本作用的小工具,他通过让用户来配置规则的方式,检测和处理日志文件。配合Cron可让处理定时化;
Logrotate预制了大量判断条件和处理方式,可大大降低手写脚本的负担和出错的可能;
Logrorate检测日志文件属性,比对用户配置好的检测条件,对满足条件的再根据用户配置的要求来处理,整个可以通过Cron来定时调度,这其实是非常经典的Linux解决问题的思路,可以好好静下心来品味下,简单,好用。
以下是logrotate运行的关键点:
/usr/bin/logrotate
程序所在位置;/etc/cron.daily/logrotate
默认让Cron每天执行logrotate一次;/etc/logrotate.conf
全局配置文件;/etc/logrotate.d
应用自个的配置文件存放目录,覆盖全局配置;/etc/logrotate.conf
# cat /etc/logrotate.conf# see "man logrotate" for details# rotate log files weeklyweekly# keep 4 weeks worth of backlogsrotate 4# create new (empty) log files after rotating old onescreate# use date as a suffix of the rotated file# dateext# uncomment this if you want your log files comPRessed#compress# RPM packages drop log rotation information into this directoryinclude /etc/logrotate.d# no packages own wtmp and btmp -- we'll rotate them here/var/log/wtmp { monthly create 0664 root utmp minsize 1M rotate 1}/var/log/btmp { missingok monthly create 0600 root utmp rotate 1}# system-specific logs may be also be configured here.
查看全局配置文件cat /etc/logrotate.conf
,可以发现#
是行注释,配置项都是以关键字形式出现(那么想知道每个关键字的作用,最简单的就是直接man查看了)。
仔细看下每个关键字的注释,不难发现,比如:
/etc/logrotate.d
目录,或者直接放在全局配置里面。于是当logrotate
程序被执行时,按照字面意思logrotate
默认是想每周处理下日志,对日志最多轮转保留4份,处理方式是不压缩也不加时间戳,处理完后再生成个同名文件。当然这些是默认设置,还对wtmp和btmp日志处理做了单独要求并且include /etc/logrotate.d
目录下还有一大堆处理要求。该目录下配置文件,在logrotate
被执行后,都会不一个个读取来执行。
/etc/logrotate.d/
# ls /etc/logrotate.d/cups debug dracut httpd iptraf MySQLd ppp psacct sssd subscription-manager syslog tomcat6 up2date vsftpd wpa_supplicant yum
例如查看下sssd
配置文件的内容:
# cat /etc/logrotate.d/sssd/var/log/sssd/*.log { weekly missingok notifempty sharedscripts rotate 2 compress postrotate /bin/kill -HUP `cat /var/run/sssd.pid 2>/dev/null` 2> /dev/null || true endscript}
可以发现基本格式与全局配置文件/etc/logrotate.conf
一致,不难想象单独为某个日志配置的要求优先级肯定更高,如果与全局配置中出现相同项目的配置,单独的肯定覆盖全局的。
/etc/cron.daily/logrotate
配置文件都指定完毕,logrotate可单独执行了,当然也可以通过cron来定时执行;
# cat /etc/cron.daily/logrotate#!/bin/sh/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1EXITVALUE=$?if [ $EXITVALUE != 0 ]; then /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"fiexit 0
默认的logrotate已经放在/etc/cron.daily/logrotate
目录,很明显是让cron每天执行一次logrotate程序;
当然你也可以将该脚本放到其他时间,比如每分钟执行,甚至可以单独写crontab表达式来让logrotate指定配置文件和指定时间执行;
至此,我们看过了logrotate的全局配置文件,单独配置文件,已经如何配合cront来定时执行。
为了加深记忆,我们先小结下:
man过logrotate的同学大概知道logrotate该怎么用了,常见的选项使用如下:
# 1. 调试 (d = debug)参数为配置文件,不指定则执行全局配置文件logrotate -d /etc/logrotate.d/test.conf# 2. 强制执行(-f = force),可以配合-v(-v =verbose)使用,注意调试信息默认携带-v;logrotate -v -f /etc/logrotate.d/test.conf
本例通过自定义配置文件来压缩指定日志文件来测试logrotate的使用。
注意logrotate都是需要使用root来执行的,(但是可以通过配置项来指定生成的日志文件为普通用户的)。
# 1. 生成一个日志文件man ps > test.logll -h test.log-rw-r--r-- 1 root root 54K Sep 6 11:36 test.log# 2. 编写对该日志文件如何处理的logrotate配置文件cat /etc/logrotate.d/test.conf/var/log/test.log {compressrotate 4size 30kcreate 0600 root root}# 3. 调试是否可以按照配置文件要求生成压缩文件logrotate -d /etc/logrotate.d/test.confreading config file /etc/logrotate.d/test.confreading config info for /var/log/test.logHandling 1 logsrotating pattern: /var/log/test.log 30720 bytes (4 rotations)empty log files are rotated, old logs are removedconsidering log /var/log/test.log log needs rotatingrotating log /var/log/test.log, log->rotateCount is 4dateext suffix '-20150906'glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'renaming /var/log/test.log.4.gz to /var/log/test.log.5.gz (rotatecount 4, logstart 1, i 4),renaming /var/log/test.log.3.gz to /var/log/test.log.4.gz (rotatecount 4, logstart 1, i 3),renaming /var/log/test.log.2.gz to /var/log/test.log.3.gz (rotatecount 4, logstart 1, i 2),renaming /var/log/test.log.1.gz to /var/log/test.log.2.gz (rotatecount 4, logstart 1, i 1),renaming /var/log/test.log.0.gz to /var/log/test.log.1.gz (rotatecount 4, logstart 1, i 0),renaming /var/log/test.log to /var/log/test.log.1creating new /var/log/test.log mode = 0600 uid = 0 gid = 0compressing log with: /bin/gzipremoving old log /var/log/test.log.5.gzerror: error opening /var/log/test.log.5.gz: No such file or directory# 4. 调试结果正常,实际测试下logrotate -f /etc/logrotate.d/test.confll -h test.log*-rw------- 1 root root 0 Sep 6 11:44 test.log-rw-r--r-- 1 root root 14K Sep 6 11:44 test.log.1.gz
测试正常;
以上logrotate -f /etc/logrotate.d/test.conf
指令完全可以写入crontab中,按照要求时间来执行,此处暂时不拆开讲了。
我们从上述debug信息中,摘录轮转部分的日志来理解下,什么叫轮转。
rotating log /var/log/test.log, log->rotateCount is 4renaming /var/log/test.log.4.gz to /var/log/test.log.5.gz (rotatecount 4, logstart 1, i 4),renaming /var/log/test.log.3.gz to /var/log/test.log.4.gz (rotatecount 4, logstart 1, i 3),renaming /var/log/test.log.2.gz to /var/log/test.log.3.gz (rotatecount 4, logstart 1, i 2),renaming /var/log/test.log.1.gz to /var/log/test.log.2.gz (rotatecount 4, logstart 1, i 1),renaming /var/log/test.log.0.gz to /var/log/test.log.1.gz (rotatecount 4, logstart 1, i 0),renaming /var/log/test.log to /var/log/test.log.1emoving old log /var/log/test.log.5.gzerror: error opening /var/log/test.log.5.gz: No such file or directory
根据配置文件要求,轮转4份;
以伪代码在简写上述日志为:
rotateCount=4mv 4 5mv 3 4mv 2 3mv 1 2rm 5
这就很容易理解了,所谓轮转,就是类似二级制向右位移一样不断的重命名;
在弄清楚logrotate的运作机制,又实地测试一番后,以下将通过多个例子方式来让大家快速配置。
copytruncate的作用在于先复制一份当前日志文件用做处理,再清空源日志文件,让其继续接收日志。
当然在复制和清空的空隙可能会有若干
$ cat logrotate.conf /tmp/output.log { size 1k copytruncate create 700 bala bala rotate 4 compress }
摘自参考3;
postrotate和endscript中间可以编写自定义脚本,用来对日志或者其他其定义处理,扩展性非常强;
例如由于logrotate对压缩日志可指定的时间戳只能到天,于是可以再自定义脚本里面对文件做时分等细化命名;
$ cat logrotate.conf /tmp/output.log { size 1k copytruncate rotate 4 compress postrotate /home/bala/myscript.sh endscript }
摘自参考3;
默认压缩程序使用.gz
,当然可以自定义,需要制定压缩程序和后缀名;
$ cat logrotate.conf /tmp/output.log { size 1k copytruncate create compress compresscmd /bin/bzip2 compressext .bz2 rotate 4 }
新闻热点
疑难解答