Eine kleine Geschichte.
Die Schlüsselwortüberwachung von Protokollen, die in einer Zeile ausgeführt werden, z. B. Apache-Protokolle, kann relativ einfach durchgeführt werden. Beispielsweise besteht das Fehlerprotokoll von Apache aus einer Zeile und wird durch Schlüsselwörter wie [Fehler] und [Warnung] [Kritisch] überwacht.
[Wed Oct 11 14:32:52 2000] [error] [client 127.0.0.1] client denied by server configuration: /export/home/live/ap/htdocs/test
Wenn Sie in Java einen Stack-Trace erhalten, besteht dieser aus mehreren Zeilen. Dies sollte mit dem Schlüsselwort ERROR überwacht werden.
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)
Bei der Überwachung des Protokolls mit dem Überwachungstool kann jedoch nur eine Zeile erkannt werden, sodass die folgende Stapelverfolgung nicht per E-Mail benachrichtigt werden kann. ** Als Ergebnis der Benachrichtigung per E-Mail über die Meldung "2017-2-01 13:33:21 [main] ERROR Unexpected Error", "Oh ..." und sehen Sie das Protokoll jedes Mal auf der Produktionsmaschine. Bist du gegangen? ** ** **
Zusätzlich zu ** möchten Sie möglicherweise nicht nur die Schlüsselwörter in der ersten Zeile, sondern auch die Schlüsselwörter in der zweiten und den folgenden Zeilen überwachen. ** ** ** Außerdem ** sehe ich auf älteren Systemen manchmal das Datum in der ersten Zeile, den Fehlercode in der zweiten Zeile und die Fehlermeldung in der dritten Zeile **, wodurch die Schlüsselwortüberwachung zum Weinen gebracht wird.
20170201 11:12:34
ERR001
○○ Der Code ist ungültig.
20170201 11:12:34
ERR002
Verbindung mit der Datenbank fehlgeschlagen
Diesmal habe ich versucht, diesen Bereich mit fluentd zu lösen. Das Überwachungstool verwendet Makrele, aber ich denke, es ist das gleiche für andere Überwachungstools.
Verwenden Sie fluentd, um in eine einzelne Zeile von json und monitor zu konvertieren.
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>
Schreiben Sie einen kanonischen Ausdruck, der eine einzelne JSON-Unterbrechung in format_firstline darstellt.
In Format1 werden Zeit, Thread und Nachricht mit regulären Ausdrücken analysiert.
Da es sich um * (?
multiline_flush_interval 10s
Jedes Mal, wenn ein Protokoll fließt, wird es fließend ausgeführt und analysiert, aber zunächst wird es im Speicher gepuffert.
Nach der Analyse des nächsten Protokolls werden die gepufferten Protokolle gelöscht. Spülen Sie diesen Parameter alle 10 Sekunden, auch wenn er nicht extrudiert wird. Es wird zum Parameter.
Das analysierte Protokoll ist wie folgt formatiert.
/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 druckt eine Fehlerzeile und sendet ihren Inhalt an Mackerel
Sie sollten auch überwachen, ob zwei td-agent-Prozesse aktiv sind.
[plugin.checks.process_td-agent]
command = "check-procs --pattern td-agent -C 2"
Es ist leicht zu vergessen, td-agent.log zu drehen. Lass uns setzen https://github.com/treasure-data/td-agent/blob/master/td-agent.logrotate
Der Inhalt der Stapelverfolgung wird ebenfalls ordnungsgemäß ausgegeben.
Wenn Sie dieses Mal fließend verwenden, ist es einfacher einzuführen und zu empfehlen. Ist es bei der betrieblichen Planung nicht sehr wichtig, ob so etwas entwickelt werden kann oder nicht?