[JAVA] Lassen Sie uns den Vorgang ein wenig verbessern, indem wir das mehrzeilige Protokoll nach Schlüsselwörtern überwachen und benachrichtigen

Einführung

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.

Lösung

Verwenden Sie fluentd, um in eine einzelne Zeile von json und monitor zu konvertieren.

Einrichtungsschritte

fließende Installation

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

fließende Einstellungen

/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)"}

Makreleneinstellungen

[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"

Andere Einstellungen

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

Ergebnis

Der Inhalt der Stapelverfolgung wird ebenfalls ordnungsgemäß ausgegeben.

image

abschließend

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?

Referenz

Recommended Posts

Lassen Sie uns den Vorgang ein wenig verbessern, indem wir das mehrzeilige Protokoll nach Schlüsselwörtern überwachen und benachrichtigen
[Enum] Verwenden Sie Rails Enum, um die Lesbarkeit von Daten zu verbessern