我正在尝试让 logrotate 在我的 VPS 上运行,以便每周轮换我的 apache 文件。目前 apache2 配置文件的内容如下。
"/var/www/user/site.com/logs/*.log" {
weekly
missingok
rotate 8
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
/etc/init.d/apache2 reload > /dev/null
endscript
}
我已经把它放了两个星期了,据我所知什么都没有改变。当我从命令行模拟它时,我得到了以下输出。
user@geneva:/var/lib/logrotate$ /usr/sbin/logrotate -d /etc/logrotate.d/apache2
reading config file /etc/logrotate.d/apache2
reading config info for "/var/www/user/site.com/logs/*.log"
Handling 1 logs
rotating pattern: "/var/www/user/site.com/logs/*.log" weekly (8 rotations)
empty log files are not rotated, old logs are removed
considering log /var/www/user/site.com/logs/access.log
log does not need rotating
considering log /var/www/user/site.com/logs/error.log
log does not need rotating
not running postrotate script, since no logs were rotated
关于我配置错误的任何想法是什么?
我的状态文件也是空的:(
user@geneva:~$ cat /var/lib/logrotate/status
logrotate state -- version 2
更新
我删除了状态文件并强制运行 logrotate,现在日志看起来已经被轮换了,状态文件看起来更有希望!
sudo rm /var/lib/logrotate/status
sudo /usr/sbin/logrotate -f /etc/logrotate.conf
答案1
我认为这weekly
意味着 logrotate 希望看到 access.log 文件中至少一周前的条目才能对其进行轮换。
因此,问题似乎在于您没有存储状态条目来触发旋转。
下面是一个简单的分步示例,说明 logrotate 如何决定轮换日志文件
(这些是 fedora 路径,Ubuntu、Centos 等可能不同)
(我提出了一些请求,http://localhost
以便 access_log 中有一些条目,否则 logrotate 永远不会旋转......)
因此我将 apache 的 logrotate 设置为每周一次,如下所示;
/var/log/httpd/*log {
weekly
...
}
/var/lib/logrotate.status
并且文件 中原本没有条目
# grep access_log /var/lib/logrotate.status
<- nothing
所以logrotate不会旋转文件access_log
;
# /usr/sbin/logrotate -d /etc/logrotate.d/httpd
...
considering log /var/log/httpd/access_log
log does not need rotating
但是如果我像这样手动运行 logrotate;
# /usr/sbin/logrotate /etc/logrotate.d/httpd
现在状态文件中有一条 httpd access_log 的条目;
# grep access_log /var/lib/logrotate.status
"/var/log/httpd/access_log" 2012-5-11
但是 apache 仍然不会轮换日志,因为该条目仅有 0 天(2012-5-11);
# /usr/sbin/logrotate -d /etc/logrotate.d/httpd
considering log /var/log/httpd/access_log
log does not need rotating
但是如果您使用 vi 编辑状态文件,vi /var/lib/logrotate.status
那么像这样将日期设置为超过一周...;
# grep access_log /var/lib/logrotate.status
"/var/log/httpd/access_log" 2012-4-11 <--- more than a week ago..
然后 logrotate 现在可以正确旋转文件,因为状态文件中的日期距2012-4-11
今天已超过一周2012-5-11
# /usr/sbin/logrotate -d /etc/logrotate.d/httpd
considering log /var/log/httpd/access_log
log needs rotating <--- logrotate rotates the file.
(请记住,这-d
会导致试运行,因此仅对检查有用,您必须实际运行该命令而无需-d
进行状态输入或旋转文件等)
答案2
log does not need rotating
这可能是因为您的日志文件为空。
发生这种情况的原因是 apache 仍在以前的日志文件中写入,该文件已重命名而无需重新启动 apache。因此 access.log 变成了 access.log.1,并且 apache 会写入其中。
或者您在日志创建时间方面遇到了问题:
ls -al --time=ctime /var/www/user/site.com/logs/
答案3
我遇到了类似的问题,但这些答案都帮不上忙。我的日志文件很大而且很旧,我的配置 100% 正确且有效,删除状态文件没有帮助。
原来问题出在重复的 logrotate 条目。当我在配置文件上手动运行 logrotate 时,只像这样:
logrotate -df /etc/logrotate.d/my_service_name
它没有显示任何错误,只是说:
log does not need rotating
我实际上仍然不知道为什么。但是当我运行如下完整的 logrotate 命令时:
logrotate -f /etc/logrotate.conf
我得到了以下一行:
error: my_service_name:1 duplicate log entry for /var/log/nginx/my_service_name.access.log
事实证明,我的服务的 logrotate 配置文件包含轮换 nginx 访问日志的条目以及服务日志本身。这与 ngnix logrotate 配置相冲突,后者对所有 nginx 条目都有一条规则:
# grep nginx /etc/logrotate.d/*
/etc/logrotate.d/nginx:/var/log/nginx/*.log {
因此,对于我的情况,解决方案非常简单:我只需要删除冲突的nginx 日志我的配置中的轮换规则。
我猜想 logrotate 仅在最新版本之一中开始在规则冲突时中止处理文件。我在 v.3.8.7 中遇到此错误,但在具有相同冲突配置的 v.3.7.8 下,它会写出相同的错误,但可以正常旋转。尽管我在 logrotate 更改日志中找不到任何记录。
答案4
我有一台 Debian 7 机器,在系统更新后,它不再轮换邮件日志。除邮件日志外,所有其他日志都正确轮换。我发现邮件日志已经增长了几 GB。我总是通过 Webmin 管理日志轮换。然后,运行时logrotate -d /etc/logrotate.conf
我看到了以下消息:
Ignoring rsyslog.dpkg-old, because of .dpkg-old ending
原来我的邮件轮换条目列在 中/etc/logrotate.d/rsyslog.dpkg-old
,但被忽略了!重命名文件修复了日志文件轮换 :-)