production.logのローテート

作成日 2009/09/13

RedmineなどRuby on Railsで開発されたアプリケーションが出力するlog/production.logには情報が追記され続けます。サイズが大きくなりディスク容量が圧迫されるのを防ぐために、定期的にローテートを行うことを検討してください。

方法①:Railsのloggerを利用

Redmineの config/additional_environment.rb にLoggerの設定を追加することで、一定サイズあるいは一定期間ごとにローテートさせることができます。

例えば以下の設定を行うとログが10MBに達するごとにローテートし、最大10世代分保持します。

config.logger = Logger.new("log/#{Rails.env}.log", 10, 10240000)

2番目のパラメータに daily, weekly, または monthly のいずれかを指定すると、毎週、毎日、または毎月ローテートさせることができます。以下は日ごとにローテートさせるための例です。

config.logger = Logger.new("log/#{Rails.env}.log", 'daily')

Logger.new に対して指定できるパラメータはRubyのLoggerクラスのリファレンスマニュアルで確認できます。
https://docs.ruby-lang.org/ja/latest/class/Logger.html#S_NEW

方法②:Linuxのlogroatedを利用

LinuxでRedmineを稼働させている場合、logroatedを使ってこの処理を行うことができます。

/etc/logroate.d/以下に以下の内容のファイルを作成しておくと、CentOSなどRedhat系ディストリビューションでは日曜日の早朝にログがローテートされるようになります。

logroatedの設定例
(Redmineのインストールディレクトリが/var/lib/redmineの場合)

/var/lib/redmine/log/*log {
    missingok      # ファイルが存在しなくてもエラーににない
    notifempty     #
    copytruncate   # ログを別名でコピーした後、元のファイルの内容を空にする
    compress       # 古いログを圧縮して保存する
}

logrotatedの設定オプション

ローテート方法

copytruncate ログをコピーした後、元ファイルを空にする
create mode owner group ログの名前を変更した後、新たにログファイルを作成する

ローテート間隔

daily 日ごと
weekly 週ごと
monthly 月ごと

関連項目