logrotate入門...

logrotate入門...

こんにちは、オタコです。

logrotateに悩まされたというかよくわかっていなかったので、勉強となります。

logrotateとは?

logrotateは多くのLinuxディストリビューションでデフォルトでインストールされているログファイルのローテーション(新しいログファイルに入替、古い世代のログファイルを圧縮、削除など)を行うソフトウェアです。

設定ファイル

設定ファイルは/etc/logrotate.confが中心となります。

この/etc/logrotate.confの中で/etc/logrotate.d/以下のファイルがincludeされます。

/etc/logrotate.d/nginxの記述例は以下のとおりとなります。

/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
      if [ -f /var/run/nginx.pid ]; then
        kill -USR1 cat /var/run/nginx.pid
      fi
    endscript
}
  • daily: 1日ごとにログをローテーションします。weekly(週ごと)やmonthly(月ごと)なども指定できます。
  • missingok: ログファイルが見つからない場合でもエラーとせずに続行します。
  • rotate 14: 14世代分のログを保持します。15世代目以降は削除されます。
  • compress: ローテーションされたログファイルを圧縮します。
  • delaycompress: ひとつ前の世代のファイルは圧縮せず、その次の世代から圧縮を開始します。これは、ログをローテーションした直後にアプリケーションがまだ古いファイルに書き込もうとすることがあるため、安全を期すための設定です。
  • notifempty: ログファイルが空の場合は、ローテーションを行いません。
  • create 0640 www-data adm: 新しいログファイルを作成する際のパーミッションと所有者を指定します。
  • sharedscripts: 複数のログファイルに対して同じscriptを実行する際に、スクリプトを一度だけ実行します。
  • postrotate ... endscript: ローテーションが完了した後に実行するコマンドを記述します。上記の例では、Nginxにシグナルを送って、新しいログファイルに書き込みを開始するように指示しています。

手動実行

手動でlogrotateを実行したい場合は以下のコマンドを実行します。

sudo logrotate -f /etc/logrotate.conf

-fオプションをつけると、強制的にローテーションを実行します。

自動実行

ひと昔前(RHEL7まで)はcronにより自動実行するようスケジューリングしていました。

今は/usr/lib/systemd/system/logrotate.timer ファイルに定期実行がスケジューリングされています。