第十九章 登录文件的轮替(logrotate)

   假设我们已经将登录数据写入了记录档中了,也已经利用 chattr 配置了 +a 这个属性了,那么该如何进行 logrotate 的工作呢?这里请特别留意的是:『syslog 利用的是 daemon 的方式来启动的, 当有需求的时候立刻就会被运行的,但是 logrotate 却是在规定的时间到了之后才来进行登录文件的轮替, 所以这个 logrotate 程序当然就是挂在 cron 底下进行的呦!』 仔细看一下 /etc/cron.daily/ 里面的文件,嘿嘿~看到了吧! /etc/cron.daily/logrotate 就是记录了每天要进行的登录文件轮替的行为啦! ^_^!底下我们就来谈一谈怎么样设计这个 logrotate 吧!

logrotate 的配置档

既然 logrotate 主要是针对登录文件来进行轮替的动作,所以罗,他当然必须要记载 『 在什么状态下才将登录文件进行轮替』的配置啊!那么 logrotate 这个程序的参数配置档在哪里呢?呵呵!那就是:

/etc/logrotate.conf
/etc/logrotate.d/

那个 logrotate.conf 才是主要的参数文件,至於 logrotate.d 是一个目录, 该目录里面的所有文件都会被主动的读入 /etc/logrotate.conf 当中来进行!另外, 在 /etc/logrotate.d/ 里面的文件中,如果没有规定到的一些细部配置,则以 /etc/logrotate.conf 这个文件的规定来指定为默认值!

好了,刚刚我们提到 logrotate 的主要功能就是将旧的登录文件移动成旧档, 并且重新创建一个新的空的文件来记录,他的运行结果有点类似底下的图示:

tu

由上面的图示我们可以清楚的知道,当第一次运行完 rotate 之后,原本的 messages 会变成 messages.1 而且会制造一个空的 messages 给系统来储存登录文件。而第二次运行之后,则 messages.1 会变成 messages.2 而 messages 会变成 messages.1 ,又造成一个空的 messages 来储存登录文件!那么如果我们仅配置保留三个登录文件而已的话,那么运行第四次时,则 messages.3 这个文件就会被删除,并由后面的较新的保存登录文件所取代!基本的工作就是这样啦!

那么多久进行一次这样的 logrotate 工作呢? 这些都记录在 logrotate.conf里面,我们来看一下默认的 logrotate 的内容吧!

[root@www ~]# vim /etc/logrotate.conf
# 底下的配置是 "logrotate 的默认配置值" ,如果个别的文件配置了其他的参数,
# 则将以个别的文件配置为主,若该文件没有配置到的参数则以这个文件的内容为默认值!

weekly    <==默认每个礼拜对登录文件进行一次 rotate 的工作
rotate 4  <==保留几个登录文件呢?默认是保留四个!
create    <==由於登录文件被更名,因此创建一个新的来继续储存之意!
#compress <==被更动的登录文件是否需要压缩?如果登录文件太大则可考虑此参数启动

include /etc/logrotate.d
# 将 /etc/logrotate.d/ 这个目录中的所有文件都读进来运行 rotate 的工作!

/var/log/wtmp {       <==仅针对 /var/log/wtmp 所配置的参数
    monthly           <==每个月一次,取代每周!
    minsize 1M        <==文件容量一定要超过 1M 后才进行 rotate (略过时间参数)
    create 0664 root utmp <==指定新建文件的权限与所属帐号/群组
    rotate 1          <==仅保留一个,亦即仅有 wtmp.1 保留而已。
}
# 这个 wtmp 可记录登陆者与系统重新启动时的时间与来源主机及登陆期间的时间。
# 由於具有 minsize 的参数,因此不见得每个月一定会进行一次喔!要看文件容量。
# 由於仅保留一个登录文件而已,不满意的话可以将他改成 rotate 5 吧!


由这个文件的配置我们可以知道 /etc/logrotate.d 其实就是由 /etc/logrotate.conf 所规划出来的目录, 所以,其实我们可以将所有的数据都给他写入 /etc/logrotate.conf 即可,但是这样一来这个文件就实在是太复杂了,尤其是当我们使用很多的服务在系统上面时, 每个服务都要去修改 /etc/logrotate.conf 的配置也似乎不太合理~ 所以,如果独立出来一个目录,那么每个以 RPM 打包方式所创建的服务的登录文件轮替配置, 就可以独自成为一个文件,并且放置到 /etc/logrotate.d/ 当中即可,真是方便又合理的做法啊! ^_^

