logrotate 不旋转日志

Car*_*men 30 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
Run Code Online (Sandbox Code Playgroud)

}

我昨天把它放在 /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
Run Code Online (Sandbox Code Playgroud)
  1. 显示logrotate成功的日志在哪里?我想看看是否有任何内容表明存在问题。
  2. 关于为什么 logrotate 不起作用的任何想法?

小智 62

一个常见问题是,当您第一次设置每日 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

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

  • `-f` 用于强制旋转,`-d` 用于调试,调试也意味着空运行,因此当 `-d` 打开时实际上不会进行任何更改。 (15认同)
  • 实际上它**确实**在使用`-f`时旋转日志(至少在我的RH衍生物上)。 (7认同)
  • `-d` 暗示试运行是一个棘手的问题。没有进行任何更改,这让我摸不着头脑,直到我意识到这一事实。 (3认同)

ric*_*ues 6

根据以下 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 表示每周等),文件将被旋转。”

我希望这有帮助。