[JAVA] Introduction de heartbeat-logger qui enregistre périodiquement le numéro de méthode / ligne en cours d'exécution

problème

Il y a des moments où vous voulez voir quel processus prend beaucoup de temps (ou est arrêté), comme dans un processus par lots Java chronophage.

Cependant, lors de l'incorporation d'un journal pendant le traitement, il faut beaucoup d'expérience pour déterminer le point et la taille du grain. De plus, si vous vous arrêtez à un moment donné pendant une longue période, rien ne sera affiché dans le journal.

Solution

Je voulais pouvoir enregistrer régulièrement des informations sur l'exécution des lignes. Pour cette raison, c'est un projet très simple, mais j'ai créé un heartbeat-logger pour y arriver. https://github.com/flyaway2112/heartbeat-logger

Résultat d'exécution

Même si vous n'incorporez pas le journal séquentiel, vous pouvez périodiquement sortir le journal en cours de traitement comme indiqué ci-dessous.

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

Comment utiliser

SLF4J Il peut être utilisé à partir d'une interface similaire.

Génération d'enregistreurs

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

Le premier argument de la méthode getLogger est la méthode SLF4J LoggerFactpry.getLogger (Class). Comme pour l'argument de, transmettez la classe à utiliser comme nom de Logger de SLF4J. Vous pouvez l'utiliser de la même manière que Lors de l'obtention de Logger avec SLF4J.

Le deuxième argument est le nom du package (correspondance de préfixe) à afficher dans le journal comme "traitement en cours". Dans le cas de l'exemple ci-dessus, il est sorti dans le journal de la fin de la trace de pile au traitement du package com.example. Il s'agit d'un mécanisme pour éviter le problème suivant: «même si les informations de la classe standard Java ou de la méthode de bibliothèque sont sorties, on ne sait pas à partir de quel processus du projet il est exécuté». Si null est passé, la fin de la trace de pile sera sortie.

Le troisième argument est l'intervalle de sortie du journal (millisecondes).

Début et fin du traitement

try {
  logger.start();
  //Traitement de la cible de sortie du journal ici
} finally {
  logger.shutdown();
}

Entre le moment où vous appelez la méthode de démarrage et le moment où vous appelez la méthode d'arrêt, le journal est automatiquement généré à l'intervalle défini.

Recommended Posts

Introduction de heartbeat-logger qui enregistre périodiquement le numéro de méthode / ligne en cours d'exécution
[Ruby] Questions et vérification du nombre d'arguments de méthode
Un programme qui compte le nombre de mots dans une liste
Méthode pour additionner le nombre d'années et obtenir la fin du mois
Une histoire qui a eu du mal avec l'introduction de Web Apple Pay