logrotate 不旋转日志

logrotate 不旋转日志

我有这个 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 不工作,有什么想法吗?

答案1

一个常见问题是,当您首次设置每日 logrotate.d 条目时,它不会轮换第一天。当您使用基于时间的轮换(每日/每周/每月)时,logrotate 会草草地记下它在/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

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

答案2

根据以下 Slicehost 文章:

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

.../var/lib/logrotate/status文件 ”存储有关上次轮换每个日志文件的时间的信息。“。 这logrotate 手册页称这被称为“国家文件”。

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

logrotate 究竟如何处理“每日”?

在该讨论中,“MadHatter”针对“status”(状态)文件发表了以下言论:

“每个文件都有一行,即上次轮换的日期;如果您在某个文件需要轮换的日期运行 logrotate,给定当前日期和文件中的日期之间的天数(1 表示每日,7 表示每周,等等),则该文件将被轮换。”

我希望这有帮助。

答案3

如果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 旋转后没有将错误记录到新文件吗?

答案4

尝试检查 logrotate 输出中是否有单词“error”。似乎 logrotate 在遇到错误时会跳过某些任务(但不是所有任务)。

例如,在 Debian/Ubuntu 下,您可以运行:

/usr/sbin/logrotate /etc/logrotate.conf --verbose --force |& grep -i '[^-_/.]error'

正则表达式是为了避免列出包含单词“error”的文件。& 符号还将 stderr 重定向到 grep(根据高级 Bash 脚本指南):

|&已添加到 Bash 4,作为 2>&1 | 的缩写

相关内容