2016-11-12 35 views
0

我已經使用lograge在生產中將我的日誌輸出轉換爲JSON,它使它更容易在多個日誌服務(如亞馬遜)上顯示。Rails - 錯誤日誌回溯作爲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格式化請求而不出錯之外,我這麼做了嗎?

回答

0

您想添加一條新路由來捕獲所有RoutingError異常。 lograge自述文件很好地解釋了要做什麼(https://github.com/roidrage/lograge)。簡而言之,您需要一條能夠捕捉「全部」的路線,即get '*unmatched_route', to: 'application#route_not_found'並將該路線設置爲404,而不是觸發例外。

+0

對不起,這個例子實際上是誤導性的。我已經在捕捉無與倫比的路線,並且在我的應用程序中不會再引發異常。我的問題是關於處理任何錯誤,而不僅僅是路由錯誤,我會編輯它來選擇一個不同的錯誤 –

+0

我明白了。是的,lograge不適用於記錄應用程序錯誤。您可以嘗試'logstash-logger'gem來記錄看起來像lograge顯示的事件(如果使用logstash事件格式)。 – Alex