ログローテーションを設定する方法【logrotate】

dev

ログは役に立つが、出力し続ければディスクを逼迫するし、ファイルサイズが大きすぎてもログ分析は大変になる。適度なタイミングで新しいファイルに切り替えて、必要なくなった古いファイルを削除することをログローテーションという。

logrotateを使ってログを管理する方法について書く。

logrotateで出来ること

  • 定期的にログファイルをバックアップして新しいファイルにログを書き込むようにできる
  • ログファイルを圧縮したり、定期的に古いファイルを削除できる

logrotateの仕組み

logrotateコマンドに設定ファイルを渡すことで、設定ファイルに書かれた内容でログファイルをいい感じにしてくれる。

logrotate 設定ファイル

logrotateはcrondによって定期的に実行される。詳細は「logrotateのcron設定」を確認してください。

ちなみに、前回実行時の記録が /var/lib/logrotate/logrotate.status などに記録されている。ローテーションの間隔は、この logrotate.status の情報をもとにカウントされている。

logrotateの設定する

logrotateの設定ファイルは下記のような構成になっていて、設定ファイルを書くだけでアプリケーションごとにログローテーションを設定することができる。

/etc/
│
├── logrotate.conf
├── logrotate.d/
│   ├── syslog
│   ├── yum
│   ├── your-app
...

logrotate.conf が基本的な設定ファイル。logrotate.conf は logrotate.d/ 以下の各ファイルを include しているので、アプリケーションごとの設定は logrotate.d/ 以下に置くのが良い。

設定ファイルの書き方

your-app というアプリのログ application.log を毎週ローテートして4世代分(1ヶ月分)のログを残す設定ファイルは次のようになる。

/etc/logrotate.d/your-app

/var/log/your-app/logs/application.log {
  weekly
  rotate 4
}

ログファイルのパスを指定して中に各設定を書く。上記ではローテートする間隔と残すログファイルの世代数のみを指定しているが、その他にも設定可能な項目はたくさんある。

設定可能な項目

manコマンドでみる。

設定確認

設定ファイルが書けたら実際に運用する前に、テストしてみよう。

logrotate -v 設定ファイル

上記コマンドを実行するとはログファイルに変更を加えずに、実行した場合にどういう動きをするか確認することができる。

reading config file 設定ファイル
Allocating hash table for state file, size 15360 B

Handling 1 logs

rotating pattern: ログファイル 1048576 bytes (no old logs will be kept)
empty log files are not rotated, old logs are removed
considering log ログファイル
log needs rotating
rotating log ログファイル, log->rotateCount is 0
dateext suffix ‘-yyyymmdd’
glob pattern ‘-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]’
compressing log with: /bin/gzip
renaming ログファイル.1.gz to ログファイル.2.gz (rotatecount 1, logstart 1, i 1),
renaming ログファイル.0.gz to ログファイル.1.gz (rotatecount 1, logstart 1, i 0),
renaming ログファイル to ログファイル.1
disposeName will be ログファイル.1.gz
removing old log ログファイル.1.gz

大体こんな感じの出力になるはずだ。

reading config file 設定ファイル
Allocating hash table for state file, size 15360 B

Handling 1 logs

ここは設定ファイルの読み込み。設定ファイルの分だけ行が増える。

以降はログファイルごとの出力になる。

rotating pattern: ログファイル 1048576 bytes (no old logs will be kept)
empty log files are not rotated, old logs are removed

設定ファイルの解釈が行われる。

considering log ログファイル
log needs rotating

これはローテートを行うかの判定。

rotating log ログファイル, log->rotateCount is 0
dateext suffix ‘-yyyymmdd’
glob pattern ‘-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]’
compressing log with: /bin/gzip
renaming ログファイル.1.gz to ログファイル.2.gz (rotatecount 1, logstart 1, i 1),
renaming ログファイル.0.gz to ログファイル.1.gz (rotatecount 1, logstart 1, i 0),
renaming ログファイル to ログファイル.1
disposeName will be ログファイル.1.gz
removing old log ログファイル.1.gz

前回ログを確認し、ログファイルの末尾の文字列を確認。パターンに合うファイルを検出して、圧縮を行う。過去のログファイルのリネームを行い、古いファイルを削除していることがわかる。

logrotateのエラーハンドリング

log does not need rotating (log size is below the ‘size’ threshold)

ローテートが必要なサイズに達していないのでローテートを実行しないということ。

ログファイルのサイズ上限を変更するか、あるは -f オプションを追加して強制的に実行することもできる。

error: error opening /path/application.log.1.gz: No such file or directory

該当のログファイルが存在しない。

特にローテート時に削除しようとする古いファイルが存在しないときに出力されるかもしれない。適当なファイルを置くことでエラーを回避できる。

logrotateのcron設定

logrotateはcronに登録されていて、毎日コマンドが実行されて、条件に当てはまるログがあればローテーションするというような動きをする。cronは既に設定されているので改めて設定する必要は無いはずだが、理解のために設定を見てみる。

一番直接的なせcron設定は /etc/cron.daily/logrotate で設定されている。毎日cron実行時にこのファイルの内容が実行される。

このcron.dailyはOSのインストール時にデフォルトで設定されているはずで、実行は anacron で制御される。設定は /etc/anacrontab で確認。

ちなみに、anacronではcron実行が集中しないように正確な時間での実行はしないようだ。

細かすぎて伝わらない anacron の挙動 - Qiita
対象は CentOS 6 に付属の cronie-anacron-1.4.4。開始時間についての問題/etc/anacrontab がRHEL 6/CentOS 6系のデフォルトのまま以下のよう…

logrotate本体の話から逸れるので解説は外部記事に投げる。上記の記事ではanacronのソースコードから、実行時間が決まるしくみを紐解いてくれている。

参考

タイトルとURLをコピーしました