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.
Utilisez fluentd pour convertir en une seule ligne de json et de monitor.
curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
/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>
Ecrivez une expression canonique qui représente une seule rupture json dans format_firstline.
Dans format1, l'heure, le fil de discussion et le message sont analysés avec des expressions régulières.
Puisqu'il s'agit de * (?
multiline_flush_interval 10s
Chaque fois qu'un journal coule, fluentd l'exécute et l'analyse, mais il est initialement mis en mémoire tampon.
Ensuite, après l'analyse du prochain journal, les tampons seront vidés. Rincez ce paramètre toutes les 10 secondes même s'il n'est pas extrudé. Cela devient le paramètre.
Le journal analysé est formaté comme suit.
/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)"}
[plugin.checks.app-log]
command = '''
check-log \
--file-pattern '/var/log/td-agent/app/app.java.log.*.log' \
--pattern '\"level\":\"ERROR\"' \
--return
'''
--return imprime une ligne d'erreur et envoie son contenu à Mackerel
Vous devez également surveiller la présence de deux processus td-agent.
[plugin.checks.process_td-agent]
command = "check-procs --pattern td-agent -C 2"
Il est facile d'oublier de faire pivoter td-agent.log. Mettons https://github.com/treasure-data/td-agent/blob/master/td-agent.logrotate
Le contenu de la trace de pile est également affiché correctement.
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?