一般来说,这个 /etc/logrotate.conf 是『默认的轮替状态』而已, 我们的各个服务都可以拥有自己的登录文件轮替配置,你也可以自行修改成自己喜欢的样式啊! 例如,如果你的系统的空间够大,并且担心除错以及黑客的问题,那么可以:

将 rotate 4 改成 rotate 9 左右,以保存较多的备份文件;
大部分的登录文件不需要 compress 罗!但是空间太小就需要 compress !尤其是很占磁盘空间的 httpd 更需要 compress 的!
好了,上面我们大致介绍了 /var/log/wtmp 这个文件的配置,现在你知道了 logrotate.conf 的配置语法是:

登录文件的绝对路径档名 ... {
	个别的参数配置值,如 monthly, compress 等等
}


底下我们再以 /etc/logrotate.d/syslog 这个轮替 syslog 服务的文件,来看看该如何配置他的 rotate 呢?

[root@www ~]# vi /etc/logrotate.d/syslog
/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler \
/var/log/boot.log /var/log/cron {
  sharedscripts
  postrotate
    /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
  endscript
}


在上面的语法当中,我们知道正确的 logrotate 的写法为:

档名:被处理的登录文件绝对路径档名写在前面,可以使用空白字节分隔多个登录文件;
参数:上述档名进行轮替的参数使用 { } 包括起来;
运行脚本:可呼叫外部命令来进行额外的命令下达,这个配置需与 sharedscripts .... endscript 配置合用才行。至於可用的环境为:
prerotate:在启动 logrotate 之前进行的命令,例如修改登录文件的属性等动作;
postrotate:在做完 logrotate 之后启动的命令,例如重新启动 (kill -HUP) 某个服务!
Prerotate 与 postrotate 对於已加上特殊属性的文件处理上面,是相当重要的运行程序!
那么 /etc/logrotate.d/syslog 内配置的六个文件的轮替功能就变成了:

该配置只对 /var/log/ 内的 messages, secure, maillog, spooler, boot.log, cron 有效;
登录文件轮替每周一次、保留四个、且轮替下来的登录文件不进行压缩(未更改默认值);
轮替完毕后 (postrotate) 取得 syslog 的 PID 后,以 kill -HUP 重新启动 syslogd
假设我们有针对 /var/log/messages 这个文件添加 chattr +a 的属性时, 依据 logrotate 的工作原理,我们知道,这个 /var/log/messages 将会被更名成为 /var/log/messages.1 才是。但是由於加上这个 +a 的参数啊,所以更名是不可能成功的! 那怎么办呢?呵呵!就利用 prerotate 与 postrotate 来进行登录文件轮替前、后所需要作的动作啊! 果真如此时,那么你可以这样修改一下这个文件喔!

[root@www ~]# vi /etc/logrotate.d/syslog
/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler \
/var/log/boot.log /var/log/cron {
  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
    /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
    /usr/bin/chattr +a /var/log/messages
  endscript
}


看到否?就是先给他去掉 a 这个属性,让登录文件 /var/log/messages 可以进行轮替的动作, 然后运行了轮替之后,再给他加入这个属性!请特别留意的是,那个 /bin/kill -HUP ... 的意义,这一行的目的在於将系统的 syslogd 重新以其参数档 (syslog.conf) 的数据读入一次!也可以想成是 reload 的意思啦! 由於我们创建了一个新的空的纪录档,如果不运行此一行来重新启动服务的话, 那么记录的时候将会发生错误呦!(请回到第十七章读一下 kill 后面的 signal 的内容说明)

实际测试 logrotate 的动作

好了,配置完成之后,我们来测试看看这样的配置是否可行呢?给他运行底下的命令:

[root@www ~]# logrotate [-vf] logfile
选项与参数:
-v  :启动显示模式,会显示 logrotate 运行的过程喔!
-f  :不论是否符合配置档的数据,强制每个登录文件都进行 rotate 的动作!

