2016-11-12 1 views
0

J'ai converti mes logs en JSON en production en utilisant lograge, cela facilite l'affichage sur plusieurs services de logs comme Amazon.Rails - Historique des erreurs en tant que 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 

Cependant, en cas d'erreur la trace d'erreur est également connecté, mais pas en tant que JSON, au lieu comme une chaîne normale (et une ligne par entrée backtrace = _ =). Cela crée beaucoup de lignes non désirées (par exemple sur Amazon 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' 

Au lieu de cela, je voudrais condenser tout cela backtrace dans un seul journal JSON qui ressemblerait

{ 
    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', ...] 
} 

Comment Je fais cela en plus de lograge json formatage pour les demandes sans erreurs?

Répondre

0

Vous souhaitez ajouter une nouvelle route pour capturer toutes les exceptions RoutingError. Le readme lograge explique bien ce qu'il faut faire (https://github.com/roidrage/lograge). En un mot, vous avez besoin d'une route qui attrape "tous", c'est-à-dire get '*unmatched_route', to: 'application#route_not_found' et avoir cette route vers un 404, plutôt que de déclencher une exception.

+0

Désolé l'exemple était réellement trompeur. J'attrape déjà des routes inégalées et elles ne provoquent plus d'exceptions dans mon application. Ma question concerne la gestion de toute erreur et pas seulement les erreurs de routage, je vais l'éditer pour choisir une autre erreur –

+0

Je vois. Oui, lograge n'est pas pour la journalisation des erreurs d'application. Vous pouvez essayer le gem 'logstash-logger' pour enregistrer les événements qui ressemblent à ce que lograge met (si vous utilisez la mise en forme de l'événement logstash). – Alex