Para enviar tus registros a Datadog, registra en un archivo y haz el seguimiento de las últimas líneas tail de ese archivo con tu Datadog Agent.
Las trazas de pila de los registros típicos de Java se dividen en múltiples líneas, lo que dificulta asociarlas al evento de registro original. Por ejemplo:
//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)
Para abordar este problema, configura tu biblioteca de registro para producir tus registros en formato JSON. Al registrar en JSON, tú:
Asegúrate de que la traza de pila esté correctamente envuelta en el evento de registro.
Asegúrate de que todos los atributos del evento de registro (como severidad, nombre del registrador y nombre del hilo) estén correctamente extraídos.
Las siguientes instrucciones muestran ejemplos de configuración para las bibliotecas de registro Log4j, Log4j 2 y Logback.
Configura tu registrador
Formato JSON
Para Log4j, registra en formato JSON utilizando el módulo SLF4J log4j-over-slf4j combinado con Logback. log4j-over-slf4j reemplaza limpiamente a Log4j en tu aplicación, por lo que no necesitas hacer ningún cambio en el código.
En tu archivo pom.xml, reemplaza la dependencia log4j.jar con una dependencia log4j-over-slf4j.jar, y agrega las dependencias de Logback. Por ejemplo:
Configura un appender utilizando el diseño JSON en log4j2.xml. Consulta los siguientes ejemplos de configuraciones para el appender de archivo y consola. Para una descripción completa de los plugins de Log4j, consulta la referencia de plugins de Log4j.
Si APM está habilitado para esta aplicación, puedes correlacionar registros y trazas habilitando la inyección de ID de traza. Consulta Conectando Registros y Trazas de Java.
Si no estás correlacionando registros y trazas, elimina los marcadores de posición MDC (%X{dd.trace_id} %X{dd.span_id}) de los patrones de registro incluidos en los ejemplos de configuración anteriores.
Por ejemplo, si estás utilizando Log4j 2 pero no correlacionando registros y trazas, elimina el siguiente bloque de la plantilla de diseño de registro de ejemplo, MyLayout.json:
Crea un conf.yaml archivo en java.d/ con el siguiente contenido:
#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])
Ejecuta el subcomando de estado del Agent y busca java en la sección Checks para confirmar que los registros se han enviado correctamente a Datadog.
Si los registros están en formato JSON, Datadog automáticamente analiza los mensajes de registro para extraer los atributos de registro. Utiliza el Explorador de registros para ver y solucionar problemas en tus registros.
Transmite registros directamente al Agent
En el caso excepcional en que tu aplicación se esté ejecutando en una máquina a la que no se puede acceder o no puede registrar en un archivo, es posible transmitir registros a Datadog o directamente al Agent de Datadog. Esta no es la configuración recomendada, porque requiere que tu aplicación maneje problemas de conexión.
Para transmitir registros directamente a Datadog:
Agrega la biblioteca de registro Logback a tu código, o conecta tu registrador actual a Logback.
Configura Logback para enviar registros a Datadog.
Conecta desde bibliotecas de registro de Java a Logback
Si aún no estás utilizando Logback, la mayoría de las bibliotecas de registro comunes pueden conectarse a Logback.
Utiliza el módulo SLF4J log4j-over-slf4j con Logback para enviar registros a otro servidor. log4j-over-slf4j reemplaza limpiamente Log4j en tu aplicación para que no tengas que hacer cambios en el código.
En tu archivo pom.xml, reemplaza la dependencia log4j.jar con una dependencia log4j-over-slf4j.jar, y agrega las dependencias de Logback. Por ejemplo:
Nota: Como resultado de este cambio, los archivos de configuración de Log4j ya no serán recogidos. Migra tu log4j.properties archivo a logback.xml con el traductor de Log4j.
Log4j 2 permite el registro en un host remoto, pero no ofrece la capacidad de prefijar los registros con una clave API. Debido a esto, utiliza el módulo SLF4J log4j-over-slf4j y Logback. log4j-to-slf4j.jar reemplaza limpiamente Log4j 2 en tu aplicación para que no tengas que hacer ningún cambio en el código. Para usarlo:
En tu archivo pom.xml, reemplaza la dependencia log4j.jar con una dependencia log4j-over-slf4j.jar, y agrega las dependencias de Logback. Por ejemplo:
Como resultado de esta migración, los archivos de configuración de Log4j 2 ya no serán recogidos. Migra tu log4j.properties archivo a logback.xml con el traductor de Log4j.
Configura Logback
Datadog no admite el envío de registros directamente a través de TCP a la ingesta de Datadog. En su lugar, configura Logback a tu Agente local de Datadog, que luego reenvía los registros a Datadog a través de HTTPS con enriquecimiento automático.
Habilita la recolección de registros en datadog.yaml, y asegúrate de que el Agente reenvíe los registros a través de HTTPS (HTTPS es el transporte predeterminado para el Agente v6.19+/v7.19+ y posteriores):
logs_enabled: true
logs_config:
# HTTPS is the default. Keep or set this to force HTTPS forwarding.
force_use_http: true
# (Optional) auto-detect multi-line patterns
auto_multi_line_detection: true
Habilita la recolección de registros en el Agent.
# /etc/datadog-agent/conf.d/logback.d/conf.yamllogs:- type:tcpport:10518# Port the Agent will listen onservice:my-java-app # Your service name (unified service tagging)source:java # Or a more specific source, e.g., "logback"
Reinicia el Agent para aplicar los cambios.
Configura Logback para enviar registros al Agent. Utiliza el logstash-logback-encoder TCP appender en tu logback.xml para reenviar registros al Agent:
Verifica el reenvío de registros. Ejecuta datadog-agent status para confirmar tu TCP listener y revisa el Logs Explorer en busca de entradas etiquetadas con tu servicio.
Obteniendo más
Enriquece tus eventos de registro con atributos contextuales.
Usando el analizador de clave-valor
El analizador de clave-valor extrae cualquier patrón <KEY>=<VALUE> reconocido en cualquier evento de registro.
Para enriquecer tus eventos de registro en Java, puedes reescribir mensajes en tu código e introducir secuencias <KEY>=<VALUE>.
Por ejemplo, si tienes:
logger.info("Emitted 1001 messages during the last 93 seconds for customer scope prod30");
Puedes cambiarlo a:
logger.info("Emitted quantity=1001 messages during the last durationInMs=93180 ms for customer scope=prod30");
Con el analizador de clave-valor habilitado, cada par se extrae del JSON:
{"message":"Emitted quantity=1001 messages during the last durationInMs=93180 ms for customer scope=prod30","scope":"prod30","durationInMs":93180,"quantity":1001}
Así que puedes utilizar scope como un campo, y durationInMs y quantity como medidas de registro.
MDC
Otra opción para enriquecer tus registros es usar [Mapped Diagnostic Contexts (MDC)] de Java.
Si usas SLF4J, utiliza el siguiente código Java:
...MDC.put("scope","prod30");logger.info("Emitted 1001 messages during the last 93 seconds");...
Para generar este JSON:
{"message":"Emitted 1001 messages during the last 93 seconds","scope":"prod30"}
Nota: MDC solo permite tipos de cadena, así que no los uses para métricas de valores numéricos.
Lectura Adicional
Documentación, enlaces y artículos útiles adicionales: