我有这个 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 中,但今天日志并未轮换。
以下是我所做的事情:
- 我验证了日志确实在 /var/log/mysql/mysql-slow.log
- 以 root 身份运行时,mysqladmin 行工作正常
- 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
- 显示 logrotate 成功的日志在哪里?我想看看是否有任何内容表明存在问题。
- 关于为什么 logrotate 不工作,有什么想法吗?
答案1
一个常见问题是,当您首次设置每日 logrotate.d 条目时,它不会轮换第一天。当您使用基于时间的轮换(每日/每周/每月)时,logrotate 会草草地记下它在/var/lib/logrotate/status
(或/var/lib/logrotate.status
在 RHEL 系统上)中看到该文件的最后日期。
潦草写下的日期将成为将来运行的参考日期,logrotate
用于比较“每日”轮换。由于默认的 cron 作业每天运行,因此这通常只是日常作业中的问题。
您可以通过两种方式避免此问题;
跑步
sudo logrotate -f /etc/logrotate.d/<my rotate job>
- 这会将日期写入状态文件并轮换日志
- 这会将日期写入状态文件并轮换日志
手动编辑
/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 中还有另一个讨论可能也有用:
在该讨论中,“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
答案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 | 的缩写