Pour envoyer vos logs à Datadog, activez la journalisation au sein d’un fichier et suivez ce fichier avec l’Agent Datadog.
Les stack traces types des logs Java sont divisées en plusieurs lignes, ce qui les rend difficiles à associer à l’événement de log d’origine. Par exemple :
//4 events generated when only one is expected!Exceptioninthread"main"java.lang.NullPointerExceptionatcom.example.myproject.Book.getTitle(Book.java:16)atcom.example.myproject.Author.getBookTitles(Author.java:25)atcom.example.myproject.Bootstrap.main(Bootstrap.java:14)
Pour résoudre ce problème, configurez votre bibliothèque de journalisation de façon à ce que vos logs soient générés au format JSON. L’enregistrement des logs au format JSON offre les avantages suivants :
La stack trace est correctement associée à l’événement de log.
Tous les attributs d’un événement de log (gravité, nom du logger, nom du thread, etc.) sont correctement extraits.
Vous avez accès aux attributs du MDC (Mapped Diagnostic Context), que vous pouvez associer à n’importe quel événement de log.
Pour Log4j, générez les logs au format JSON en utilisant le module SLF4J log4j-over-slf4j avec Logback. log4j-over-slf4j remplace directement Log4j dans votre application, ce qui fait qu’aucune modification du code n’est nécessaire. Pour l’utiliser :
Dans votre fichier pom.xml, remplacez la dépendance log4j.jar par une dépendance log4j-over-slf4j.jar, puis ajoutez les dépendances Logback :
Si APM est activé pour cette application, vous pouvez corréler vos logs et vos traces en activant l’injection des ID de trace. Consultez la section Associer vos logs Java à vos traces pour en savoir plus.
Si APM est activé pour cette application, vous pouvez corréler vos logs et vos traces en activant l’injection des ID de trace. Consultez la section Associer vos logs Java à vos traces.
Si vous ne souhaitez pas corréler vos logs et vos traces, vous pouvez supprimer les paramètres fictifs MDC (%X{dd.trace_id} %X{dd.span_id}) des logs patterns inclus dans les exemples de configuration ci-dessus.
Créez un fichier conf.yaml dans votre dossier java.d/ avec le contenu suivant :
#Log sectionlogs:- type:filepath:"<path_to_your_java_log>.log"service:<service_name>source:javasourcecategory:sourcecode# For multiline logs, if they start by the date with the format yyyy-mm-dd uncomment the following processing rule#log_processing_rules:# - type: multi_line# name: new_log_start_with_date# pattern: \d{4}\-(0?[1-9]|1[012])\-(0?[1-9]|[12][0-9]|3[01])
Dans le cas exceptionnel où votre application s’exécute sur une machine qui n’est pas accessible ou qui ne peut pas enregistrer les logs dans un fichier, il est possible de transmettre directement les logs à Datadog ou à l’Agent Datadog. Cette configuration n’est pas recommandée, car votre application doit alors gérer les problèmes de connexion.
Pour transmettre vos logs directement à Datadog :
Ajoutez la bibliothèque de journalisation Logback à votre code ou créez un pont entre votre logger actuel et Logback.
Configurez Logback de façon à envoyer les logs à Datadog.
Utilisez le module SLF4J log4j-over-slf4j avec Logback pour envoyer les logs vers un autre serveur. log4j-over-slf4j remplace directement Log4j dans votre application, ce qui fait qu’aucune modification du code n’est nécessaire. Pour l’utiliser :
Dans votre fichier pom.xml, remplacez la dépendance log4j.jar par une dépendance log4j-over-slf4j.jar, puis ajoutez les dépendances Logback :
Remarque : suite à cette modification, les fichiers de configuration Log4j ne seront plus recueillis. Migrez votre fichier log4j.properties vers logback.xml avec le convertisseur Log4j.
Log4j 2 permet la journalisation sur un host à distance, mais n’offre pas la possibilité d’ajouter une clé d’API en préfixe avant les logs. De ce fait, utilisez le module SLF4J log4j-over-slf4j avec Logback. log4j-to-slf4j.jar remplace directement Log4j 2 dans votre application, ce qui fait qu’aucune modification du code n’est nécessaire. Pour l’utiliser :
Dans votre fichier pom.xml, remplacez la dépendance log4j.jar par une dépendance log4j-over-slf4j.jar, puis ajoutez les dépendances Logback :
Suite à cette migration, les fichiers de configuration Log4j 2 ne seront plus recueillis. Migrez votre fichier log4j.properties vers logback.xml avec le convertisseur Log4j.
Utilisez la bibliothèque de journalisation logstash-logback-encoder avec Logback pour envoyer directement vos logs à Datadog.
Configurez un TCP appender dans votre fichier logback.xml. Votre clé d’API sera ainsi récupérée depuis la variable d’environnement DD_API_KEY. Vous pouvez également ajouter votre clé d’API directement dans le fichier de configuration :
Remarque : %mdc{keyThatDoesNotExist} est utilisé car la configuration XML supprime les espaces. Pour en savoir plus sur le paramètre de préfixe, consultez la documentation Logback.
Ajoutez la dépendance d’encodeur Logstash dans votre fichier pom.xml :
Le parser key/value extrait n’importe quelle expression <KEY>=<VALUE> identifiée dans un événement de log.
Pour enrichir vos événements de log dans Java, vous pouvez réécrire les messages dans votre code et y ajouter des séquences <KEY>=<VALUE>.
Par exemple, si vous avez :
logger.info("Emitted 1001 messages during the last 93 seconds for customer scope prod30");
Vous pouvez le remplacer par :
logger.info("Emitted quantity=1001 messages during the last durationInMs=93180 ms for customer scope=prod30");
Lorsque le parser key/value est activé, chaque paire est extraite à partir du JSON :
{"message":"Emitted quantity=1001 messages during the last durationInMs=93180 ms for customer scope=prod30","scope":"prod30","durationInMs":93180,"quantity":1001}
Vous pouvez donc utiliser scope en tant que champ, et durationInMs et quantity en tant que mesures de log.