Para enviar tus logs a Datadog, loguea un archivo y supervisa ese archivo con tu Datadog Agent.
Las stack traces de los logs típicos de Java se dividen en varias líneas, lo que dificulta que puedan asociarse al evento de log 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 remediar este problema, configura tu biblioteca de registro de logs para que genere tus logs en formato JSON. De esta forma podrás:
Garantizar que la stack trace se asocia correctamente al evento de log.
Garantizar que todos los atributos del evento de log (como la gravedad, el nombre del logger y el nombre del subproceso) se extraen correctamente.
Las siguientes instrucciones muestran ejemplos de configuración para las bibliotecas de registro de logs Log4j, Log4j 2 y Logback.
Configurar el registrador
Formato JSON
Para Log4j, loguea en formato JSON utilizando el módulo log4j-over-slf4j de SLF4J combinado con Logback. log4j-over-slf4j sustituye sin problemas a Log4j en tu aplicación, por lo que no tendrás que realizar ningún cambio en el código.
En tu archivo pom.xml, sustituye la dependencia log4j.jar por una dependencia log4j-over-slf4j.jar y añade las dependencias de Logback. Por ejemplo:
Configura un appender utilizando el diseño JSON en log4j2.xml. Consulta las siguientes configuraciones de ejemplo para el appender de archivo y consola. Para una descripción completa de los complementos de Log4j, consulta Referencia de complementos de Log4j.
Si tienes APM activado para esta aplicación, puedes correlacionar los logs y las trazas activando la inserción de ID de trazas. Consulta Conectar logs y trazas Java para obtener más información.
Formato sin procesar
Configura un appender de archivos en log4j.xml. Por ejemplo:
Si APM está activada para esta aplicación, puedes correlacionar logs y trazas activando la inserción de ID de trazas. Consulta Conectar logs y trazas Java.
Si no correlacionas logs y trazas, puedes eliminar los marcadores MDC (%X{dd.trace_id} %X{dd.span_id}) de los patrones de log incluidos en los ejemplos de configuración de arriba.
Crea un archivo conf.yaml 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 logs se envían correctamente a Datadog.
Si los logs están en formato JSON, Datadog parsea los mensajes del log de forma automática para extraer sus atributos. Utiliza el Log Explorer para ver tus logs y solucionar problemas relacionados.
Registro de logs sin Agent
En caso excepcional de que tu aplicación se esté ejecutando en una máquina a la que no tengas acceso o que no puedas registrar logs en un archivo, es posible transmitir logs a Datadog o al Datadog Agent directamente. Esta configuración no es la más recomendable porque requiere que la aplicación gestione los problemas de conexión.
Para transmitir logs directamente a Datadog:
Añade la biblioteca de registro de logs a tu código o crea un puente entre tu logger actual y Logback.
Configura Logback para que envíe logs a Datadog.
Crear un puente desde las bibliotecas de registro de logs de Java y Logback
Si todavía no utilizas Logback, las bibliotecas de registro de logs se pueden asociar a Logback.
Utiliza el módulo log4j-over-slf4j de SLF4J con Logback para que envíe logs a otro servidor. log4j-over-slf4j sustituye sin problemas Log4j de tu aplicación para que no tengas que hacer ningún cambio en el código. Para usarlo:
En tu archivo pom.xml, sustituye la dependencia log4j.jar por una dependencia log4j-over-slf4j.jar y añade las dependencias de Logback. Por ejemplo:
Nota: Como resultado de este cambio, los archivos de configuración Log4j dejarán de recogerse. Migra tu archivo log4j.properties a logback.xml con el traductor Log4j.
Log4j 2 permite registrar logs en un host remoto, pero no ofrece la posibilidad de añadir una clave de API como prefijo en los logs. Debido a esto, utiliza el módulo SLF4J log4j-over-slf4j y Logback. log4j-to-slf4j.jar sustituye directamente 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, sustituye la dependencia log4j.jar por una dependencia log4j-over-slf4j.jar y añade las dependencias de Logback. Por ejemplo:
Como resultado de esta migración, los archivos de configuración Log4j 2 dejarán de recogerse. Migra tu archivo log4j.properties a logback.xml con el traductor Log4j.
Utiliza la biblioteca de registro de logs logstash-logback-encoder junto con Logback para enviar los logs directamente a Datadog.
Configura un appender TCP en tu archivo logback.xml. Con esta configuración, tu clave de API se recupera de la variable de entorno DD_API_KEY. Alternativamente, puedes insertar tu clave de API directamente en el archivo de configuración:
Para la siguiente configuración, sustituye <YOUR REGION INTAKE> por la entrada basada en tu región:.
Nota: Se añade %mdc{keyThatDoesNotExist} porque la configuración XML quita los espacios en blanco. Para obtener más información sobre el parámetro prefijo, consulta la documentación de Logback.
Añade la dependencia de codificador de Logstash a tu archivo pom.xml. Por ejemplo:
Para enriquecer los eventos de log en Java, puedes reescribir los mensajes en tu código e introduce 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 parseador de valores clave activado, 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}
Puedes explotar el scope (contexto) como un campo, y durationInMs (duración en minutos) y quantity (cantidad) como medidas de log.