joppot

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

サーバ プログラミング

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

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


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 の環境が整っている


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

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

あなたが作成した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

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

関連記事

wordpress skeletonをnginx の本番環境でfabricを使って運用してみる

はじめに みなさんこんにちはcandleです。今回はskeletonを使用してwordpressを開発している時に、それを本番環境でどう使うかを試してみたいと思います。 本番環境はローカルのvagra …

Hiragino Sansフォントウェイトのcss書き方まとめ

概要 みなさんこんにちはcandleです。今回はHiragino Sansのcssの書き方を紹介します。 Hiragino Sansの特徴はフォントの太さを1から9段階まで変えられることです。 一方で …

CentOSのfluentdでapacheのaccess logとerror logを取得する

概要 みなさんこんにちはcandleです。今回はapacheのアクセスログとエラーログをfluentdを使って取得して見たいと思います。 前提 一台のサーバ上にapacheサーバとfluentdサーバ …

ruby on railsに最強のwysiwygエディタ、Squireを導入する

概要 みなさんこんにちはcandleです。今回はruby on railsにsquire editorを導入したいと思います。 squireはオープンソースの便利なwysiwygエディタです。 カスタ …

C++のopencvでhelloworld

概要 (追記、2018年11月に書き直しました) みなさんこんにちはcandleです。インストールできたopencvを使ってhelloworldを行いましょう。 opencvでhelloworldとは …

  • English
  • 日本語

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