Rails - 错误日志回溯为JSON

时间:2016-11-12 21:21:21

标签: ruby-on-rails json ruby-on-rails-5 amazon-cloudwatch

我已经使用lograge将我的日志输出转换为生产中的JSON,这使得在亚马逊等多种日志服务上显示更容易。

config.lograge.enabled = true
  config.lograge.formatter = Lograge::Formatters::Logstash.new

  # add time to lograge
  config.lograge.custom_options = lambda do |event|
    params = event.payload[:params].reject { |k| %w(controller action).include?(k) }
    {
      time: event.time,
      params: params
    }
  end

但是,当发生错误时,也会记录错误回溯,但不会记录为JSON,而是记录正常的字符串(每个回溯条目一行= _ =)。这会产生许多不需要的线条(例如亚马逊CLoudwatch:)

F, [2016-11-12T18:08:09.774760 #15892] FATAL -- : [2f480b01-d8fa-459c-97dd-a904c98cfce9] SomeModule::SomeError (error explanation):

18:08:09
F, [2016-11-12T18:08:09.774790 #15892] FATAL -- : [2f480b01-d8fa-459c-97dd-a904c98cfce9]
i-xxx
F, [2016-11-12T18:08:09.774790 #15892] FATAL -- : [2f480b01-d8fa-459c-97dd-a904c98cfce9]

18:08:09
F, [2016-11-12T18:08:09.774813 #15892] FATAL -- : [2f480b01-d8fa-459c-97dd-a904c98cfce9] actionpack (5.0.0.1) lib/some_module.rb:53:in `call'
i-xxxxx
F, [2016-11-12T18:08:09.774813 #15892] FATAL -- : [2f480b01-d8fa-459c-97dd-a904c98cfce9] actionpack (5.0.0.1) lib/some_module.rb:53:in `call'

18:08:09
F, [2016-11-12T18:08:09.774834 #15892] FATAL -- : [2f480b01-d8fa-459c-97dd-a904c98cfce9] actionpack (5.0.0.1) lib/some_module.rb:31:in `call'
i-xxxxx
F, [2016-11-12T18:08:09.774834 #15892] FATAL -- : [2f480b01-d8fa-459c-97dd-a904c98cfce9] actionpack (5.0.0.1) lib/some_module.rb:31:in `call'

相反,我想把所有这些回溯压缩成一个看起来像

的json日志。
{
  error: 'SomeModule::SomeError (error explanation)',
  backtrace: [
    'some_gem (5.x) lib/some_module.rb:53:in `call', 
    'some_gem (5.x) lib/some_module.rb:31:in `call', ...]
} 

除了没有错误的请求的lograge json格式化之外,我该如何做呢?

1 个答案:

答案 0 :(得分:0)

您希望添加新路由以捕获所有RoutingError异常。 lograge自述文件很好地解释了要做什么(https://github.com/roidrage/lograge)。简而言之,您需要一条捕获“全部”的路由,即get '*unmatched_route', to: 'application#route_not_found'并将该路由发送到404,而不是触发异常。