2017-02-14 1 views
1

Je suis confronté à un problème lors de l'utilisation de Grok filer. Voici mon filtre qui fonctionne comme prévu jusqu'à ce que le nom de la classe ne contienne pas $. Lorsque le nom du fil est comme PropertiesReader $ il échoue. Quoi d'autre puis-je utiliser pour pouvoir analyser le nom de classe avec des caractères spéciaux?

filter { 
     grok { 
      match => [ "message", "%{TIMESTAMP_ISO8601:LogDate} %{LOGLEVEL:loglevel} %{WORD:threadName}:%{NUMBER:ThreadID} - %{GREEDYDATA:Line}" ] 
     } 
     json { 
      source => "Line" 
     } 
     mutate { 
      remove_field => [ "Line" ] 
     } 
} 

Répondre

0

Vous utilisez WORD comme modèle pour votre nom de thread qui ne contient pas de caractères spéciaux. Pour confirmer cela, jetons un oeil à ce modèle: WORD \b\w+\b

Utilisez un motif personnalisé. Juste descibe dans un fichier comme celui-ci:

MYPATTERN ([A-z]+\$?) 

Ensuite, vous pouvez l'utiliser dans votre config comme ceci:

grok { 
    patterns_dir => ["/path/to/pattern/dor"] 
    match => [ "message", "%{TIMESTAMP_ISO8601:LogDate} %LOGLEVEL:loglevel} %{MYPATTERN:threadName}:%{NUMBER:ThreadID} - %GREEDYDATA:Line}" ] 
    } 

Vous trouverez plus d'informations sur les modèles personnalisés dans le docs

+0

Merci Cela a fonctionné. – BobCoder

2

Vous n'êtes pas limité à grok noms de modèles. Vous pouvez faire n'importe quelle regex. Par exemple à la place de %{WORD:threadName} vous pouvez mettre (?<threadName>[^:]+) qui dit pour correspondre à tout caractère qui n'est pas un : et l'assigner à threadName.

0

Vous pouvez également essayer avec %{DATA:threadName} au lieu de %{WORD:threadName}, si votre threadName ne contient pas d'espaces ou de deux-points.