Estoy usando Rolling File Appender en Logback con un patrón de codificador muy básico para iniciar sesión en JSON. La aplicación está escrita en Java. Sé que existen algunos paquetes Logback JSON para Java, pero decidí no usarlos para no tener que introducir nuevas dependencias en el código.
Tengo el siguiente appender funcionando. Escupe registros en formato JSON que Filebeat y Logstash pueden leer.
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>/opt/tomcat/logs/LOG.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- rollover daily --> <fileNamePattern>/opt/tomcat/logs/LOG.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <!-- or whenever the file size reaches 100MB --> <maxFileSize>200MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <maxHistory>30</maxHistory> <cleanHistoryOnStart>true</cleanHistoryOnStart> </rollingPolicy> <encoder> <pattern> {"@timestamp": "%d{ISO8601}", "date": "%d{dd-MM-yy}", "thread": "%thread", "level": "%-5level", "className": "%logger{36}", "message": "%replace(%replace(%msg){'\n','\u2028'}){'\t',' '} %replace(%replace(%ex){'\n','\u2028'}){'\t',' '}" }%nopex%n </pattern> </encoder> </appender> Como puede ver, la sangría de esta línea {"@timestamp": "%d{ISO8601}",.... está desactivada (si la sangro, se sangra en el archivo de registro), y la línea es demasiado largo para cualquier validación de Checkstyle (y legibilidad). Prefiero componerlo así:
<encoder> <pattern> { "@timestamp": "%d{ISO8601}", "date": "%d{dd-MM-yy}", ... }%nopex%n </pattern> </encoder>¿Alguna idea sobre cómo puedo obtener XML y/o Logback para ignorar el formato de este patrón y simplemente escupir el texto?
Lo siguiente crea una propiedad que contiene el patrón, por lo que quizás le permita formatearlo como desee:
Ejemplo:
<property name="ENCODER_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{80} - %msg%n" /> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${ENCODER_PATTERN}</pattern> </encoder>