日志旋转不起作用

Mal*_*chi 18 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
}
Run Code Online (Sandbox Code Playgroud)

我已经离开它两个星期了,据我所知,一切都没有改变。当我从命令行模拟它时,我得到以下输出。

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
Run Code Online (Sandbox Code Playgroud)

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

我的状态文件也是空的:(

user@geneva:~$ cat /var/lib/logrotate/status
logrotate state -- version 2
Run Code Online (Sandbox Code Playgroud)

更新

我删除了状态文件并强制运行了 logrotate,现在日志看起来已经旋转了,状态文件看起来更有希望!

sudo rm /var/lib/logrotate/status

sudo /usr/sbin/logrotate -f /etc/logrotate.conf
Run Code Online (Sandbox Code Playgroud)

Tom*_*Tom 18

我认为这weekly意味着 logrotate 想要查看您的 access.log 文件的至少一周前的条目,以便对其进行旋转。

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


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

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

因此,我已将 apache 的 logrotate 设置为每周一次;

/var/log/httpd/*log {
        weekly
...
}
Run Code Online (Sandbox Code Playgroud)

并且最初/var/lib/logrotate.status文件中 没有条目

# grep access_log /var/lib/logrotate.status
<- nothing
Run Code Online (Sandbox Code Playgroud)

所以 logrotate 不会旋转access_log文件;

 #  /usr/sbin/logrotate  -d /etc/logrotate.d/httpd 
 ...
considering log /var/log/httpd/access_log
  log does not need rotating
Run Code Online (Sandbox Code Playgroud)

但是,如果我像这样手动运行 logrotate;

#  /usr/sbin/logrotate   /etc/logrotate.d/httpd 
Run Code Online (Sandbox Code Playgroud)

现在在状态文件中有一个 httpd access_log 条目;

 # grep access_log /var/lib/logrotate.status
 "/var/log/httpd/access_log" 2012-5-11
Run Code Online (Sandbox Code Playgroud)

然而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
Run Code Online (Sandbox Code Playgroud)

但是,如果您使用 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..
Run Code Online (Sandbox Code Playgroud)

然后 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.
Run Code Online (Sandbox Code Playgroud)

(请记住,这-d会导致空运行,因此仅对检查有用,您必须实际运行命令而无需-d进行状态条目或旋转文件等)

  • 抱歉,我的答案本来可以更清楚,但我认为对于每周轮换,它需要文件 `/var/lib/logrotate.status` 中的条目,日期至少为一周。我用一个例子更新了答案...... (2认同)

Gre*_*SAT 7

log does not need rotating
Run Code Online (Sandbox Code Playgroud)

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

或者你有日志的创建时间问题:

ls -al --time=ctime /var/www/user/site.com/logs/
Run Code Online (Sandbox Code Playgroud)


小智 6

我遇到了类似的问题,除了这些答案都没有帮助我。我的日志文件又大又旧,我的配置 100% 正常且有效,删除状态文件没有帮助。

原来问题出在重复的 logrotate 条目中。当我在我的配置文件上手动运行 logrotate 时:

logrotate -df /etc/logrotate.d/my_service_name
Run Code Online (Sandbox Code Playgroud)

它没有显示任何错误,它只是说:

log does not need rotating
Run Code Online (Sandbox Code Playgroud)

我仍然不知道为什么。但是当我像这样运行一个完整的 logrotate 命令时:

logrotate -f /etc/logrotate.conf
Run Code Online (Sandbox Code Playgroud)

我得到以下行:

error: my_service_name:1 duplicate log entry for /var/log/nginx/my_service_name.access.log
Run Code Online (Sandbox Code Playgroud)

事实证明,我的服务的 logrotate 配置文件包含轮换 nginx 访问日志的条目以及服务日志本身。这与 ngnix logrotate 配置相冲突,该配置对所有 nginx 条目都有一个规则:

# grep nginx /etc/logrotate.d/*
/etc/logrotate.d/nginx:/var/log/nginx/*.log {
Run Code Online (Sandbox Code Playgroud)

所以我的情况的解决方案非常简单:我只需要从我的 config 中删除冲突的nginx 日志轮换规则

我想 logrotate 开始仅从最新版本之一开始中止处理规则冲突的文件。我在 v.3.8.7 中遇到此错误,但在 v.3.7.8 下具有相同的冲突配置,它会写出相同的错误,但旋转得很好。虽然我在 logrotate 更改日志中找不到任何记录。