![Centos logrotate 发现错误,跳过](https://linux22.com/image/666983/Centos%20logrotate%20%E5%8F%91%E7%8E%B0%E9%94%99%E8%AF%AF%EF%BC%8C%E8%B7%B3%E8%BF%87.png)
我们的一台服务器有一个接近 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/
例如dracut
,syslog
等等。
您可以通过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
希望能帮助到你
谢谢
桑迪普