unicornにログローテーション設定してみた

はじめまして、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番最後

参考: logrotateスクリプトの調査

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サイト制作を中心に、
スマホアプリや業務系システムなど様々なシステム開発を承っています。

関連記事

WordPress新エディタ「Gutenberg」をさわってみた

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

wingdoor

株式会社ウイングドアは福岡のシステム開発会社です。Ruby on RailsやPHPを活用したwebサービス、webサイト制作を中心に、 スマホアプリや業務系システムなど様々なシステム開発を承っています。 中途採用を絶賛募集しています! https://wingdoor.co.jp/

wingdoorの書いた記事

BPSアドベントカレンダー

週刊Railsウォッチ