ログは役に立つが、出力し続ければディスクを逼迫するし、ファイルサイズが大きすぎてもログ分析は大変になる。適度なタイミングで新しいファイルに切り替えて、必要なくなった古いファイルを削除することをログローテーションという。
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 BHandling 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 BHandling 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実行が集中しないように正確な時間での実行はしないようだ。
logrotate本体の話から逸れるので解説は外部記事に投げる。上記の記事ではanacronのソースコードから、実行時間が決まるしくみを紐解いてくれている。
参考
- logrotate入門
- ハンズオン形式での解説記事。順を追って理解しやすい良記事。
- 任意のログをlogrotateを使って管理する
- シンプルでわかりやすい設定記事
- 【日本語man】logrotateの全オプション解説
- オプションの説明を翻訳してくれている記事