限制日志输出的长度 Rails
Restrict length of log output in Rails
我有一个接受 base64 编码图像的 API。请求看起来像:
{
image: "ijt41ig8ahbha8oij4j1tjletc"
}
base64 编码的字符串可能非常大,有时有 10k - 100k 个字符。当发送格式不正确的请求 JSON 时,Active Dispatch 会正确引发错误并记录请求:
ActionDispatch::ParamsParser::ParseError (765: unexpected token at '{
"image": "iVlBWsBo4OQT1Mm7AZbIBV3h8mwtvLdakElJ6U1ksbQsl3URJ
iVlBWsBo4OQT1Mm7AZbIBV3h8mwtvLdakElJ6U1ksbQsl3URJ
iVlBWsBo4OQT1Mm7AZbIBV3h8mwtvLdakElJ6U1ksbQsl3URJ
iVlBWsBo4OQT1Mm7AZbIBV3h8mwtvLdakElJ6U1ksbQsl3URJ"
}'):
actionpack (5.0.5) lib/action_dispatch/http/parameters.rb:88:in `rescue in parse_formatted_parameters'
actionpack (5.0.5) lib/action_dispatch/http/parameters.rb:82:in `parse_formatted_parameters'
actionpack (5.0.5) lib/action_dispatch/http/request.rb:354:in `block in POST'
etc
在这种情况下,错误是由编码中的新行引起的。
我的问题是,限制日志记录不显示有时 50k 字符长的图像字符串的好方法是什么?这会填满我的日志文件并使查看日志变得困难。我确实希望记录错误,我只想将字符串切片以显示前 255 个字符而不是大图像。
我知道 ActionDispatch 有一些过滤属性(例如密码)的好方法,但假设参数已被解析为散列,在 JSON 错误的情况下它们没有.
我最终创建了一个自定义格式化程序并直接操作字符串
class CustomFormatter < Logger::Formatter
def call(severity, time, program_name, message)
if message =~ /"image": /
message.gsub!(/(?<="image": )".+"/m) { |image| image[0..255] + "_TRUNCATED_" }
end
super
end
end
然后只需在您的配置文件中使用该格式化程序
config.logger = Logger.new(STDOUT).tap do |logger|
logger.formatter = CustomFormatter.new
end
我有一个接受 base64 编码图像的 API。请求看起来像:
{
image: "ijt41ig8ahbha8oij4j1tjletc"
}
base64 编码的字符串可能非常大,有时有 10k - 100k 个字符。当发送格式不正确的请求 JSON 时,Active Dispatch 会正确引发错误并记录请求:
ActionDispatch::ParamsParser::ParseError (765: unexpected token at '{
"image": "iVlBWsBo4OQT1Mm7AZbIBV3h8mwtvLdakElJ6U1ksbQsl3URJ
iVlBWsBo4OQT1Mm7AZbIBV3h8mwtvLdakElJ6U1ksbQsl3URJ
iVlBWsBo4OQT1Mm7AZbIBV3h8mwtvLdakElJ6U1ksbQsl3URJ
iVlBWsBo4OQT1Mm7AZbIBV3h8mwtvLdakElJ6U1ksbQsl3URJ"
}'):
actionpack (5.0.5) lib/action_dispatch/http/parameters.rb:88:in `rescue in parse_formatted_parameters'
actionpack (5.0.5) lib/action_dispatch/http/parameters.rb:82:in `parse_formatted_parameters'
actionpack (5.0.5) lib/action_dispatch/http/request.rb:354:in `block in POST'
etc
在这种情况下,错误是由编码中的新行引起的。
我的问题是,限制日志记录不显示有时 50k 字符长的图像字符串的好方法是什么?这会填满我的日志文件并使查看日志变得困难。我确实希望记录错误,我只想将字符串切片以显示前 255 个字符而不是大图像。
我知道 ActionDispatch 有一些过滤属性(例如密码)的好方法,但假设参数已被解析为散列,在 JSON 错误的情况下它们没有.
我最终创建了一个自定义格式化程序并直接操作字符串
class CustomFormatter < Logger::Formatter
def call(severity, time, program_name, message)
if message =~ /"image": /
message.gsub!(/(?<="image": )".+"/m) { |image| image[0..255] + "_TRUNCATED_" }
end
super
end
end
然后只需在您的配置文件中使用该格式化程序
config.logger = Logger.new(STDOUT).tap do |logger|
logger.formatter = CustomFormatter.new
end