Logrotate不工作

Logrotate不工作

我正在尝试让 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,但被忽略了!重命名文件修复了日志文件轮换 :-)

相关内容