joppot

コピペで絶対動く。説明を妥協しない

サーバ プログラミング

ruby on railsで出力されるlog(ログ)のフォーマットを変更する

投稿日:2014年5月20日 更新日:

Pocket

DSCN5220

概要

みなさんこんにちはcandleです。今回はrailsのログに関する記事です。railsは決まった記述でログを出力します。
webアプリケーションを実行中におかしな挙動が合った場合はこのログをもとに原因をさぐったりします。

しかし、このデフォルトのフォーマット、ruby側が勝手に決めたフォーマットであり、正直、本番サーバで運用していく上で、必要のない情報までログに書き込まれたりします。

ruby on railsのログにはフィルターがあります。6つのレベルに書き込む重要度のレベルが用意されています。しかし、logに書き込まれる重要度のフィルタリングがなされるだけで、書き込む形式が変わるわけではありません。

今回のログのフォーマットを変えるとはそもそものフォーマットを変更することです。
例えば、下のようにログの時刻の部分は初期設定のままの時間の表示です。

Started GET “/assets/application.css?body=1” for 127.0.0.1 at 2014-05-20 14:50:14 +0900

うーん見づらいです。より見やすいログフォーマットを目指しましょう。

http://blog.makedara.net/archives/153


前提

ruby on rails の環境が整っている

SPONSORED LINK


簡易的なログのフォーマットの設定

少しの記述で、ログのフォーマットを変更することができます。

あなたが作成したrailsプロジェクトの中のconfigディレクトリの中のenvironmentsディレクトリに移動します。

 cd config/environments/

environmentsディレクトリの中に3つのファイルがあります。ログのフォーマットを書き換えたい環境でそれぞれ記述する必要があります。ひとまず、development.rbだけに記述します。
もしも、本番環境でも同じようにログのフォーマットを書き換えて使いたい場合はproduction.rbにも記述する必要があります。

development.rbを適当なエディタで開きます。
私はemacsを使います。

Application.configure doからendまで間の最後に下の2行を加えます。

config.logger = Logger.new(config.paths["log"].first)
config.logger.formatter = Logger::Formatter.new

developments

保存したら、サーバを起動しましょう。

今まで、下のように見れていたログが

railslog

下の様になります。

rubylog2


独自ログフォーマットにする

独自ログフォーマットをする際にも、上の簡易的な設定を必ずしておいてください。
その上でrubyのLoggerクラスをオーバーライドして、独自のログのフォーマットを作ります。

railsのプロジェクトのconfigディレクトリの中の「environment.rb」を開きます。

開くと下のような感じになっていると思います。

environment

ファイルの

require File.expand_path('../application', __FILE__)

の後に下のコードを貼り付けてください。

class Logger
  class Formatter
    def call(severity, time, progname, msg)
      if msg.class.to_s == "String"
        if msg.present? && !msg.include?("assets") && !msg.include?("erb")
          format = "[%s #%d] %5s -- %s: %s\n"
          format % ["#{time.strftime('%Y-%m-%d %H:%M:%S')}.#{'%06d' % time.usec.to_s}",$$, severity, progname, msg2str(msg)]
        end
      end
    end
  end
end

environment2

これを保存します。

コードの詳しい説明

上の記述の重要なところを説明していきます。下の記述の部分がLoggerクラスの内部クラスのFormatterクラスのcallメソッドをオーバーライドしている場所です。

class Logger
  class Formatter
    def call(severity, time, progname, msg)
    end
  end
end

callメソッドの中のif文が重要です。始めのif文で引数のmsgがStringクラスかどうか確認します。もしも、nilクラスや別のクラスの場合は除外します。msgは体感的に殆どStringクラスですが、たまにnilクラスが混在するので、ここで除外します。msgがnilクラスの場合、2つ目のif文でpresentメソッドを使う時にエラーが出てきてきますので、もしも、このif文を変更する時は注意してください。

2つ目のif文でmsgが空かを始めに判定します。空のメッセージは表示しても余白が増えて邪魔なので除外します。

&&で続いて、msgにassetsの内容が書かれているか判定します。もしも、assetsの情報の場合はそれを除外します。ならぜなら、assetsの内容はcssやjsの読み込みが完了したかどうかなので、正直ログに残すほどの情報ではないからです。

&&で続いて、msgにerbが含まれていたら除外します。erbと書かれてメッセージはほとんどがviewのレンダ−が何々という情報なので、assetsの時と同じようにログに残す程の情報ではありません。かりにerbではなくてhamlを使っている場合はerbの部分をhamlに変更してください。

if msg.class.to_s == "String"
  if msg.present? && !msg.include?("assets") && !msg.include?("erb")
  end
end

最後のformatのところはloggerの内容を表示しています。
なにかこだわりの表示がない限りはそのままで平気でしょう。

format = "[%s #%d] %5s -- %s: %s\n"
format % ["#{time.strftime('%Y-%m-%d %H:%M:%S')}.#{'%06d' % time.usec.to_s}",$$, severity, progname, msg2str(msg)]

保存して、サーバを再起動します。
ログを見ると下の様になります。

goodlog

無駄な余白やassetsの情報がなくなって必要な情報が見やすくなりましたね。

まとめ

Loggerクラスのオーバーライドはどの様な表示の仕方が本当にログとして最適なのかまだ分かっていませんが、私は最近このフォーマットで開発しています。

スポンサードリンク

「為になったなぁ」と思ったら、シェアお願いします。

-サーバ, プログラミング
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

Ubuntuにmemcachedをインストールする方法と動作確認

概要 みなさんこんにちは、今回はubuntuにmemcachedを入れて、起動や、動作確認を行ってみたいと思います。 memcachedとは比較的短期間「key=>value」という形で値を保存するサ …

railsのform_forとstrong parametersを使用して画像をアップロードする

概要 みなさんこんにちはcandleです。今回はrailsのform_forを使って、railsプロジェクトのpublicディレクトリに画像をアップロードしてみましょう。 form_forは基本的にデ …

phpmyadminでmysqlデータベースの照合順序を変更する

概要 みなさんこんにちはcandleです。 ちょっとした事なのですが、意外に分からなかったのでまとめました。 phpmyadminを使ってデータベースを作ると、うっかり、utf8_general_ci …

AMIMOTO AMIのnginx上でvirtual hostを設定してphpサービスをリリースする

概要 みなさんこんにちはcandleです。今回はAMIMOTO AMIのnginx上でバーチャルホストを使う場合の設定をやってみたいと思います。 AMIMOTO AMIは高速でwordpressを作成 …

Mysqlの管理ユーザーを追加する

概要 みなさんこんにちはcandleです。今回はmysqlの管理者を加える方法です。 この記事は別段書かなくても、いくらでもweb上にあるのですが、私がよく使うのでまとめました。 前提 mysqlの実 …

  • English
  • 日本語

プロフィール


ベンチャー企業のCTOをやってます。大学時代にプログラミングを始め、javaから入門し、C++へて、PHPへと進み、会社ではRailsを使用。自動化が大好きなプログラマー

スポンサードリンク

アーカイブ