关于logrotate命令的一些知识

1. 概述

       logrotate旨在简化对生成大量日志文件的系统的管理。它允许自动转储,压缩,删除和邮寄日志文件。每个日志文件都可以每天,每周,每月或当它变得太大时进行处理。
       通常,logrotate作为日常cron作业运行。除非该日志的标准基于日志的大小并且每天要多次运行logrotate,或者除非使用了-f或–force选项,否则它不会在一天内多次修改日志。
       命令行上可以提供任意数量的配置文件。更高版本的配置文件可能会覆盖早期版本文件中提供的选项,因此列出logrotate配置文件的顺序很重要。通常,应使用包含任何其他配置文件的单个配置文件。
       如果未提供命令行参数,logrotate将打印版本和版权信息以及简短的使用摘要。如果轮换日志时发生任何错误,logrotate将以非零状态退出。

2. 命令参数

-d, -‌-debug
       打开调试模式并暗含-v选项。在调试模式下,将不会对日志或logrotate状态文件进行任何更改。
-f, -‌-force
       告诉logrotate强制转储,即使它认为没有必要也是如此。在将新条目添加到logrotate配置文件后,或者如果手动删除了旧日志文件,这将很有用,因为将创建新日志文件,并且日志记录将继续正确进行。
-m, -‌-mail <command>
       告诉logrotate邮寄日志时使用哪个命令。此命令应接受两个参数:1)邮件的主题,以及2)收件人。然后,该命令必须阅读标准输入上的消息并将其邮寄给收件人。缺省的mail命令是/bin/mail -s。
-s, -‌-state <statefile>
       告诉logrotate使用备用状态文件。如果logrotate以不同的用户身份运行各种日志文件集,这将很有用。默认状态文件是/var/lib/logrotate.status。
-‌-usage
       打印简短的使用信息。
–?, -‌-help
       打印帮助消息。
-v, -‌-verbose
       打开详细模式。

3. 配置文件

3.1 概述

       logrotate从命令行上指定的一系列配置文件中读取应处理的日志文件的所有内容。每个配置文件都可以设置全局选项(本地定义覆盖全局选项,以后的定义覆盖早期的选项),并指定要转储的日志文件。一个简单的配置文件如下所示:

# sample logrotate configuration file
compress

/var/log/messages {
    rotate 5
    weekly
    postrotate
        /usr/bin/killall -HUP syslogd
    endscript
}

"/var/log/httpd/access.log" /var/log/httpd/error.log {
    rotate 5
    mail www@my.org
    size 100k
    sharedscripts
    postrotate
        /usr/bin/killall -HUP httpd
    endscript
}

