2017-10-17 3 views
0

J'espère vraiment que quelqu'un m'aidera avec cette question, car j'ai essayé de le comprendre pendant des jours.Comment modifier le niveau de gravité (INFO, ERROR, WARNING, etc.) du message de journal dans Fluentd en fonction d'un mot-clé dans la charge utile du journal?

J'ai un conteneur fonctionnant dans des kubernetes dans GKE. En /var/log/containers/my_container.log, j'ai quelque chose comme ça (parmi d'autres journaux avec des formats différents):

{"log":"17-Oct-2017;04:36:29.744 : [main] [server:] [id:] [yt:] ERROR no.myproject.service.Server - call failed for some reason\n","stream":"stdout","time":"2017-10-17T04:36:29.750702216Z"} 

Ce journal apparaît sur Stackdriver (sortie Fluentd dans GKE) comme journal et comme INFO :

23:02:32.000 17-Oct-2017;04:36:29.744 : [main] [server:] [id:] [yt:] ERROR no.myproject.service.Server - call failed for some reason 

Alors

23:02:32.000 

est ajouté (ce qui est le comportement normal de Stackdriver). Je vais me référer à ce format comme format 2.

Comme ce message de journal est en fait un message de journal ERROR (basé sur son contenu de charge utile), je veux qu'il apparaisse comme ERREUR dans Stackdriver (Fluentd).

Je suis en train:

<filter reform.**> 
    type parser 
    format /^(?<time>\d{2} [^\s]*) : (?<message2>[^ \]]*)\] (?<message3>[^ \]]*)\] (?<message4>[^ \]]*)\] (?<message5>[^ \]]*)\] (?<severity>\w)\s+(?<log2222>.*)/ 
    reserve_data true 
    suppress_parse_error_log false 
    key_name log 
</filter> 

l'espoir d'obtenir la gravité du changement de message d'erreur et aussi obtenir le contenu des [..] champs dans le journal que des nouvelles valeurs clés/(dans ce cas message2: principal, etc). Mais après avoir ajouté ce filtre à mon fichier de configuration, les journaux de sortie sont toujours comme avant et je ne vois aucun changement.

Qu'est-ce qui me manque? Quand j'écris mon motif Regex, je ne suis pas sûr si je devrais vraiment considérer le champ "log" du message dans le fichier journal dans kubernetes ou celui que j'ai appelé le format 2 (avec le temps ajouté - sur Stackdriver) .

J'apprécierais vraiment tout conseil, ce serait une aide précieuse.

Répondre

0

Je ne connais pas l'outil que vous utilisez, mais il semble que la première partie de votre expression régulière ne correspond pas au format exact de l'heure préfixée dans votre chaîne de journal. En réalité, \d{2} ne correspondra qu'à 2 chiffres.

Pour correspondre au préfixe de temps entier, vous pouvez utiliser (?:\d{2}:){2}\d{2}\.\d{3} à la place.

Un point supplémentaire concernant la gravité: vous avez écrit (?<severity>\w) qui capture uniquement un caractère de mot. Vous pouvez utiliser (?<severity>\w+) pour faire correspondre plusieurs caractères.

Votre regex deviendrait alors:

^(?<time>(?:\d{2}:){2}\d{2}\.\d{3} [^\s]*) : (?<message2>[^ \]]*)\] (?<message3>[^ \]]*)\] (?<message4>[^ \]]*)\] (?<message5>[^ \]]*)\] (?<severity>\w+)\s+(?<log2222>.*) 

Que demo chaussures un match.

+0

Merci beaucoup. Maintenant, je capture la gravité de la charge utile dans la sortie. J'ai une autre question. Je m'attendais aussi à ce que dans la sortie les nouveaux champs de message2 à message 5 et log2222 soient ajoutés, mais aucun nouveau champ n'est ajouté. Comment puis-je extraire certaines données de la charge de texte de journal et l'obtenir comme un nouveau champ supplémentaire dans la sortie (comme "message2: [main]" dans l'exemple ci-dessus)? – samanta

+0

De rien.Je ne connais pas votre outil, donc je ne suis pas sûr que cela puisse vous aider mais, si vous pouvez spécifier des chaînes de remplacement, vous pouvez alors utiliser '$ {severity} message2: $ {message2}' en remplacement. Vous obtiendrez alors ERROR message2: [main''. Voir la nouvelle version [ici] (https://regex101.com/r/o5lu2j/2). – PJProudhon