はじめまして、BPSの福岡拠点として一緒にお仕事させて頂いてます、
18年卒で入社した株式会社ウイングドアの岡です。
ちょっと前に、弊社が監視しているサーバーの空き容量対策として行った、
「ログローテーション」を設定した際の話を書こうと思います。
ログローテーションとは?
ログローテーションとは、システムが残す記録(ログ)が際限なく増えることを防ぐために、一定の容量や期間ごとに古いログを削除したり新しいログで上書きすること。
また、そのような機能。
参考: ログローテーション(ログローテート)とは - IT用語辞典 e-Words
ログローテーションしないとどうなる?
ログローテションの設定をしないと、ログが肥大化しサーバーが停止する可能性があります。
実際に弊社も今回その状態が発生しました・・・。
しかし、ログローテーションの設定をすることで、
容量や期間ごとに古いログを自動で削除できるので、自動でログの管理ができます。
手順
今回行うこと
- logrotateを使って行う
- Rails関連のログをログローテションする
- ログの世代管理を行う
- 過去のログを圧縮する
- AWS環境(amazon linux 2)を想定
確認
logrotateの確認
yum list installed | grep logrotate
logrotate.x86_64 3.8.6-15.amzn2 @amzn2-core
logrotateは、AWS環境には基本入っているはずですので、インストールの必要はありません。
もしなかった場合は、インストールしてください。
logrotateインストール
yum install -y logrotate
cronの確認
systemctl status crond.service
logrotateを定期実行させるために、起動していないのなら起動させます。
logrotateの構成
名前・場所 | 内容 |
---|---|
/etc/logrotate.conf | ログローテーション全体の設定ファイル |
/etc/logrotate.d/ | ログファイル個別の設定ファイル |
/var/lib/logrotate/logrotate.status | 各ログのローテーションした日時を扱うファイル |
今回はRails関連のログだけをログローテーションしたいので、logrotate.dの中に書いていこうと思います。
設定内容
vim /etc/logrotate.d/unicorn
/プロジェクト名/log/*.log {
daily
missingok
rotate 30
dateext
compress
delaycompress
postrotate
su app app
create 660 app app
# ローテション後にログファイルを開き直す
lastaction
pid=path/to/unicorn.pid
test -s $pid && kill -USR1 "$(cat $pid)"
endscript
}
オプション | 内容 |
---|---|
daily | 毎日実行する |
missingok | ログファイル個別の設定ファイル |
rotate | 世代分残すログの設定 |
dateext | ファイル名末尾に日付をつける |
compress | ログファイルをgz圧縮 |
delaycompress | 1つ前のファイル以外は圧縮する |
su | 指定したユーザーでログローテーションをする |
create | ログローテションを行った後に、新規ログファイルを作成するユーザーを指定する |
logrotateのスクリプト
# ローテション後にログファイルを開き直す
lastaction
pid=path/to/unicorn.pid
test -s $pid && kill -USR1 "$(cat $pid)"
endscript
lastactionでは、ローテションの際にスクリプトを実行することが可能です。
- firstaction: ログローテーションプロセスの1番最初
- prerotate: ログファイルをローテーションする前
- postrotate: ログファイルをローテションした後
- lastaction: ログローテーションプロセスの1番最後
USR1シグナルで、ログローテーション後のログを開いています。
これを行わないと、ログファイルに書き込こまれなくなるので、
この処理を加えています。
参照: unicornのシグナルまとめ
動作確認
# テスト実行(実際にログローテーションはされない)
/usr/sbin/logrotate -fd /etc/logrotate.d/unicorn
# 実行
/usr/sbin/logrotate -f /etc/logrotate.d/unicorn
確認ができていれば成功です。あとは毎日cronで実行され、日付ごとにlogが生成されます。
まとめ
ログローテーションを実際に設定してみて思ったことは、
設定することでコードを書かずにlogを管理できるようになり、
過去のログを調査する際も、日付ごとに分かれていて便利でした。
あらためてログローテションの必要性を実感しました。
株式会社ウイングドアでは、Ruby on RailsやPHPを活用したwebサービス、webサイト制作を中心に、
スマホアプリや業務系システムなど様々なシステム開発を承っています。