Skip to main content

3.ログのフォーマット

Rails のログのフォーマットはデフォルトではあまり親切には作られていない。 これはその1つの例である。

Started GET "/routes" for 127.0.0.1 at 2022-05-23 12:25:52 +0900
(0.1ms) SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC

ActionController::RoutingError (No route matches [GET] "/routes"):

上のログには時間と各ログのレベル(デバッグ、インフォ、警告、エラー)が表記されておらず、 後から検索したりぱっと見で問題の箇所を探すのが困難である。

Rails のログのフォーマットは各変更できるので、フォーマットをオーバーライドする。

config/environment.rbを開き、ファイルの一番下にフォーマットを追加する。

# Log format
class Logger::Formatter
def call(severity, time, progname, msg)
format = "%s, [%s #%d] %5s -- %s: %s\n"
format % [severity[0], "#{time.strftime('%Y-%m-%dT%H:%M:%S')}.#{'%06d' % time.usec.to_s}", $$, severity, progname, msg2str(msg).strip]
end
end

config/environments/development.rbを開き、Rails.application.configure doの中に加える。

# Override Log format
config.logger = Logger.new(config.paths['log'].first)
config.logger.formatter = Logger::Formatter.new

上の同じログと比較すると、コンパクトにまとまったログが表示される。

I, [2022-05-23T12:50:01.922585 #75748]  INFO -- : Started GET "/routes" for 127.0.0.1 at 2022-05-23 12:50:01 +0900
D, [2022-05-23T12:50:01.943627 #75748] DEBUG -- : (0.1ms) SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC
F, [2022-05-23T12:50:01.945024 #75748] FATAL -- : ActionController::RoutingError (No route matches [GET] "/routes"):

config/environments/production.rbファイルを見ると、development.rbで設定したconfig.logger.formatter = Logger::Formatter.newと同じ記述があるため、 本番環境でも上のようなフォーマットでログが保存される。

git add .
git commit -m "Change the log format"