[JAVA] Einführung des Heartbeat-Loggers, der die ausgeführte Methode / Zeilennummer regelmäßig protokolliert

Problem

Es gibt Zeiten, in denen Sie sehen möchten, welcher Prozess lange dauert (oder gestoppt wird), z. B. in einem zeitaufwändigen Java-Batch-Prozess.

Beim Einbetten eines Protokolls während der Verarbeitung ist jedoch viel Erfahrung erforderlich, um den Punkt und die Korngröße zu bestimmen. Wenn Sie längere Zeit an einem bestimmten Punkt anhalten, wird nichts in das Protokoll ausgegeben.

Lösung

Ich wollte in der Lage sein, regelmäßig Informationen über das Ausführen von Zeilen zu protokollieren. Aus diesem Grund ist es ein sehr einfaches Projekt, aber ich habe einen "Heartbeat-Logger" erstellt, um dies zu ermöglichen. https://github.com/flyaway2112/heartbeat-logger

Ausführungsergebnis

Sie können das zu verarbeitende Protokoll regelmäßig wie unten gezeigt ausgeben, ohne das sequentielle Protokoll einzubetten.

2020-7-01 00:11:23.881 [pool-1-thread-1] DEBUG com.example.LargeBatch - Start heartbeat logger
2020-7-01 00:11:23.883 [pool-1-thread-1] INFO  com.example.LargeBatch - com.example.LargeBatch.doLargeProcess1(LargeBatch.java:22)
2020-7-01 00:11:23.983 [pool-1-thread-1] INFO  com.example.LargeBatch - com.example.LargeBatch.doLargeProcess1(LargeBatch.java:22)
2020-7-01 00:11:24.084 [pool-1-thread-1] INFO  com.example.LargeBatch - com.example.LargeBatch.doLargeProcess2(LargeBatch.java:26)
2020-7-01 00:11:24.185 [pool-1-thread-1] INFO  com.example.LargeBatch - com.example.LargeBatch.doLargeProcess2(LargeBatch.java:26)
2020-7-01 00:11:24.286 [pool-1-thread-1] INFO  com.example.LargeBatch - com.example.LargeBatch.doLargeProcess2(LargeBatch.java:26)
2020-7-01 00:11:24.386 [pool-1-thread-1] INFO  com.example.LargeBatch - com.example.LargeBatch.doLargeProcess2(LargeBatch.java:26)
2020-7-01 00:11:24.480 [pool-1-thread-1] DEBUG com.example.LargeBatch - Shutdown heartbeat logger

Wie benutzt man

SLF4J Es kann über eine ähnliche Schnittstelle verwendet werden.

Logger-Generierung

HeartBeatLogger logger = HeartBeatLoggerFactory.getLogger(this.getClass(), "com.example", 100);

Das erste Argument der getLogger-Methode ist die SLF4J-Methode LoggerFactpry.getLogger (Class). Übergeben Sie wie beim Argument von die Klasse, die als Logger-Name von SLF4J verwendet werden soll. Sie können es auf die gleiche Weise wie Wenn Sie Logger mit SLF4J erhalten verwenden.

Das zweite Argument ist der Paketname (Präfixübereinstimmung), der als "Verarbeitung läuft" in das Protokoll ausgegeben wird. Im Fall des obigen Beispiels wird es vom Ende der Stapelverfolgung bis zur Verarbeitung des Pakets "com.example" in das Protokoll ausgegeben. Dies ist ein Mechanismus, um das Problem zu vermeiden, dass "selbst wenn die Informationen der Java-Standardklasse oder der Bibliotheksmethode ausgegeben werden, nicht bekannt ist, von welchem Prozess des Projekts es ausgeführt wird". Wenn null übergeben wird, wird das Ende der Stapelverfolgung ausgegeben.

Das dritte Argument ist das Protokollausgabeintervall (Millisekunden).

Beginn und Ende der Verarbeitung

try {
  logger.start();
  //Verarbeitung des Protokollausgabeziels hier
} finally {
  logger.shutdown();
}

Vom Aufruf der Startmethode bis zum Aufruf der Shutdown-Methode wird das Protokoll automatisch im festgelegten Intervall ausgegeben.

Recommended Posts

Einführung des Heartbeat-Loggers, der die ausgeführte Methode / Zeilennummer regelmäßig protokolliert
[Ruby] Fragen und Überprüfung der Anzahl der Methodenargumente
Ein Programm, das die Anzahl der Wörter in einer Liste zählt
Methode, um die Anzahl der Jahre zu addieren und das Monatsende zu erhalten
Eine Geschichte, die mit der Einführung von Web Apple Pay zu kämpfen hatte