[JAVA] Améliorons un peu le fonctionnement en surveillant et en notifiant le journal multiligne par mot-clé

introduction

Une petite histoire.

La surveillance des mots-clés des journaux qui sont terminés en une seule ligne, tels que les journaux Apache, peut être réalisée relativement facilement. Par exemple, le journal des erreurs d'Apache est complet avec une ligne et est surveillé par des mots-clés tels que [error] et [alert] [crit].

[Wed Oct 11 14:32:52 2000] [error] [client 127.0.0.1] client denied by server configuration: /export/home/live/ap/htdocs/test

Lorsque vous obtenez une trace de pile en Java, ce sera plusieurs lignes. Cela doit être surveillé avec le mot-clé ERREUR.

2017-2-01 13:33:21 [main] ERROR Unexpected Error
java.lang.NumberFormatException: For input string: "1.1"
        at java.lang.NumberFormatException.forInputString(Unknown Source)
        at java.lang.Integer.parseInt(Unknown Source)
        at java.lang.Integer.<init>(Unknown Source)
        at ExceptionPrintDemo.formatInt(ExceptionPrintDemo.java:7)
        at ExceptionPrintDemo.main(ExceptionPrintDemo.java:14)

Cependant, lors de la surveillance du journal avec l'outil de surveillance, une seule ligne peut être reconnue, de sorte que la trace de pile suivante ne peut pas être notifiée par e-mail. ** À la suite d'être informé par e-mail du message "2017-2-01 13:33:21 [main] ERREUR Erreur inattendue", "Oh ..." et voir le journal à chaque fois sur la machine de production. Es-tu allé? ** **

En plus de **, vous souhaiterez peut-être surveiller non seulement les mots-clés de la première ligne, mais également les mots-clés de la deuxième ligne et des suivantes. ** ** De plus, ** sur les systèmes plus anciens, je vois parfois la date sur la première ligne, le code d'erreur sur la deuxième ligne et le message d'erreur sur la troisième ligne **, ce qui fait pleurer la surveillance des mots clés.

20170201 11:12:34
ERR001
○○ Le code n'est pas valide.
20170201 11:12:34
ERR002
Impossible de se connecter à la base de données

Cette fois, j'ai essayé de résoudre ce domaine en utilisant fluentd. L'outil de surveillance utilise du maquereau, mais je pense que c'est la même chose pour les autres outils de surveillance.

Solution

Utilisez fluentd pour convertir en une seule ligne de json et de monitor.

Etapes de configuration

installation fluide

curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh

paramètres fluentd

/etc/td-agent/td-agent.conf


<source>
  type tail
  path /var/log/app/app.log
  pos_file /var/log/td-agent/app/app-log.pos
  tag app.log
  multiline_flush_interval 10s
  format multiline
  format_firstline /\d{4}-\d{1,2}-\d{1,2}/
  format1 /^(?<time>\d{4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}) \[(?<thread>.*)\](?<level>[^\s]+)(?<message>.*)/
</source>

<match app.log>
  type file
  path /var/log/td-agent/app/app.java.log
  time_slice_wait 10m
</match>

/var/log/td-agent/app/app.java.log


2017-02-01T13:33:21+09:00       app.log {"thread":"main","level":"ERROR","message":" Unexpected Error\njava.lang.NumberFormatException: For input string: \"1.1\"\n        at java.lang.NumberFormatException.forInputString(Unknown Source)\n        at java.lang.Integer.parseInt(Unknown Source)\n        at java.lang.Integer.<init>(Unknown Source)\n        at ExceptionPrintDemo.formatInt(ExceptionPrintDemo.java:7)\n        at ExceptionPrintDemo.main(ExceptionPrintDemo.java:14)"}

paramètres de maquereau

[plugin.checks.app-log]
command = '''
  check-log \
    --file-pattern '/var/log/td-agent/app/app.java.log.*.log' \
    --pattern '\"level\":\"ERROR\"' \
    --return
'''
[plugin.checks.process_td-agent]
command = "check-procs --pattern td-agent -C 2"

Autres réglages

Il est facile d'oublier de faire pivoter td-agent.log. Mettons https://github.com/treasure-data/td-agent/blob/master/td-agent.logrotate

résultat

Le contenu de la trace de pile est également affiché correctement.

image

en conclusion

Si vous utilisez fluentd comme cette fois, il est plus facile à introduire et recommandé. N'est-il pas très important dans la conception opérationnelle de pouvoir concevoir ou non une si petite chose?

référence

Recommended Posts

Améliorons un peu le fonctionnement en surveillant et en notifiant le journal multiligne par mot-clé
[Enum] Utilisez des rails enum pour améliorer la lisibilité des données