2017-01-15 1 views
-1

Je reçois une erreur de grok cohérente entre parenthèses. J'ai échappé au support avec un '\'. J'ai aussi essayé de le tromper avec des caractères génériques. Le débogueur Grok analyse correctement, mais ne parvient pas à analyser en production. J'ai deux autres entrées qui présentent le même comportement tandis que d'autres modèles sans parenthèses sont l'analyse.Grok échouant sur les parenthèses

Le '% {WORD: type} [% {INT: pid}]' est le problème.

#Jan 15 13:35:44 firewall sshd[1468]: Accepted publickey for john from 192.168.1.16 port 62529 ssh2: ..... 
AUTHLOG1 (%{SYSLOGTIMESTAMP:timestamp} %{WORD:src_host} %{WORD:type}\[%{INT:pid}\]: Accepted publickey for %{USERNAME:user} from %{IP:src_ip} port %{INT:port} %{WORD:protocol}*) 

#Jan 15 13:35:44 firewall systemd-logind[1221]: New session 481 of user john. 
AUTHLOG4 (%{SYSLOGTIMESTAMP:timestamp} %{WORD:src_host} (?<type>[a-z-]+)\[%{INT:pid}\]: Removed session %{INT:session}.) 

AUTHLOG (?:%{AUTHLOG1}|%{AUTHLOG2}|%{AUTHLOG3}|%{AUTHLOG4}|%{AUTHLOG5}|%{AUTHLOG6}) 

if [type] == "authlog" { 
     grok { 
       match => { "message" => "%{AUTHLOG}"} 
       patterns_dir => ["/etc/logstash/grok"] 
     } 
    } 
+0

Veuillez prendre le [Tour] (https://stackoverflow.com/tour), lisez [How To Ask] (https://stackoverflow.com/help/how-to-ask) et créez un [MCVE] (https://stackoverflow.com/help/mcve). –

+0

quelle est l'erreur – sweaver2112

+0

Je reçois un 'tags: _grokparsefailure' à Kibana. Logstash ne l'analyse pas correctement. –

Répondre

0

Vous vous moquez beaucoup de cette configuration. Tout d'abord, essayez d'abord d'extraire le contenu de syslog. Il est commun à chaque ligne, il est donc facile de l'aligner et de l'isoler, ne laissant que les éléments les plus uniques à analyser par les autres motifs. En d'autres termes, ne faites pas "date A | date B | date C" mais tirez sur la date et recherchez A, B, C. Les chaînes plus courtes exécutées contre des expressions régulières en court-circuit devraient être meilleures.

Ensuite, imaginez à quoi ressemble l'expression rationnelle sous-jacente que vous essayez d'utiliser. Je reste loin de "|" sauf dans de très petits modèles (type "On | Off"). Je ne l'ai pas mesuré les performances, mais je préfère le voir écrit:

match => { message => [ 
    "Pattern 1 %{WORD} ...", 
    "Pattern 2 %{WORD} ..." 
    ] 
} 

Pour commencer à répondre à votre question réelle, entre parenthèses dans les expressions régulières sont utilisées pour montrer les classes de caractères, par exemple "[a-z]". Pour dire à grok que vous voulez dire une parenthèse littérale, vous devez échapper seulement la parenthèse ouverte, par ex. "\ foo]" (comme le crochet de fermeture a perdu sa magie en n'étant pas associé à un brakcet d'ouverture). Il devrait être bien d'échapper à la fois pour la lisibilité, par exemple "\ [foo \]".

Votre exemple contient 6 modèles que vous appliquez sur chaque ligne d'entrée. Le grokparsefailure vous indique seulement qu'aucun d'entre eux ne correspond. Pour découvrir pourquoi, regardez le motif unique que vous attendiez. Si l'erreur n'est pas évidente, prenez le motif et votre ligne d'entrée dans le débogueur grok. Couper la 2ème moitié du motif et voir si cela correspond. Répétez jusqu'à ce que vous trouviez la partie qui se brise. Dans votre cas, le simple fait de coller le motif dans le débogueur m'a fait me demander pourquoi vous aviez des parenthèses autour du motif lorsqu'aucun n'apparait dans l'entrée. Sortez-les (et l'astérisque à la fin), et je pense que cela correspond.

+0

Merci pour le conseil. Beaucoup de choses à essayer ici –

0

OK, je l'ai compris. Cela n'avait rien à voir avec la manière dont j'avais échappé aux crochets. J'ai utilisé le mot réservé 'type' comme variable.