Madogiwa Blog

主に技術系の学習メモに使っていきます。

Ruby on Rails: Logrageを使ってRailsのログ出力をいい感じにするMEMO📝

個人のWebサービスにLogrageを入れてみたので導入方法とか使い方をメモしておきます📝

github.com

Logrageとは?

Lograge is an attempt to bring sanity to Rails' noisy and unusable, unparsable and, in the context of running multiple processes and servers, unreadable default logging output. GitHub - roidrage/lograge: An attempt to tame Rails' default policy to log everything.

だいぶ強い文言ですが、Railsのログ出力をいい感じにしてくれるgemです🚃

以下にREADMEに記載されている使用前と使用後のログを載せましたが、使用後のほうが1行で表示されており見やすいですね👀

使用前

Started GET "/" for 127.0.0.1 at 2012-03-10 14:28:14 +0100
Processing by HomeController#index as HTML
  Rendered text template within layouts/application (0.0ms)
  Rendered layouts/_assets.html.erb (2.0ms)
  Rendered layouts/_top.html.erb (2.6ms)
  Rendered layouts/_about.html.erb (0.3ms)
  Rendered layouts/_google_analytics.html.erb (0.4ms)
Completed 200 OK in 79ms (Views: 78.8ms | ActiveRecord: 0.0ms)

使用後

method=GET path=/jobs/833552.json format=json controller=JobsController  action=show status=200 duration=58.33 view=40.43 db=15.26

Logrageの使い方

Logrageを導入する

Logrageを単に導入するのは簡単で以下の通りGemfileに記載後にbundle installを実行し、

gem "lograge"

config/initializer配下に以下を記載したrubyファイルを配置します。

Rails.application.configure do
  config.lograge.enabled = true
end

これでLogrageによってフォーマットされたログが出力されるようになります✨

※デフォルトではLograge::Formatters::KeyValueを使ったフォーマットが行われます。   lograge/key_value.rb at master · roidrage/lograge · GitHub

ログ出力項目を追加する

ログ出力項目を追加する場合には以下のような形でconfig.lograge.custom_optionsに追加したい項目のhashを返却するlamda(引数にeventを取ってcallが定義されているインスタンスであれば何でも良さそう)を渡してあげます。

Rails.application.configure do
  config.lograge.enabled = true
  config.lograge.custom_options = ->(event) { { time: Time.current } }
end

以下のようにtime=2021-05-23 17:15:47 +0900が追加されています🕛

method=GET path=/jobs/833552.json format=json controller=JobsController  action=show status=200 duration=58.33 view=40.43 db=15.26 time=2021-05-23 17:15:47 +0900

独自に作成したフォーマッターを使用する

独自に定義したフォーマッターも使用するこができ、以下は私が作ったHTTPステータスコードを表すアイコンを表示するログフォーマッターです。

# frozen_string_literal: true

require 'lograge'

class Lograge::Formatters::MarkedKeyValue < Lograge::Formatters::KeyValue
  INFO_MARK = '🙂'
  SUCCES_MARK = '😃'
  REDIRECT_MARK = '😗'
  CLIENT_ERROR_MARK = '🤔'
  SERVER_ERROR_MARK = '😱'

  def call(data)
    result = super(data)
    mark = status_to_mark(data[:status].to_i)
    "#{mark} #{result}"
  end

  def status_to_mark(status)
    case status
    when 100...200 then INFO_MARK
    when 200...300 then SUCCES_MARK
    when 300...400 then REDIRECT_MARK
    when 400...500 then CLIENT_ERROR_MARK
    when 500...    then SERVER_ERROR_MARK
    else ' '
    end
  end
end

以下のような形でconfig.lograge.formatterインスタンスを渡して上げると、

require Rails.root.join('lib/lograge/formatters/marked_key_value')

Rails.application.configure do
  config.lograge.enabled = true
  config.lograge.formatter = Lograge::Formatters::MarkedKeyValue.new
  config.lograge.custom_options = ->(event) { { time: Time.current } }
end

以下のような形で出力されます🙌

😃 method=GET path=/api/feeds format=html controller=Api::FeedsController action=index status=200 duration=5.92 view=0.16 db=0.33 time=2021-05-23 16:21:12 +0900
😃 method=GET path=/feeds/533 format=html controller=FeedsController action=show status=200 duration=13.04 view=9.63 db=0.00 time=2021-05-23 16:21:24 +0900
😱 method=GET path=/api/feeds/533 format=html controller=Api::FeedsController action=show status=500 error='RuntimeError: ' duration=0.44 view=0.00 db=0.00 time=2021-05-23 16:21:24 +0900

おわりに

lograge、rackプロトコルライクな感じでフォーマッターも作りやすく良いですね✨