logrotate旨在简化对生成大量日志文件的系统的管理。它允许自动转储,压缩,删除和邮寄日志文件。每个日志文件都可以每天,每周,每月或当它变得太大时进行处理。
通常,logrotate作为日常cron作业运行。除非该日志的标准基于日志的大小并且每天要多次运行logrotate,或者除非使用了-f或–force选项,否则它不会在一天内多次修改日志。
命令行上可以提供任意数量的配置文件。更高版本的配置文件可能会覆盖早期版本文件中提供的选项,因此列出logrotate配置文件的顺序很重要。通常,应使用包含任何其他配置文件的单个配置文件。
如果未提供命令行参数,logrotate将打印版本和版权信息以及简短的使用摘要。如果轮换日志时发生任何错误,logrotate将以非零状态退出。
-d, --debug
打开调试模式并暗含-v选项。在调试模式下,将不会对日志或logrotate状态文件进行任何更改。
-f, --force
告诉logrotate强制转储,即使它认为没有必要也是如此。在将新条目添加到logrotate配置文件后,或者如果手动删除了旧日志文件,这将很有用,因为将创建新日志文件,并且日志记录将继续正确进行。
-m, --mail
告诉logrotate邮寄日志时使用哪个命令。此命令应接受两个参数:1)邮件的主题,以及2)收件人。然后,该命令必须阅读标准输入上的消息并将其邮寄给收件人。缺省的mail命令是/bin/mail -s。
-s, --state
告诉logrotate使用备用状态文件。如果logrotate以不同的用户身份运行各种日志文件集,这将很有用。默认状态文件是/var/lib/logrotate.status。
--usage
打印简短的使用信息。
–?, --help
打印帮助消息。
-v, --verbose
打开详细模式。
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 [email protected]
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次旋转后,旧日志文件会被邮寄(未压缩)到[email protected],而不是被删除。该 sharedscripts意味着该postrotate脚本只能一次运行(旧日志已被压缩后),而不是对每个被转储的日志运行一次。请注意,在本节的开头,第一个文件名周围的双引号允许logrotate转储名称中带有空格的日志。
最后一部分定义了/var/log/news中所有文件的参数。每个文件每月轮换一次。这被视为单个转储指令,并且如果多个文件出现错误,则不会压缩日志文件。
请谨慎使用通配符。如果指定*,logrotate将旋转所有文件,包括先前旋转的文件。一种解决方法是使用olddir指令或更精确的通配符(例如* .log)。
注意:
生成/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