logrotate不旋转日志


24

我有此logrotate配置,并且我在Ubuntu 10.04上运行。

/var/log/mysql/mysql-slow.log {
    daily
    rotate 3
    compress
    notifempty
    missingok
    create 660 mysql adm
    postrotate 
    if test -x /usr/bin/mysqladmin && \
       /usr/bin/mysqladmin  ping &>/dev/null
    then
       /usr/bin/mysqladmin  flush-logs
    fi
endscript

}

我昨天将其放在/etc/logrotate.d中,今天日志没有旋转。

以下是我所做的事情:

  1. 我验证了日志确实在/var/log/mysql/mysql-slow.log中
  2. 以root用户身份运行时,mysqladmin行工作正常
  3. mysql能够写入mysql-slow.log

当我这样做时:

$ logrotate -d -f mysql-slow

reading config file mysql-slow
reading config info for /var/log/mysql/mysql-slow.log 

Handling 1 logs

rotating pattern: /var/log/mysql/mysql-slow.log  forced from command line (3 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/mysql/mysql-slow.log

log needs rotating
rotating log /var/log/mysql/mysql-slow.log, log->rotateCount is 3
dateext suffix '-20120329'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
renaming /var/log/mysql/mysql-slow.log.3.gz to /var/log/mysql/mysql-slow.log.4.gz     (rotatecount 3, logstart 1, i 3), 
renaming /var/log/mysql/mysql-slow.log.2.gz to /var/log/mysql/mysql-slow.log.3.gz (rotatecount 3, logstart 1, i 2), 
renaming /var/log/mysql/mysql-slow.log.1.gz to /var/log/mysql/mysql-slow.log.2.gz (rotatecount 3, logstart 1, i 1), 
renaming /var/log/mysql/mysql-slow.log.0.gz to /var/log/mysql/mysql-slow.log.1.gz (rotatecount 3, logstart 1, i 0), 
renaming /var/log/mysql/mysql-slow.log to /var/log/mysql/mysql-slow.log.1
creating new /var/log/mysql/mysql-slow.log mode = 0660 uid = 20004 gid = 4
running postrotate script
running script (multiple) with arg /var/log/mysql/mysql-slow.log : " 
    if test -x /usr/bin/mysqladmin && \
       /usr/bin/mysqladmin &>/dev/null
    then
       /usr/bin/mysqladmin flush-logs
    fi
"
compressing log with: /bin/gzip
removing old log /var/log/mysql/mysql-slow.log.4.gz
  1. 显示logrotate成功的日志在哪里?我想看看是否有什么问题。
  2. 关于为什么logrotate不起作用的任何想法?

手动执行是否有效?在crond跑步吗?
凯尔·史密斯

是的,如果您的意思是logrotate -f mysql_slow_query,它可以工作。crond正在运行。
卡门2012年

您确定没有其他配置可以处理该日志文件吗?也许mysql-server吧?运行grep '/var/log/mysql' /etc/logrotate.d/*
Zoredache'3

我运行了该命令,只有我的配置显示在/ var / log / mysql中做某事
Carmen

每天的什么时候cron作业在您的Ubuntu设置中运行?您可能会在/etc/crontab文件中以结尾的行中找到该信息/etc/cron.daily )。也许您已经在当天的cron日常作业运行后创建了logrotate配置?
ricmarques 2012年

Answers:


47

一个常见的问题是,当您首次设置每日logrotate.d条目时,它不会在第一天旋转。当您使用基于时间的轮换(每天/每周/每月)对数旋转时,将看到文件/var/lib/logrotate/status(或/var/lib/logrotate.status在RHEL系统上)看到的最后日期的日期戳记作文。

写的日期成为将来运行的参考日期,logrotate用于比较“每日”轮换。由于默认的cron作业每天运行,因此这通常只是日常作业中的问题。

您可以通过两种方式避免此问题:

  1. sudo logrotate -f /etc/logrotate.d/<my rotate job>

    • 这会将日期写到状态文件中并旋转日志

  2. /var/lib/logrotate/status手动编辑并添加行:

    "/var/log/my_special.log" 2013-4-8

    • 将其设置为今天或以前的日期。下次运行应使其运行。

像冠军一样工作!
塞斯

6
实际上,使用时(至少在我的RH导数上)它确实会旋转日志-f
15

12
-f对于“强制旋转”,-d对于“调试”,调试也意味着空运行,因此在-d打开时实际上不会进行任何更改。
ThorSummoner '16

1
-d这意味着空转是一个棘手的问题。没有进行任何更改,直到我意识到这一事实之前,我还是挠着头。
Artem Russakovskii

5

根据以下Slicehost文章:

了解Ubuntu上的logrotate-第2部分
http://articles.slicehost.com/2010/6/30/understanding-logrotate-on-ubuntu-part-2

... /var/lib/logrotate/status文件“ 存储有关上次旋转每个日志文件的时间的信息。 ”。该logrotate的手册页说,被称为“状态文件”。

ServerFault中还有另一个讨论可能也很有用:

logrotate如何精确处理“每日”?

在该讨论中,“ MadHatter”就以下内容与“状态”(状态)文件说:

“每个文件都有一行,这是最后一次轮换的日期;如果在给定文件应轮换的日期运行logrotate,则应考虑到当前日期和文件中日期之间的天数(每天1个,每周7个,依此类推),文件将被旋转。”

我希望这有帮助。


0

如果mysqladmin需要用户或密码,它将不/root/.my.cnf进行修改就不会从配置中读取它。

尝试将输出传递到记录器以查看发生了什么。

  postrotate
      # just if mysqld is really running
      if test -x /usr/bin/mysqladmin && \
         /usr/bin/mysqladmin ping &>/dev/null
      then
         env HOME=/root/ /usr/bin/mysqladmin flush-logs 2>&1 | logger
      else
         logger "mysqladmin ping failed so not rotating mysql logs"
      fi
  endscript

旋转后,MySQL不会将错误记录到新文件中吗?

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.