rsyslogd 利用的是 daemon 的方式来启动的, 当有需求的时候立刻就会被执行的,但是 logrotate 却是在规定的时间到了之后才来进行登录档的轮 替, 所以这个 logrotate 程序当然就是挂在 cron 底下进行的呦!仔细看一下 /etc/cron.daily/ 里面 的文件,嘿嘿~看到了吧! /etc/cron.daily/logrotate 就是记录了每天要进行的登录档轮替的行为啦!
logrotate 的配置文件
既然 logrotate 主要是针对登录档来进行轮替的动作,所以啰,他当然必须要记载『 在什么状态下才 将登录档进行轮替』的设定啊!那么 logrotate 这个程序的参数配置文件在哪里呢?呵呵!那就是:
- /etc/logrotate.conf
- /etc/logrotate.d/
那个 logrotate.conf 才是主要的参数文件,至于 logrotate.d 是一个目录, 该目录里面的所有文件都 会被主动的读入 /etc/logrotate.conf 当中来进行!在 /etc/logrotate.d/ 里面的文件中,如果没有 规定到的一些细部设定,则以 /etc/logrotate.conf 这个文件的规定来指定为默认值!
好了,刚刚我们提到 logrotate 的主要功能就是将旧的登录文件移动成旧档, 并且重新建立一个新的 空的文件来记录,他的执行结果有点类似底下的图示:
由上面的图示我们可以清楚的知道,当第一次执行完 rotate 之后,原本的 messages 会变成 messages.1 而且会制造一个空的 messages 给系统来储存登录文件。而第二次执行之后,则 messages.1 会变成 messages.2 而 messages 会变成 messages.1 ,又造成一个空的 messages 来储存 登录档!那么如果我们仅设定保留三个登录档而已的话,那么执行第四次时,则 messages.3 这个文 件就会被删除,并由后面的较新的保存登录档所取代!
那么多久进行一次这样的 logrotate 工作呢?这些都记录在 logrotate.conf 里面,我们来看一下预设 的 logrotate 的内容吧!
[root@study ~]# vim /etc/logrotate.conf
# 底下的设定是 "logrotate 的预设设定值" ,如果个别的文件设定了其他的参数,
# 则将以个别的文件设定为主,若该文件没有设定到的参数则以这个文件的内容为默认值!
weekly <==预设每个礼拜对登录档进行一次 rotate 的工作
rotate 4 <==保留几个登录档呢?预设是保留四个!
create <==由于登录档被更名,因此建立一个新的来继续储存之意!
dateext <==就是这个设定值!可以让被轮替的文件名加上日期作为档名喔!
#compress <==被更动的登录档是否需要压缩?如果登录档太大则可考虑此参数启动
include /etc/logrotate.d
# 将 /etc/logrotate.d/ 这个目录中的所有文件都读进来执行 rotate 的工作!
/var/log/wtmp { <==仅针对 /var/log/wtmp 所设定的参数
monthly <==每个月一次,取代每周!
create 0664 root utmp <==指定新建文件的权限与所属账号/群组
minsize 1M <==文件容量一定要超过 1M 后才进行 rotate (略过时间参数)
rotate 1 <==仅保留一个,亦即仅有 wtmp.1 保留而已。
}
# 这个 wtmp 可记录登入者与系统重新启动时的时间与来源主机及登入期间的时间。
# 由于具有 minsize 的参数,因此不见得每个月一定会进行一次喔!要看文件容量。
# 由于仅保留一个登录档而已,不满意的话可以将他改成 rotate 5 吧!
那么每个以 RPM 打包方式所建立的服务 的登录档轮替设定, 就可以独自成为一个文件,并且放置到 /etc/logrotate.d/ 当中即可,真是方便又合理的做法啊!
一般来说,这个 /etc/logrotate.conf 是『预设的轮替状态』而已, 我们的各个服务都可以拥有自己的 登录档轮替设定,你也可以自行修改成自己喜欢的样式啊! 例如,如果你的系统的空间够大,并且 担心除错以及黑客的问题,那么可以:
- 将 rotate 4 改成 rotate 9 左右,以保存较多的备份文件。不过如果已经加上 dateext 的参数,那这个项目 就不用更动了!
- 大部分的登录档不需要 compress 啰!但是空间太小就需要 compress !尤其是很占硬盘空间的 httpd 更需 要 compress 的!
好了,上面我们大致介绍了 /var/log/wtmp 这个文件的设定,现在你知道了 logrotate.conf 的设定语法是:
登录文件的绝对路径文件名 ... {
个别的参数设定值,如 monthly, compress 等等
}
底下我们再以 /etc/logrotate.d/syslog 这个轮替 rsyslog.service 服务的文件,来看看该如何设定他的 rotate 呢?
[root@study ~]# vim /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
在上面的语法当中,我们知道正确的 logrotate 的写法为:
- 檔名:被处理的登录文件绝对路径文件名写在前面,可以使用空格符分隔多个登录档;
- 参数:上述档名进行轮替的参数使用 { } 包括起来;
- 执行脚本:可呼叫外部指令来进行额外的命令下达,这个设定需与 sharedscripts .... endscript 设定合用才行。
- 至于可用的环境为:
- prerotate:在启动 logrotate 之前进行的指令,例如修改登录文件的属性等动作;
- postrotate:在做完 logrotate 之后启动的指令,例如重新启动 (kill -HUP) 某个服务!
- Prerotate 与 postrotate 对于已加上特殊属性的文件处理上面,是相当重要的执行程序!
那么 /etc/logrotate.d/syslog 内设定的 5 个文件的轮替功能就变成了:
- 该设定只对 /var/log/ 内的 cron, maillog, messages, secure, spooler 有效;
- 登录档轮替每周一次、保留四个、且轮替下来的登录档不进行压缩(未更改默认值);
- 轮替完毕后 (postrotate) 取得 syslog 的 PID 后,以 kill -HUP 重新启动 syslogd
假设我们有针对 /var/log/messages 这个文件增加 chattr +a 的属性时, 依据 logrotate 的工作原理, 我们知道,这个 /var/log/messages 将会被更名成为 /var/log/messages.1 才是。但是由于加上这个 +a 的参数啊,所以更名是不可能成功的! 那怎么办呢?呵呵!就利用 prerotate 与 postrotate 来进行登 录档轮替前、后所需要作的动作啊!
[root@study ~]# vim /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
sharedscripts
prerotate
/usr/bin/chattr -a /var/log/messages
endscript
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
/usr/bin/chattr +a /var/log/messages
endscript
}
实际测试 logrotate 的动作
好了,设定完成之后,我们来测试看看这样的设定是否可行呢?给他执行底下的指令:
[root@study ~]# logrotate [-vf] logfile
选项与参数:
-v :启动显示模式,会显示 logrotate 运作的过程喔!
-f :不论是否符合配置文件的数据,强制每个登录档都进行 rotate 的动作!
范例一:执行一次 logrotate 看看整个流程为何?
[root@study ~]# logrotate -v /etc/logrotate.conf
reading config file /etc/logrotate.conf <==读取主要配置文件
including /etc/logrotate.d <==呼叫外部的设定
reading config file chrony <==就是外部设定啊!
....(中間省略)....
Handling 18 logs <==共有 18 个登录文件被记录
....(中間省略)....
rotating pattern: /var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
weekly (52 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/cron
log does not need rotating
considering log /var/log/maillog
log does not need rotating
considering log /var/log/messages <==开始处理 messages
log does not need rotating <==因为时间未到,不需要更动!
....(底下省略)....
范例二:强制进行 logrotate 的动作
[root@study ~]# logrotate -vf /etc/logrotate.conf
....(前面省略)....
rotating log /var/log/messages, log->rotateCount is 52
dateext suffix '-20150820'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
compressing log with: /bin/gzip
....(底下省略)....
# 看到否?整个 rotate 的动作就是这样一步一步进行的~
[root@study ~]# ll /var/log/messages*; lsattr /var/log/messages
-rw-------. 1 root root 143 Aug 20 01:45 /var/log/messages
-rw-------. 1 root root 167125 Aug 20 01:40 /var/log/messages-20150820
-----a---------- /var/log/messages <==主动加入 a 的隐藏属性啰!
由于 logrotate 的工作已经加入 crontab 里头了!所以现在每天系统都会自动的给他查看 logrotate 啰! 不用担心的啦!只是要注意一下那个 /var/log/messages 里头是否常常有类似底下的字眼:
Aug 20 01:45:34 study rsyslogd: [origin software="rsyslogd" swVersion="7.4.7" x-pid="2145" x-info="http://www.rsyslog.com"] rsyslogd was HUPed
这说明的是 rsyslogd 重新启动的时间。
自定义登录文件的轮替功能
假设前提是这样的,前一小节当中,假设你已经建立了 /var/log/admin.log 这个文件, 现在,你想要 将该文件加上 +a 这个隐藏标签,而且设定底下的相关信息:
- 登录档轮替一个月进行一次;
- 该登录档若大于 10MB 时,则主动进行轮替,不需要考虑一个月的期限;
- 保存五个备份文件;
- 备份文件需要压缩
# 1. 先建立 +a 这个属性啊!
[root@study ~]# chattr +a /var/log/admin.log
[root@study ~]# lsattr /var/log/admin.log
-----a---------- /var/log/admin.log
[root@study ~]# mv /var/log/admin.log /var/log/admin.log.1
mv: cannot move `/var/log/admin.log' to `/var/log/admin.log.1': Operation not permitted
# 这里确定了加入 a 的隐藏属性!所以 root 无法移动此登录档!
# 2. 开始建立 logrotate 的配置文件,增加一个文件在 /etc/logrotate.d 内就对了!
[root@study ~]# vim /etc/logrotate.d/admin
# This configuration is from VBird 2015/08/19
/var/log/admin.log {
monthly <==每个月进行一次
size=10M <==文件容量大于 10M 则开始处置
rotate 5 <==保留五个!
compress <==进行压缩工作!
sharedscripts
prerotate
/usr/bin/chattr -a /var/log/admin.log
endscript
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
/usr/bin/chattr +a /var/log/admin.log
endscript
}
# 3. 测试一下 logrotate 相关功能的信息显示:
# 3. 測試一下 logrotate 相關功能的資訊顯示:
[root@study ~]# logrotate -v /etc/logrotate.conf
....(前面省略)....
rotating pattern: /var/log/admin.log 10485760 bytes (5 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/admin.log
log does not need rotating
not running prerotate script, since no logs will be rotated
not running postrotate script, since no logs were rotated
....(底下省略)....
# 因为还不足一个月,文件也没有大于 10M,所以不需进行轮替!
# 4. 测试一下强制 logrotate 与相关功能的信息显示:
[root@study ~]# logrotate -vf /etc/logrotate.d/admin
reading config file /etc/logrotate.d/admin
reading config file /etc/logrotate.d/admin
Handling 1 logs
rotating pattern: /var/log/admin.log forced from command line (5 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/admin.log
log needs rotating
rotating log /var/log/admin.log, log->rotateCount is 5
dateext suffix '-20150820'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
renaming /var/log/admin.log.5.gz to /var/log/admin.log.6.gz (rotatecount 5, logstart 1, i 5),
old log /var/log/admin.log.5.gz does not exist
renaming /var/log/admin.log.4.gz to /var/log/admin.log.5.gz (rotatecount 5, logstart 1, i 4),
old log /var/log/admin.log.4.gz does not exist
renaming /var/log/admin.log.3.gz to /var/log/admin.log.4.gz (rotatecount 5, logstart 1, i 3),
old log /var/log/admin.log.3.gz does not exist
renaming /var/log/admin.log.2.gz to /var/log/admin.log.3.gz (rotatecount 5, logstart 1, i 2),
old log /var/log/admin.log.2.gz does not exist
renaming /var/log/admin.log.1.gz to /var/log/admin.log.2.gz (rotatecount 5, logstart 1, i 1),
old log /var/log/admin.log.1.gz does not exist
renaming /var/log/admin.log.0.gz to /var/log/admin.log.1.gz (rotatecount 5, logstart 1, i 0),
old log /var/log/admin.log.0.gz does not exist
log /var/log/admin.log.6.gz doesn't exist -- won't try to dispose of it
running prerotate script
fscreate context set to system_u:object_r:var_log_t:s0
renaming /var/log/admin.log to /var/log/admin.log.1
running postrotate script
compressing log with: /bin/gzip
[root@study ~]# lsattr /var/log/admin.log*
-----a---------- /var/log/admin.log
---------------- /var/log/admin.log.1.gz <==有压缩过喔!