限制Rails中日志输出的长度

时间:2017-11-14 01:07:36

标签: ruby-on-rails actionpack actiondispatch

我有一个接受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错误的情况下它们没有。

1 个答案:

答案 0 :(得分:1)

我最终创建了一个自定义格式化程序,只是直接操作字符串

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