Programming log - Shindo200

イベント参加記録とプログラミング系の雑記

RailsのアクセスログのフォーマットをカスタマイズできるGemを作りました

jpmobileを使っているRailsアプリで、あるUserAgentを持つクライアントからのアクセスのみエラーが出る症状が発生しました。Errbitなどのエラー監視サービスを利用すれば、どのUserAgentを持つクライアントのときにエラーが発生するかすぐにわかるのですが、ローカル環境でも使うことができて、もう少しお手軽にUserAgentを確認したいと思いまして、RailsアクセスログにUserAgentを残すことができるようになるGemを作りました。UserAgentだけを残すことができれば十分だったのですが、せっかくなのでApacheのLogFormatのように細かくカスタマイズできるような作りにしてみました。

Custom Rails Logger
odaillyjp/custom_rails_logger · GitHub

導入

Gemfileに今回作成したGem「custom_rails_logger」を追加し、インストールします。

Gemfile

gem 'custom_rails_logger'

ターミナル

$ bundle install

config/initializer 配下に「custom_rails_logger.rb」というファイルを作成します。このファイルの中で CustomRailsLogger.config.started_request_message_format というプロパティにログの書式を設定します。

config/initializers/custom_rails_logger.rb

CustomRailsLogger.configure do |config|
  config.started_request_message_format = 'Started %m "%f" for %a by %u at %t'
end

「%」の後にフォーマット文字を入れた場合はフォーマット文字列として扱われて、ログ出力時に特殊な値に置換されます。使用できるフォーマット文字列は次の通りです。

フォーマット文字列 説明
%% パーセント記号
%a リクエスト元のIPアドレス
%{Foobar}C Foobarというキーを持つクッキーの値
%{Foobar}e リクエストヘッダーFoobarの値
%f パス名
%h ホスト名
%m HTTPメソッド
%p ポート番号
%s スキーム名
%t リクエストを受け取った時間
%u UserAgent


例えば、書式に「Started %m "%f" for %a by %u at %t」を指定した場合は、アクセスログが次のように出力されます。

Started GET "/session/new" for 128.0.0.1 by Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0 at 2012-09-26 14:51:42 -0700

「%u」の部分がUserAgentになりますので、本来は出力されないUserAgentが出力されているのがわかるかと思います。「アクセスログのフォーマットを変更したい」という方は、ぜひ使ってみてください。