/var/log/news/* {
    monthly
    rotate 2
    olddir /var/log/news/old
    missingok
    postrotate
        kill -HUP 'cat /var/run/inn.pid'
    endscript
    nocompress
}

       前几行设置全局选项;在此示例中,日志在转储后被压缩。请注意,行首出现非空白字符#表示注释。
       配置文件的下一部分定义了如何处理日志文件/var/log/messages。日志将在删除之前先经历五周的转储。转储日志文件后(但在压缩旧版本的日志之前),将执行命令/sbin/killall -HUP syslogd。
       下一节将定义/var/log/httpd/access.log和/var/log/httpd/error.log的参数。只要大小超过100k,它们就会转储一次,并且经过5次旋转后,旧日志文件会被邮寄(未压缩)到www@my.org,而不是被删除。该 sharedscripts意味着该postrotate脚本只能一次运行(旧日志已被压缩后),而不是对每个被转储的日志运行一次。请注意,在本节的开头,第一个文件名周围的双引号允许logrotate转储名称中带有空格的日志。
       最后一部分定义了/var/log/news中所有文件的参数。每个文件每月轮换一次。这被视为单个转储指令,并且如果多个文件出现错误,则不会压缩日志文件。
       请谨慎使用通配符。如果指定*,logrotate将旋转所有文件,包括先前旋转的文件。一种解决方法是使用olddir指令或更精确的通配符(例如* .log)。
注意:

  • /etc/logrotate.conf中的默认配置无法覆盖/etc/logrotate.d中的文件配置。比如,如果想让/etc/logrotate.d/test指向的日志文件转储后压缩,在/etc/logrotate.conf中配置compress是无效的,必须在/etc/logrotate.d/test中配置compress。
3.2 配置文件常用参数
  • compress 默认使用gzip进行旧版本日志文件的压缩。
  • create mode owner group 在转储之后(在运行postrotate脚本之前)立即创建日志文件(与刚刚转储的日志文件同名)。mode以八进制指定日志文件的模式(与chmod(2)相同),owner指定将拥有日志文件的用户名,group指定日志文件所属的组。可以省略任何日志文件属性,在这种情况下,新文件的这些属性将使用与原始日志文件相同的值来处理省略的属性。可以使用nocreate选项禁用此选项。
  • daily 日志文件每天转储。
  • dateext 归档日志文件的旧版本,添加每日扩展名(例如YYYYMMDD),而不是简单地添加数字。可以使用dateformat选项配置扩展名 。
  • delaycompress 将上一个日志文件的压缩推迟到下一个循环周期,即转储的日志文件到下一次转储时才压缩。仅在与compress结合使用时才有效。当无法告知某些程序关闭其日志文件并因此可能在一段时间内继续写入前一个日志文件时,可以使用它。
  • missingok 如果缺少日志文件,继续转储下一个日志而不发出错误消息。
  • notifempty 如果日志为空,则不要转储日志(这将覆盖ifempty选项)。
  • olddir directory 日志将移动到directory目录中进行转储,即转储后日志文件放入指定的目录。该directory目录必须与要转储的日志文件位于同一物理设备上,并且除非指定了绝对路径名,否则该目录假定是相对于保存日志文件的目录而言的。使用此选项时,所有旧版本的日志都将存放在directory目录中。noolddir选项可能会覆盖此选项。
  • postrotate/endscript postrotate和endscript之间的内容(这两条指令必须单独一行)在日志文件转储之后执行(使用/bin/sh)。这些指令只能出现在日志文件定义中。通常,日志文件的绝对路径作为第一个参数传递给脚本。如果指定了sharedscripts,则将整个模式传递给脚本。
  • rotate count 日志文件在被删除或邮寄指定的地址之前被转储次数。如果count为0,则删除旧版本而不是转储。
  • size size 只有当日志文件大于设定的字节时,才会对其进行转储。如果size后跟k,则假定size以kb为单位。如果使用M,则size以MB为单位;如果使用G,则size以GB为单位。所以size 100,size 100k,size 100M和size 100G都有效。
  • sharedscripts 通常,对每个循环日志运行prerotate和postrotate脚本,日志文件的绝对路径作为第一个参数传递给脚本。这意味着单个脚本可以针对与多个文件匹配的日志文件条目多次运行(例如 /var/log/news/*示例)。如果指定了sharedscripts,则无论有多少个日志与通配符模式匹配,脚本都只会运行一次,即所有日志转储之后统一运行一次指定脚本。如果不设置sharedscripts,每个日志转储后都会运行一次指定脚本。但是,如果该模式中的所有日志都不需要转储,则脚本将完全不会运行。如果脚本错误退出,则其余操作将不会对任何日志执行。
3.3 对rotate参数的理解练习

        生成/etc/logrotate.d/test文件,内容如下:

/root/test/*log {
    compress
    size 1M
    create
    dateext
    missingok
    notifempty
    sharedscripts
}

       在/root/test文件夹下生成1.log文件,准备对该文件进行转储测试

# dd bs=1MB count=1 if=/dev/zero of=/root/test/1.log
1+0 records in
1+0 records out
1000000 bytes (1.0 MB) copied, 0.00355896 s, 281 MB/s
# ll -h
total 980K
-rw-r--r-- 1 root root 977K Dec 25 00:19 1.log

       执行强制转储测试

# logrotate -f /etc/logrotate.d/test

       结果1.log依然存在,但是大小为0。这是因为如果不设置rotate,默认执行rotate 0,即删除旧日志,不进行转储。但是日志配置文件中有create,所以删除旧日志之后,又创建了同名日志。

# ll -h
total 0
-rw-r--r-- 1 root root 0 Dec 25 00:21 1.log

       添加rotate选项:

# cat /etc/logrotate.d/test 
/root/test/*log {
    compress
    size 1M
    create
    rotate 2
    dateext
    missingok
    notifempty
    sharedscripts
}

       生成测试文件并执行强制转储命令,结果如下:

# ll -h
total 4.0K
-rw-r--r-- 1 root root    0 Dec 25 00:29 1.log
-rw-r--r-- 1 root root 1003 Dec 25 00:29 1.log-20191225.gz

       使用logrotate -f时要注意,即使转储条件没有满足,我们也可以通过使用 -f 选项来强制logrotate轮循日志文件。所以,在本例中,即使设置了size 1M,也会对小于1M的日志文件进行转储。这时,应该使用-d选项。排障过程中的最佳选择是使用 -d 选项以预演方式运行logrotate。
       假设有2个日志文件,1个大于1M,1个小于1M

# ll -h
total 2.9M
-rw-r--r-- 1 root root 977K Dec 23 15:29 3.log
-rw-r--r-- 1 root root 2.0M Dec 23 15:31 4.log

       使用-d选项进行模拟转储的过程,可以看到3.log无需转储,4.log将会被转储。

# logrotate -d test 
reading config file test
reading config info for /root/test/*log 

Handling 1 logs

rotating pattern: /root/test/*log  1048576 bytes (2 rotations)
empty log files are not rotated, old logs are removed
considering log /root/test/3.log
  log does not need rotating
considering log /root/test/4.log
  log needs rotating
rotating log /root/test/4.log, log->rotateCount is 2
dateext suffix '-20191223'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
renaming /root/test/4.log to /root/test/4.log-20191223
creating new /root/test/4.log mode = 0644 uid = 0 gid = 0
compressing log with: /bin/gzip

       以上以rotate参数为例,进行了简单的练习。

参考文档

https://linux.die.net/man/8/logrotate
https://www.cnblogs.com/kevingrace/p/6307298.html
https://linux.cn/article-4126-1.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值