freedom-man.com

ブログは俺のセーブポイント

Railsのlogger周りのコードリーディング

Railsのlogger周りのコードリーディングをしました。

今回は以下を見ていきます。

  • Rails.loggerがどこでどうやって設定されているか
  • config.log_tagsの設定値がどこでどうやって利用されているか
  • ActiveSupport::TaggedLoggingの実装

Rails.loggerについて

まずRails.loggerはRails::Application::Bootstrapモジュールのinitializerによって処理されます(Railtieのサブクラスの初期化と同じタイミングで処理されます)

config.loggerに設定されていればその値を使うし、そうでなければActiveSupport::LoggerのインスタンスをActiveSupport::TaggedLoggingでラップしたものをロガーとして使います。

formatterのデフォルト値は ActiveSupport::Logger::SimpleFormatterで、メッセージをそのままinspectで出力するようになっています。

config.log_tags

config.log_tagsを使うことで指定したタグをログの中に仕込むことができます。

config.log_tagsは::Rails::Rack::Loggerのミドルウェアのオプションとして利用されます。

Rails::Rack::Loggerの引数は@taggersとしてタグの配列がセットされます。ActiveSupport::TaggedLoggingが利用されていればloggerはtaggedメソッドが実装されているので、logger.taggedで囲った上でapp.callします。

#compute_tagsで生成されるタグ値はSymbolであればrequest変数のメソッドを呼ぶことになるので:request_idが入っていた場合はActionDispatch::Request#request_idがタグとして利用されます。

#call_appはActiveSupport::Notificationsを操作しつつ、startのログを出力します。Railsのログでよく見る Start GET /path for xxx.xxx.xxx.xxx at yyyy-mm-dd HH:MM:SSみたいなログはここで生成されていることになります。

ちなみにActionDispatch::Request#request_idは以下のような定義になっています。

このrequest_idはActionDispatch::RequestIdのミドルウェアによって設定されます。ActionDispatch::Requestのインスタンス経由でenv[ACTION_DISPATCH_REQUEST_ID]を書き換えつつ、レスポンスのHTTPヘッダであるX-Request-IdにリクエストIDをセットしています。

ActiveSupport::TaggedLogging

以下のような実装になっています。#taggedは#push_tags経由で#current_tagsに指定したタグを追加した後ブロックをyieldします。#callはtags_text付きでメッセージを表示し、#tags_textはcurrent_tagsの分、[#{tag}] の文字列を追加します。

 


2 Comments

  1. このブログの影響を受けて最近私もgemのコードリーディングを始めました。いつもありがとうございます。
    (「RubyGemコードリーディングのすすめ」とかとてもよかったです)

    • freedom-man

      2018年2月26日 at 1:07 AM

      コメントありがとうございます!!!
      コードリーディングの記事は自分用のメモ書きでほぼ自己満でやってるような感じなんですが、お役に立てたようでめちゃくちゃ嬉しいです!!
      これからもコードリーディング系の記事は書いていこうと思うので、よろしければ引き続きよろしくお願いしますーm(_ _)m

コメントを残す

Your email address will not be published.

© 2018 freedom-man.com

Theme by Anders NorenUp ↑