范例一:运行一次 logrotate 看看整个流程为何?
[root@www ~]# logrotate -v /etc/logrotate.conf
reading config file /etc/logrotate.conf <==读取主要配置档
including /etc/logrotate.d              <==呼叫外部的配置
reading config file acpid               <==就是外部配置啊!
....(中间省略)....
Handling 21 logs                        <==共有 21 个登录文件被记录
....(中间省略)....
rotating pattern: /var/log/messages /var/log/secure /var/log/maillog \
/var/log/spooler /var/log/boot.log /var/log/cron  weekly (4 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/messages       <==开始处理 messages
  log does not need rotating            <==因为时间未到,不需要更动!
....(底下省略)....

范例二:强制进行 logrotate 的动作
[root@www ~]# logrotate -vf /etc/logrotate.conf
....(前面省略)....
rotating log /var/log/messages, log->rotateCount is 4
renaming /var/log/messages.4 to /var/log/messages.5 (rotatecount 4, logstart 1, i 4),
renaming /var/log/messages.3 to /var/log/messages.4 (rotatecount 4, logstart 1, i 3),
renaming /var/log/messages.2 to /var/log/messages.3 (rotatecount 4, logstart 1, i 2),
renaming /var/log/messages.1 to /var/log/messages.2 (rotatecount 4, logstart 1, i 1),
renaming /var/log/messages.0 to /var/log/messages.1 (rotatecount 4, logstart 1, i 0),
old log /var/log/messages.0 does not exist
....(底下省略)....
# 看到否?整个 rotate 的动作就是这样一步一步进行的~

[root@www ~]# ll /var/log/messages*; lsattr /var/log/messages
-rw------- 1 root root    63 Apr  8 15:19 /var/log/messages
-rw------- 1 root root   670 Apr  8 14:22 /var/log/messages.1
-rw------- 1 root root 24984 Apr  1 19:26 /var/log/messages.2
-rw------- 1 root root  1911 Mar 28 11:32 /var/log/messages.3
-rw------- 1 root root 25193 Mar 22 04:02 /var/log/messages.4
-----a------- /var/log/messages <==主动加入 a 的隐藏属性罗!


上面那个 -f 具有『强制运行』的意思,如果一切的配置都没有问题的话,那么理论上,你的 /var/log 这个目录就会起变化罗!而且应该不会出现错误信息才对!嘿嘿!这样就 OK 了!很棒不是吗?!

由於 logrotate 的工作已经加入 crontab 里头了!所以现在每天系统都会自动的给他查看 logrotate 罗!不用担心的啦!只是要注意一下那个 /var/log/messages 里头是否常常有类似底下的字眼:

Apr 8 15:19:47 www syslogd 1.4.1: restart (remote reception).
这说明的是 syslogd 重新启动的时间啦 (就是因为 /etc/logrotate.d/syslog 的配置之缘故!) 底下我们来进行一些例题的练习,让你更详细的了解 logrotate 的功用啊!

自订登录文件的轮替功能

假设前提是这样的,前一小节当中,假设你已经创建了 /var/log/admin.log 这个文件, 现在,你想要将该文件加上 +a 这个隐藏标签,而且配置底下的相关资讯:

登录文件轮替一个月进行一次;
该登录文件若大於 10MB 时,则主动进行轮替,不需要考虑一个月的期限;
保存五个备份文件;
备份文件需要压缩

那你可以怎么样配置呢?呵呵~很简单啊!看看底下的动作吧!

# 1. 先创建 +a 这个属性啊!
[root@www ~]# chattr +a /var/log/admin.log
[root@www ~]# lsattr /var/log/admin.log
-----a------- /var/log/admin.log
[root@www ~]# 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@www ~]# vi /etc/logrotate.d/admin
# This configuration is from VBird 2009/04/08
/var/log/admin.log {
        monthly   <==每个月进行一次
        size=10M  <==文件容量大於 10M 则开始处置
        rotate 5  <==保留五个!
        compress  <==进行压缩工作!
        sharedscripts
        prerotate
                /usr/bin/chattr -a /var/log/admin.log
        endscript
        sharedscripts
        postrotate
                /usr/bin/killall -HUP syslogd
                /usr/bin/chattr +a /var/log/admin.log
        endscript
}

# 3. 测试一下 logrotate 相关功能的资讯显示:
[root@www ~]# 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@www ~]# logrotate -vf /etc/logrotate.d/admin
reading config file /etc/logrotate.d/admin
reading config info for /var/log/admin.log

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
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
renaming /var/log/admin.log to /var/log/admin.log.1
running postrotate script
compressing log with: /bin/gzip


[root@www ~]# lsattr /var/log/admin.log*
-----a------- /var/log/admin.log
------------- /var/log/admin.log.1.gz  <==有压缩过喔!


看到了吗?透过这个方式,我们可以创建起属於自己的 logrotate 配置文件, 很简便吧!尤其是要注意的, /etc/syslog.conf 与 /etc/logrotate.d/* 文件常常要搭配起来,例如刚刚我们提到的两个案例中所创建的 /var/log/admin.log 就是一个很好的例子~创建后,还要使用 logrotate 来轮替啊! ^_^

转自: http://vbird.dic.ksu.edu.tw/linux_basic/0570syslog_3.php

你可能感兴趣的:(log)