web-dev-qa-db-ja.com

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が機能しない理由についてのアイデアはありますか?
25
Carmen

一般的な問題は、毎日logrotate.dエントリを最初に設定したときに、最初の日をローテーションしないことです。時間ベースのローテーション(毎日/毎週/毎月)を使用する場合、logrotateは/var/lib/logrotate/status(またはRHELシステムでは/var/lib/logrotate.status)でファイルを確認した最後の日付の日付スタンプを書きます。

落書き日は、logrotateの今後の実行が「日次」ローテーションの比較に使用する基準日になります。デフォルトのcronジョブは毎日実行されるため、これは通常、毎日のジョブでのみ問題になります。

この問題は2つの方法で回避できます。

  1. Sudo logrotate -f /etc/logrotate.d/<my rotate job>を実行します

    • これにより、日付がステータスファイルに落書きされ、ログがローテーションされます。

  2. /var/lib/logrotate/statusを編集し、手動で行を追加します。

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

    • 今日または前の日付に設定します。次回の実行で実行されるはずです。
52
user168717

次の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は毎週など)、ファイルはローテーションされます。

これがお役に立てば幸いです。

5
ricmarques

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はローテーション後に新しいファイルにエラーを記録しませんか?

0
KCD