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

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

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

    图18.3.1、登录文件进行 logrotate 的结果

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

    不过近年来磁盘空间容量比较大了,加上管理员又担心登录文件数据真的给它不见去,因此,你可能已经发现到,最近的登录文件轮替后的文件名已经会加上日期参数, 然后源源不绝的保留在你的系统上耶~虽然这个设置是可以修订的,不过,鸟哥也真的希望保留日期的文件名延伸记录,真的比较不用担心未来要找问题时, 登录文件却已经 GG 了…

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

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

    • 将 rotate 4 改成 rotate 9 左右,以保存较多的备份文件。不过如果已经加上 dateext 的参数,那这个项目就不用更动了!
    • 大部分的登录文件不需要 compress 啰!但是空间太小就需要 compress !尤其是很占硬盘空间的 httpd 更需要 compress 的!
      好了,上面我们大致介绍了 /var/log/wtmp 这个文件的设置,现在你知道了 logrotate.conf 的设置语法是:
    1. 个别的参数设置值,如 monthly, compress 等等
    2. }

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

    在上面的语法当中,我们知道正确的 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 来进行登录文件轮替前、后所需要作的动作啊! 果真如此时,那么你可以这样修改一下这个文件喔!
    1. [root@study ~]# vim /etc/logrotate.d/syslog
    2. /var/log/cron
    3. /var/log/maillog
    4. /var/log/messages
    5. /var/log/secure
    6. /var/log/spooler
    7. {
    8. sharedscripts
    9. prerotate
    10. /usr/bin/chattr -a /var/log/messages
    11. endscript
    12. sharedscripts
    13. postrotate
    14. /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    15. /usr/bin/chattr +a /var/log/messages
    16. endscript
    17. }

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

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

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

    这说明的是 rsyslogd 重新启动的时间啦 (就是因为 /etc/logrotate.d/syslog 的设置之缘故!) 下面我们来进行一些例题的练习,让你更详细的了解 logrotate 的功用啊!

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

    • 登录文件轮替一个月进行一次;
    • 保存五个备份文件;
    • 备份文件需要压缩
      那你可以怎么样设置呢?呵呵~很简单啊!看看下面的动作吧!
    1. # 1\. 先创建 +a 这个属性啊!
    2. [root@study ~]# chattr +a /var/log/admin.log
    3. [root@study ~]# lsattr /var/log/admin.log
    4. -----a---------- /var/log/admin.log
    5. [root@study ~]# mv /var/log/admin.log /var/log/admin.log.1
    6. mv: cannot move `/var/log/admin.log' to `/var/log/admin.log.1': Operation not permitted
    7. # 这里确定了加入 a 的隐藏属性!所以 root 无法移动此登录文件!
    8. # 2\. 开始创建 logrotate 的配置文件,增加一个文件在 /etc/logrotate.d 内就对了!
    9. [root@study ~]# vim /etc/logrotate.d/admin
    10. # This configuration is from VBird 2015/08/19
    11. monthly <==每个月进行一次
    12. size=10M <==文件大小大于 10M 则开始处置
    13. rotate 5 <==保留五个!
    14. compress <==进行压缩工作!
    15. sharedscripts
    16. prerotate
    17. /usr/bin/chattr -a /var/log/admin.log
    18. endscript
    19. sharedscripts
    20. postrotate
    21. /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    22. /usr/bin/chattr +a /var/log/admin.log
    23. endscript
    24. }
    25. # 3\. 测试一下 logrotate 相关功能的信息显示:
    26. [root@study ~]# logrotate -v /etc/logrotate.conf
    27. ....(前面省略)....
    28. rotating pattern: /var/log/admin.log 10485760 Bytes (5 rotations)
    29. empty log files are rotated, old logs are removed
    30. considering log /var/log/admin.log
    31. log does not need rotating
    32. not running prerotate script, since no logs will be rotated
    33. ....(下面省略)....
    34. # 因为还不足一个月,文件也没有大于 10M,所以不需进行轮替!
    35. # 4\. 测试一下强制 logrotate 与相关功能的信息显示:
    36. [root@study ~]# logrotate -vf /etc/logrotate.d/admin
    37. reading config file /etc/logrotate.d/admin
    38. Handling 1 logs
    39. rotating pattern: /var/log/admin.log forced from command line (5 rotations)
    40. empty log files are rotated, old logs are removed
    41. considering log /var/log/admin.log
    42. log needs rotating
    43. rotating log /var/log/admin.log, log->rotateCount is 5
    44. dateext suffix '-20150820'
    45. glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
    46. renaming /var/log/admin.log.5.gz to /var/log/admin.log.6.gz (rotatecount 5, logstart 1, i 5),
    47. old log /var/log/admin.log.5.gz does not exist
    48. renaming /var/log/admin.log.4.gz to /var/log/admin.log.5.gz (rotatecount 5, logstart 1, i 4),
    49. old log /var/log/admin.log.4.gz does not exist
    50. renaming /var/log/admin.log.3.gz to /var/log/admin.log.4.gz (rotatecount 5, logstart 1, i 3),
    51. old log /var/log/admin.log.3.gz does not exist
    52. renaming /var/log/admin.log.2.gz to /var/log/admin.log.3.gz (rotatecount 5, logstart 1, i 2),
    53. old log /var/log/admin.log.2.gz does not exist
    54. renaming /var/log/admin.log.1.gz to /var/log/admin.log.2.gz (rotatecount 5, logstart 1, i 1),
    55. old log /var/log/admin.log.1.gz does not exist
    56. renaming /var/log/admin.log.0.gz to /var/log/admin.log.1.gz (rotatecount 5, logstart 1, i 0),
    57. old log /var/log/admin.log.0.gz does not exist
    58. log /var/log/admin.log.6.gz doesn't exist -- won't try to dispose of it
    59. running prerotate script
    60. fscreate context set to system_u:object_r:var_log_t:s0
    61. renaming /var/log/admin.log to /var/log/admin.log.1
    62. running postrotate script
    63. compressing log with: /bin/gzip
    64. [root@study ~]# lsattr /var/log/admin.log*
    65. ---------------- /var/log/admin.log.1.gz <==有压缩过喔!

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

    原文: https://wizardforcel.gitbooks.io/vbird-linux-basic-4e/content/159.html