2017-10-20 22 views
1

J'essaie d'envoyer des chaînes json à logstash puis à kafka, mais je continue à rencontrer des échecs d'analyse json en raison des doubles guillemets échappés dans mon fichier json.Entrée Logstash JSON avec échappement double guillemet

J'ai essayé un tas de différentes combinaisons de la remplacer, mais rien ne fonctionne. Je ne sais pas si

  1. L'erreur se produit déjà dans le côté entrée de la configuration, il est donc ne pas continuer à la partie du filtre
  2. Je suis tout simplement pas remplacer les cordes correctement

Je reçois un JSON comme:

{"message": "This is a \"string with quote"} 

Mon logstash CONF:

input { 
    tcp { 
    codec => json { charset => "UTF-8" } 
    port => 10000 
    } 
} 

filter { 
    json { 
    source => "message" 
    } 
    mutate { 
    remove_field => ["@version", "@timestamp", "host", "port"] 
    gsub => [ 
     # replace all backslashes + double quote with space 
    'body', '\\"', ' ' 
    ] 
    } 
} 

output { 
    kafka { 
    bootstrap_servers => "localhost:9092" 
    codec => json {charset => "UTF-8"} 
    topic_id => 'logstash_logs' 
    } 

file { 
    path => "/usr/share/logstash/test.log" 
    codec => rubydebug 
    } 
} 

Mon journal est rubydebug:

{ 
    "message" => "{\"message\": \"This is a \"string with quote\"}", 
     "tags" => [ 
     [0] "_jsonparsefailure" 
    ] 
} 
+0

Quel est le message source complet? –

+0

Le message que je reçois actuellement sont des articles d'actualité provenant de sources d'information de première qualité. Un extrait ressemble à ceci: {"an": "AFNWS00020150624eb6o0006h", "body": "La foire est destinée à montrer le potentiel des énergies renouvelables, ... \ n \ n \" Nous électrisons les zones rurales qui sont longues "Nous avons donné la priorité aux panneaux solaires pour fournir de l'électricité aux infrastructures sociales telles que les écoles et les hôpitaux". – Merelda

Répondre

0

Le diagnostic est _jsonparsefailure ici, qui me dit qu'il était le filtre json {} qui a échoué. Depuis logstash is using their own parsing gem qui utilise the jrjackson gem, vous pouvez tester une partie de cette analyse si vous avez jruby à portée de main.

JrJackson::Ruby.parse(data, options) 

rescue JrJackson::ParseError => e 
    raise LogStash::Json::ParserError.new(e.message) 
end 

C'est le segment de code qui est à défaut votre analyse syntaxique, c'est donc probablement un bogue dans l'analyseur jrjackson. Si vous pouvez obtenir une reproduction propre, consider reporting it as an issue on the gem. Si ce n'est pas le cas, il s'agit d'un candidat pour le reporting sur the logstash-filter-json project's issue-tracker.

Pour contourner ce problème, vous devrez "réparer" la ligne de journal avant de l'analyser. C'est une regex gnarly.