java json slf4j logback loggly

java - ¿Hay un diseño de Logback que cree objetos JSON con parámetros de mensaje como atributos?



logback levels (5)

Al igual que se contestó, obtendrás un árbol JSON unidimensional con MDC y / o usando un marcador con logstash-logback-encoder.

Si también estás buscando lo siguiente:

  • libros de códigos para la definición de la clave y el tipo de datos registrados,
  • configuración de herramientas de agregación de registros (como elasticsearch)
  • código de ayuda Java generado para un registro eficiente y correcto

a continuación, intente un proyecto que he creado: json-log-domain . Define una definición de formato YAML simple a partir de la cual se puede generar lo anterior.

Un ejemplo de código de código auxiliar sería

logger.info(host("localhost").port(8080), "Hello world");

mientras que el markdown deseado quisiera algo como this .

Quiero enviar eventos de registro a Loggly como objetos JSON con mensajes de cadena parametrizados. Nuestro proyecto actualmente tiene una gran cantidad de código que se ve así:

String someParameter = "1234"; logger.log("This is a log message with a parameter {}", someParameter);

Actualmente estamos utilizando Logback como nuestro backend SLF4J, y JsonLayout de Logback para serializar nuestros objetos ILogEvent en JSON. Consecuentemente, para cuando nuestros eventos de registro se envían a Loggly, se ven así:

{ "message": "This is a log message with a parameter 1234", "level": INFO, .... }

Si bien esto funciona, envía una cadena de message diferente para cada valor de someParameter , lo que hace que los filtros automáticos de Loggly sean casi inútiles.

En su lugar, me gustaría tener un diseño que cree JSON que tenga este aspecto:

{ "message": "This is a log message with a parameter {}", "level": INFO, "parameters": [ "1234" ] }

Este formato permitiría a Loggly agrupar todos los eventos de registro con el mensaje. This is a log message with a parameter , independientemente del valor de someParameter .

Parece que el filtro KV de Logstash hace algo como esto: ¿hay alguna forma de realizar esta tarea con Logback, aparte de escribir mi propio diseño que realice una serialización personalizada del objeto ILogEvent?



Entonces, para mí, estaba tratando de registrar los tiempos de ejecución, creé un pojo llamado ExecutionTime con nombre, método, clase, duración.

Entonces pude crearlo:

ExecutionTime time = new ExecutionTime("Controller Hit", methodName, className, sw.getTotalTimeMillis());

Para el registro entonces usé:

private final Logger logger = LoggerFactory.getLogger(this.getClass()); logger.info(append("metric", time), time.toString());

Asegúrate de tener:

import static net.logstash.logback.marker.Markers.append; import org.slf4j.Logger; import org.slf4j.LoggerFactory;

Esto registrará algo como esto:

{ "ts":"2017-02-16T07:41:36.680-08:00", "msg":"ExecutionTime [name=Controller Hit, method=setupSession, className=class com.xxx.services.controllers.SessionController, duration=3225]", "logger":"com.xxx.services.metrics.ExecutionTimeLogger", "level":"INFO", "metric":{ "name":"Controller Hit", "method":"setupSession", "className":"class com.xxx.services.controllers.SessionController", "duration":3225 } }

Podría ser una configuración diferente, ya que estaba usando logback-spring.xml para enviar mis registros a json:

<?xml version="1.0" encoding="UTF-8"?> <configuration> <include resource="org/springframework/boot/logging/logback/base.xml"/> <property name="PROJECT_ID" value="my_service"/> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>app/logs/${PROJECT_ID}.json.log</File> <encoder class="net.logstash.logback.encoder.LogstashEncoder"> <fieldNames> <timestamp>ts</timestamp> <message>msg</message> <thread>[ignore]</thread> <levelValue>[ignore]</levelValue> <logger>logger</logger> <version>[ignore]</version> </fieldNames> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <maxIndex>10</maxIndex> <FileNamePattern>app/logs/${PROJECT_ID}.json.log.%i</FileNamePattern> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>20MB</MaxFileSize> </triggeringPolicy> </appender> <logger name="com.xxx" additivity="false" level="DEBUG"> <appender-ref ref="FILE"/> <appender-ref ref="CONSOLE"/> </logger> <root level="WARN"> <appender-ref ref="FILE"/> </root> </configuration>



Podría usar un Contexto de diagnóstico asignado para establecer un sello para cada uno de esos tipos de mensajes de registro que luego podría filtrar una vez en loggly.

Según la fuente de JsonLayout el sello se almacena como un valor separado en el JSON.