Centos logrotate 发现错误,跳过

Centos logrotate 发现错误,跳过

我们的一台服务器有一个接近 5GB 大小的 access_log - 目前没有日志轮换,所以我昨天为 httpd 启用了它

/etc/logrotate.d/httpd 的内容是

/var/log/*.log {
    weekly
    missingok
    notifempty
    sharedscripts
    delaycompress
    postrotate
        /sbin/service httpd reload > /dev/null 2>/dev/null || true
    endscript
}

当 logrotate 运行时会产生一个错误:

Anacron job 'cron.daily' on

/etc/cron.daily/logrotate:

error: found error in /var/log/*.log , skipping

我看不出错误可能是什么,因为这些看起来都像是有效参数——知道问题是什么吗?

答案1

这是因为您/var/log/*.log创建的重复条目会与一个或多个其他文件中定义的日志相冲突,/etc/logrotate.d/例如dracutsyslog等等。

您可以通过logrotate在命令行上运行来测试这一点,这是我在 CentOS 6.7 系统上使用您的 httpd 文件时得到的输出

logrotate /etc/logrotate.conf
error: httpd:1 duplicate log entry for /var/log/dracut.log
error: found error in /var/log/*.log , skipping
other irrelevant output skipped.

我不知道你是如何配置 httpd 的,但 CentOS 的默认设置是将日志写入,/var/log/httpd/因此 /etc/logrotate.d/httpd config 的常见配置是

/var/log/httpd/*log {
    missingok
    notifempty
    sharedscripts
    delaycompress
    postrotate
        /sbin/service httpd reload > /dev/null 2>/dev/null || true
    endscript

如果您已经更改了 httpd 的默认日志位置,那么将其恢复原状然后使用上面的通用配置可能会更容易。

如果你不能那么你将不得不列出你想要轮换的单个日志文件(这可能比你想要的更多工作)

/var/log/access_log
/var/log/error_log
/var/log/vhost1_access_log
and so on... {
    missingok
    notifempty
    sharedscripts
    delaycompress
    postrotate
        /sbin/service httpd reload > /dev/null 2>/dev/null || true
    endscript

答案2

Apache 支持管道日志的概念

Apache httpd 能够通过管道将错误和访问日志文件写入另一个进程,而不是直接写入文件。此功能大大提高了日志记录的灵活性,而无需向主服务器添加代码。为了将日志写入管道,只需将文件名替换为管道字符“|”,后跟应在其标准输入上接受日志条目的可执行文件的名称。服务器将在服务器启动时启动管道日志进程,如果服务器在运行时崩溃,则会重新启动它。(最后一个功能就是我们可以将此技术称为“可靠管道日志记录”的原因。)

管道日志进程由父 Apache httpd 进程生成,并继承该进程的用户 ID。这意味着管道日志程序通常以 root 身份运行。因此,保持程序简单且安全非常重要。

管道日志的一个重要用途是允许日志轮换而无需重新启动服务器。Apache HTTP Server 包含一个名为 rotatelogs 的简单程序,用于此目的。例如,要每 24 小时轮换一次日志,您可以使用:

CustomLog "|/usr/local/apache/bin/rotatelogs /var/log/access_log 86400" common

请查找以下网址以获取更多信息:

http://httpd.apache.org/docs/current/logs.html

希望能帮助到你

谢谢

桑迪普

相关内容