この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に入れましたが、今日はログがローテーションされませんでした。
以下は私がやったことです:
私がこれをしたとき:
$ 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.dエントリを最初に設定したときに、最初の日をローテーションしないことです。時間ベースのローテーション(毎日/毎週/毎月)を使用する場合、logrotateは/var/lib/logrotate/status
(またはRHELシステムでは/var/lib/logrotate.status
)でファイルを確認した最後の日付の日付スタンプを書きます。
落書き日は、logrotate
の今後の実行が「日次」ローテーションの比較に使用する基準日になります。デフォルトのcronジョブは毎日実行されるため、これは通常、毎日のジョブでのみ問題になります。
この問題は2つの方法で回避できます。
Sudo logrotate -f /etc/logrotate.d/<my rotate job>
を実行します
/var/lib/logrotate/status
を編集し、手動で行を追加します。
"/var/log/my_special.log" 2013-4-8
次のSlicehostの記事によると:
Ubuntuでのlogrotateの理解-パート2
http://articles.slicehost.com/2010/6/30/understanding-logrotate-on-ubuntu-part-2
... /var/lib/logrotate/status
file "は、各ログファイルを最後にローテーションした日時に関する情報を格納します。"。 logrotateマンページ は、「状態ファイル」と呼ばれていることを示しています。
ここでServerFaultにも役立つと思われる別の議論があります。
logrotateは「毎日」を正確にどのように処理しますか?
その議論では、「MadHatter」は、「ステータス」(状態)ファイルに関して、以下に関して述べています。
"各ファイルには、最後にローテーションが行われた日付である1行があります。現在の日付とファイル内の日付の間の日数を指定すると、特定のファイルのローテーションが予定されている日付でlogrotateを実行すると( 1は毎日、7は毎週など)、ファイルはローテーションされます。
これがお役に立てば幸いです。
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