Rails.logger
を拡張してJSON形式の構造化ロギングを自作してみるシリーズの1回目
Rails.logger
でJSON形式のログが出力されるところまで。
Ruby標準ライブラリのLogger::Formatter
を継承してサブクラスを作成する。
call
メソッドで受け取れる各パラメーターをJSON文字列に変換する。
config/json_formatter.rb
class JsonFormatter < ::Logger::Formatter
def call(severity, timestamp, progname, msg)
{
severity:,
timestamp:,
progname:,
msg:
}.to_json
end
end
JsonFormatter
クラスのオブジェクトに設定するconfig.logger
に作成したloggerを渡すconfig/environments/development.rb
...
require_relative "../json_formatter"
...
logger = Logger.new("development.log")
logger.formatter = JsonFormatter.new
config.logger = logger
構造化ログが出力されることを確認できた。
{"severity":"INFO","timestamp":"2025-09-07T09:10:11.188+00:00","progname":null,"msg":"Completed 200 OK in 162ms (Views: 25.5ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 1.3ms)\n\n"}
ただし、msg
(ログの本文)は構造化されておらず、このままだと構造化ログとして不完全である。
Loggerクラスを拡張して、ログの本文が構造化された状態でFormatterに受け渡しできるようにしたい。
次回は、Rails.logger.info
などseverity毎のメソッドにメッセージに加えて、hashとしてログの本文を渡せるようにしていく。