こちらはAteam Finergy Inc. Advent Calendar 2019 - Qiita 16日目の記事になります。
はじめに
Railsのログ出力に標準の形式以外のものを使いたいことがあると思います。
例えばエイチームフィナジーのサービスでは、ログ解析にCloudWatchLogsやElasticSearchやKibanaを使用しています。
これらのサービスと連携するために、JSON形式のほうが扱いやすいので、RailsのログをJSON形式で出力しています。
この記事では、JSON形式でログ出力をするためのsemantic_loggerというgemを紹介します。
semantic_loggerとは
semantic_loggerとは、Ruby Railsのログ出力をカスタマイズすることができるgemです。
JSON形式でログ出力する設定をできます。
Rocket Jobというジョブスケジュールシステムを作っているところが作っています。
導入方法
今回はrailsのログをjsonで出力する方法を紹介しようと思います。
-
Gemfileに追加
gem 'rails_semantic_logger'
-
bundle install
bundle install
-
rails server起動
bundle exec rails s
-
確認
2019-12-08 11:49:38.614204 D [20892:puma threadpool 003] ActionView -- Rendering -- {:template=>"vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/templates/rails/welcome/index.html.erb"} 2019-12-08 11:49:38.619906 D [20892:puma threadpool 003] (5.616ms) ActionView -- Rendered -- {:template=>"vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/templates/rails/welcome/index.html.erb"} 2019-12-08 11:49:38.620177 I [20892:puma threadpool 003] (11.4ms) Rails::WelcomeController -- Completed #index -- {:controller=>"Rails::WelcomeController", :action=>"index", :format=>"HTML", :method=>"GET", :path=>"/", :status=>200, :view_runtime=>6.71, :db_runtime=>0.0, :status_message=>"OK"}
ファイル出力しない設定
例えばAWS ECS Cloudwatch Logs連携をしていたりする場合、標準出力からCloudwatch Logsへログの内容が送られるため、ファイル出力が不要です。
なのでその場合の設定を追記します。
touch config/initializers/semantic_logger.rb
config.rails_semantic_logger.add_file_appender = false
config.semantic_logger.add_appender(io: $stdout, level: config.log_level, formatter: :json)
puma clustered modeを使用する場合
puma でclustered modeを使用している場合はpuma.rbの設定をする必要がありますので、追記します。
on_worker_boot do
# Re-open appenders after forking the process
SemanticLogger.reopen
end
まとめ
このようにsemantic_loggerを使用することによって、簡単にJSONのログ出力をすることができました。
Railsを使っているプロジェクトでログ出力をカスタマイズしたい場合に便利なので、使ってみてください。