Logrotate不起作用


18

我试图让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

关于Iv配置错误的任何想法?

我的状态文件也为空:(

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

Answers:


17

我认为这weekly意味着logrotate希望看到您的access.log文件至少有一个星期的历史记录,以便对其进行轮换。

因此,问题似乎在于您没有存储状态条目来触发旋转。


这是一个简单案例的分步示例,说明logrotate如何决定旋转日志文件
(这些是fedora路径,Ubuntu,Centos等可能不同)

(我提出了一些要求,http://localhost因此access_log中有一些条目,否则logrotate永远不会旋转...)

因此,我将aplog的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..

然后,由于状态文件中的日期2012-4-11比今天早了一周多,因此logrotate现在可以正确地旋转文件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进行状态输入或旋转文件等)


1
日志文件确实有一个多星期的条目-看来它现在正在运行,但是我想我会从现在开始找一个星期...
Malachi 2012年

2
抱歉,我的答案可能更清楚,但是我认为对于每周轮换,它需要在文件中输入/var/lib/logrotate.status一个日期至少为一周的日期。我用示例更新了答案……
汤姆H

谢谢您这么清晰的解释-我完全了解事物的日期方面,除非他们手动调用命令,否则它们不会旋转...好像CRON没有在调用日志旋转?
玛拉基书

我是Linux管理的新手,在/etc/cron.daily/logrotate/中有:#!/ bin / sh test -x / usr / sbin / logrotate || 出口0
玛拉基

7
log does not need rotating

这可能是因为您的日志文件为空。
发生这种情况是因为apache仍在以前的日志文件中写入,该日志文件已重命名而没有重新启动apache。因此,access.log变成了access.log.1,并且apache写入了该文件。

或者您对日志的创建时间有疑问:

ls -al --time=ctime /var/www/user/site.com/logs/

您可以注释掉该notifempty行以处理不循环的0字节日志。然后,您需要touch在每次测试之前创建一个新的日志文件,以便logrotate可以旋转。
Banjer 2014年

6

除了这些答案都没有帮助我之外,我还面临类似的问题。我的日志文件又大又旧,我的配置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 {

因此,针对我的案例的解决方案非常简单:我只需要从config中删除有冲突的 nginx日志轮换规则

我猜想logrotate仅在最新版本之一出现规则冲突时才开始中止处理文件。我在v.3.8.7版中收到此错误,但是在v.3.7.8版中,使用相同的冲突配置,它会写出相同的错误,但旋转得很好。尽管我在logrotate changelog中找不到任何记录。


您似乎对最新版本是正确的。我也有重复的条目;但是当手动运行logrotate时;它工作得很好。晚上返回值0;否则返回0。但它无法正常运行...
克里斯·梅斯


0

我有一台Debian 7机器,它在系统更新后不再旋转邮件日志。除邮件以外的所有其他日志均已正确轮换。我发现邮件日志增长了几GB。我总是通过Webmin管理日志轮换。然后,运行时,logrotate -d /etc/logrotate.conf我看到以下消息:

Ignoring rsyslog.dpkg-old, because of .dpkg-old ending

结果是,我的邮件轮换条目已在中列出/etc/logrotate.d/rsyslog.dpkg-old,因此被忽略了!重命名文件可修复日志文件轮换:-)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.