【Rails】一定期間でログファイルを削除【手動は卒業】

エンジニア|ポートフォリオ
新人

えー…ログファルの容量がデカすぎて

毎回開く度にエディターが落ちる…泣

今回の記事は上記のような方におすすめ。

今回の記事では、溜まったログを世代管理する方法と、ログを削除するためのコマンドについて…Rails初心者でもわかるよう、わかりやすく解説いたします!

Railsは初期設定のままだと、デフォルトがの1ファイルにずっと出力され続けてしまいますよね。古いログが残ったままだと、ファイルが重すぎて開けなかったり、何かトラブルが起きた際も遡るのが大変だったりします。一方で、ログの設定をやっておけば、後からの確認は非常に楽になります!

エンジニア|ポートフォリオ
新人

間違っている箇所あったらコメントで教えてね。

本記事の内容

なおこの記事は3分で読める内容です。

rails:ログを削除するコマンド

$ rake log:clear

「development.log」「production.log」といったファイルは、削除しない限りは、ずっとログを吐き続けてしまいますよね。そのため、上記コマンドで定期的にログを削除する必要があります。

自分のローカルで消す分には、適度なタイミングで実行すれば良いと思うのです。が、これが実際のサーバー上となると、話は別。個人的には、何かトラブルがあった時のために、ログは数世代分は残しておくべきだと思うのです。でないと、遡って原因を究明できないからです。

エンジニア|ポートフォリオ
ベテラン

私の会社では、3世代分はログを残すようにしているよ

そこで、「ログローテーション」が必要になります。

ログローテーションとは?

ログローテーションとは、システムが残す時系列の記録データ(ログ)が際限なく増えることを防ぐために、一定の容量や期間ごとに古いログを削除したり新しいログで上書きすること。また、そのような機能。

IT用語辞典 e-Words

Railsにもログローテーションの便利な機能がデフォルトで備わっています。

デフォルトのログファイルはどこに?

開発環境の場合

内容ファイルの場所
ログ出力先log/development.log
ログ設定config/environments/development.rb

ログローテートの設定を行うには、開発環境の場合は「config/environments/development.rb」に後から紹介する設定を記載します。

本番環境の場合

内容ファイルの場所
ログ出力先log/production.log
ログ設定config/environments/production.rb

本番環境の場合は「config/environments/production.rb」に後から紹介する設定を記載します。

Railsの設定ファイルに追記する

記載内容はシンプルです。「config/environments/development.rb」もしくは「config/environments/development.rb」に下記を追記するだけ。

# 期間を区切ってでローテート
config.logger = Logger.new("log/sample.log", 'daily')

# ファイルサイズでローテート
config.logger = Logger.new("log/sample.log", 5, 10 * 1024 * 1024)

Log 設定方法①:期間で区切る

まず、こちら。「日付」などの期間で区切って設定する方法です。特に、「日付」でのログローテートは、何かトラブルが発生した際に、発生日時からログをさかのぼりやすいのが利点だと思います。

例えば「日付」指定であれば各日付ごとにログが退避されます。

# 日付でログローテート
config.logger = Logger.new('log/sample.log', 'daily')

上記の場合は「sample.log.日付」というファイル名で、各日付ごとにログが退避されます。

今日が12/27日だとすると、明日には、
– sample.log.20211226

明後日には、
– sample.log.20211226
– sample.log.20211227

明明後日には、
– sample.log.20211226
– sample.log.20211227
– sample.log.20211228


ってファイルが退避されてるイメージですね。便利ですよね。

ただし、朝昼夜などの1日に3回実行するなどの、詳細な設定ができない点と、古いファイルの削除が行えない点が難点ではあります。また、「日付」以外にも「週間」「月ごと」などの区切り方も可能です。

# 日付でログローテート
config.logger = Logger.new('log/sample.log', 'daily')

# 週間単位でログローテート
config.logger = Logger.new('log/sample.log', 'weekly')

# 月ごとにログローテート
config.logger = Logger.new('log/sample.log', 'monthly')

Log 設定方法②:ファイル容量で区切る

続いて、こちら。ログが溜まった時の容量で区切る設定方法です。一定期間ログファイルを保存し、期間を過ぎた古いログファイルを削除することができます。

# 5M をこえたらログが日付付きで退避され、合計が10ファイルをこえたら古いファイルは削除
config.logger = Logger.new('log/sample.log', 10, 5 * 1024 * 1024)

詳細は、Railsドキュメントをご覧ください。

まとめ

ログファイルに関しては、やっぱり他のタスクと比べて後回しにしがちですよね。でも、万が一のトラブルに備えて整備しておくのが良い箇所だと思います。後から大変な思いをしなくて済むように先行投資的なものですかね…?

ログファイルが巨大すぎると、見る気にもならないので、なんとか分割しておきたいですよね。どちらにもデメリット、メリットありますが、一定期間で自動でログファイルを消されたくない!という方、ちゃんと自分の目で確認してから消したい!って方は、勝手に削除されない①の期間で区切る方法が良いかな、と。

その際は、あまりにも1ファイルの期間を長くしちゃうと、1ファイル確認するするのも大変なので、日付単位が無難かなと私は思いました。

エンジニア|ポートフォリオ
新人

これでエラーの確認はもっと楽になりそう!

参考

この記事を書いた人

竹田奈央

石川県出身 / 都内在住 / 国立大中退→情報工学科卒 / フリーランスの女性WEBエンジニア / フルリモート / アラサー / 独身 / #ADDress ワーケーション / 松本人志・千鳥好き/ 下記Twitter OR LinkedInボタンで繋がってくれると嬉しいです