logrotate 是如何工作的

how does logrotate actually works

我正在尝试为 httpd 服务器设置日志,然后我在 /etc/logrotate.d/apache.conf

中编写了一个脚本
/var/log/httpd/* {
    daily
    rotate 3
    size 20K
    compress
    delaycompress
}

我从这个文件中了解到的内容

/var/log/httpd/* = 存储所有日志的位置并且您想对它们进行日志轮换

daily = 当你想轮换日志时

rotate=只应保留 3 个旋转日志

size =当您的日志文件大小满足此条件时

compress=制作旋转日志的 zip 文件

delaycompress = 压缩的种类不多

所以我访问了生成大量日志的 apache 服务器

生成日志后

我的日志在哪里存储它是如何 运行 仅当大小条件匹配时,否则 感谢您的指导或帮助

日志轮换的时间和方式还有一件事运行为什么有些人建议将 cron 作业与 logrotate 一起使用

where is my log are store

除非您指定 olddir 指令,否则它们会在它们存在的同一目录中轮换。

how it is run only on when size condition matches or else

如果您指定 size 指令,则日志仅在 如果 大于该大小:

size size

Log files are rotated only if they grow bigger then size bytes.

不符合大小要求的文件将被忽略 (https://linux.die.net/man/8/logrotate)。

why some people suggested to use cron job with logrotate

logrotate 只是一个可执行文件;它不处理执行方式或执行时间的任何方面。 cron 通常是 logrotate 的执行安排方式。例如,在 CentOS 上,/etc/cron.daily 目录中有一个可执行文件 shell 脚本:

#!/bin/sh

/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

这个脚本每天由 cron 执行一次,logrotate 的执行实际上是这样启动的。

其他几个问题:

  1. /var/log/httpd/* - 除非您使用 olddir 指令将文件从原始目录中移出,否则 永远不会 结束您的 logrotate带有通配符 (*) 的目录定义。该定义将覆盖到该目录中的 每个 文件, 包括 您已经旋转的文件。 Logrotate 无法跟踪哪些文件是实际日志,哪些文件是存储的轮换。您的目录定义应该类似于 /var/log/httpd/*_log

  2. 您应该在旋转日志文件后重新加载 httpd,否则它可能会继续登录旋转的文件,因为您从未关闭它的句柄。

     sharedscripts
     postrotate
         /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
     endscript
    

同样,这是一个特定于 CentOS 的示例。