Ruby標準のLoggerでスレッドIDを出力する

  • このエントリーをはてなブックマークに追加

その1 / procを指定する

formatterにprocを直接指定する。
色々と制限があります。あまりオススメしません。


def main(logger)
logger.info("main"){ "こんにちは" }
begin
raise "エラー"
rescue => err
logger.error("main"){ err }
end
end

custom = Logger.new(STDOUT, formatter: proc { |severity, time, progname, msg|
# msgが例外の場合、originalは表示されるけど、これはされない
"%s, [%s#%d/#%d] %5s -- %s: %s\n" % [severity[0..0], time.strftime("%Y-%m-%dT%H:%M:%S.%6N "), Process.pid, Thread.current.object_id, severity, progname, msg]
})
main(custom)
I, [2021-07-11T10:36:43.688551 #4163]  INFO -- main: こんにちは
E, [2021-07-11T10:36:43.688635 #4163] ERROR -- main: エラー (RuntimeError)
app.rb:7:in `main'
app.rb:14:in `<main>'

その2 / Logger::Formatterを継承する

Logger::Formatterを継承して自分用のFormatterを作り、Loggerのfometterに指定します。
この方法は直接Procを指定するわけではないので、標準クラスが持っているメソッドであるformat_datetimemsg2strが使えます。


def main(logger)
logger.info("main"){ "こんにちは" }
begin
raise "エラー"
rescue => err
logger.error("main"){ err }
end
end

class CustomFormatter < Logger::Formatter
CustomFormat = "%s, [%s#%d/#%d] %5s -- %s: %s\n".freeze
def initialize
super
end
def call(severity, time, progname, msg)
CustomFormat % [severity[0..0], format_datetime(time), Process.pid, Thread.current.object_id, severity, progname, msg2str(msg)]
end
end
custom2 = Logger.new(STDOUT, formatter: CustomFormatter.new)
main(custom2)

I, [2021-07-11T10:36:43.688747 #4163/#70368626219440]  INFO -- main: こんにちは
E, [2021-07-11T10:36:43.688773 #4163/#70368626219440] ERROR -- main: エラー (RuntimeError)
app.rb:7:in `main'
app.rb:32:in `<main>'

参考