個人のWebサービスにLogrageを入れてみたので導入方法とか使い方をメモしておきます📝
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プロトコルライクな感じでフォーマッターも作りやすく良いですね✨