Ruby Logger在每一行添加上下文信息

时间:2017-03-16 13:24:27

标签: ruby logging

会发生什么:

$logger.info("progname"){"msg_line1\nmsg_line2"}
I, [2017-03-16T14:14:01.426134 #846807]  INFO -- progname: msg_line1
msg_line2

我想要实现的目标:

$logger.info("progname"){"msg_line1\nmsg_line2"}
I, [2017-03-16T14:14:01.426134 #846807]  INFO -- progname: msg_line1
I, [2017-03-16T14:14:01.426134 #846807]  INFO -- progname: msg_line2

我已经尝试过了:

$logger = Logger.new(STDOUT)
original_formatter = Logger::Formatter.new
$logger.formatter = proc { |severity, datetime, progname, msg|
   msg.each_line do |line|
     original_formatter.call(severity, datetime, progname, line)
   end
 }

发生了什么:

$logger.info("progname"){"msg_line1\nmsg_line2"}
msg_line1
msg_line2=> true

有人可以帮帮我吗?我不知道为什么我的代码不起作用。

1 个答案:

答案 0 :(得分:1)

formatter proc应该返回一个字符串,而不仅仅是将方法调用委托给另一个格式化程序。

目前,您的msg.each_line会返回msg_line1 msg_line2 的内容:

p

您可以通过在original_formatter.call(...之前添加require 'logger' $logger = Logger.new(STDOUT) original_formatter = Logger::Formatter.new $logger.formatter = proc { |severity, datetime, progname, msg| msg.split("\n").map do |line| original_formatter.call(severity, datetime, progname, line) end.join } $logger.info('progname') { "msg_line1\nmsg_line2" } # I, [2017-03-16T15:08:40.688193 #5372] INFO -- progname: msg_line1 # I, [2017-03-16T15:08:40.688193 #5372] INFO -- progname: msg_line2 来检查格式化程序是否正确完成了这项工作。只是你没有使用结果。

以下是您的代码的修改版本:

{{1}}