Utilisation de Spring Boot 2.1.1.RELEASE
on peut apparemment formater les journaux en JSON en fournissant un logback-spring.xml
fichier comme suit:
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
<timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSSX</timestampFormat>
<timestampFormatTimezoneId>Etc/UTC</timestampFormatTimezoneId>
<jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
<prettyPrint>true</prettyPrint>
</jsonFormatter>
</layout>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="stdout" />
</root>
et en ajoutant au pom.xml
<dependency>
<groupId>ch.qos.logback.contrib</groupId>
<artifactId>logback-json-classic</artifactId>
<version>0.1.5</version>
</dependency>
<dependency>
<groupId>ch.qos.logback.contrib</groupId>
<artifactId>logback-jackson</artifactId>
<version>0.1.5</version>
</dependency>
menant en effet à des messages comme:
{
"timestamp" : "2018-12-11T18:20:25.641Z",
"level" : "INFO",
"thread" : "main",
"logger" : "com.netflix.config.sources.URLConfigurationSource",
"message" : "To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.",
"context" : "default"
}
J'essaie logz.io qui semble se comporter plus favorablement lorsque les journaux sont au format JSON, certains o les expéditeurs ont du mal avec les journaux multilignes comme nous le voyons dans Java traces de pile et lors du formatage en JSON, il peut automatiquement analyser des champs comme level
et message
et s'il y a des données MDC, il les obtient automatiquement.
J'ai eu quelques expériences pas si géniales avec quelques-unes des méthodes d'envoi de journaux à logzio, comme leur image de docker et l'utilisation de rsyslog sans utiliser de messages de journal au format JSON.
Cela fonctionne bien pour l'ajout de console, mais Spring Boot fournit comme logging.file=test.log
, logging.level.com.example=WARN
, logging.pattern.console
. Je peux en effet importer la configuration gérée depuis spring-boot-2.1.1.RELEASE.jar!/org/springframework/boot/logging/logback/base.xml
qui à son tour importe un console-appender.xml and
file-appender.xml`.
<included>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
</included>
<included>
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<file>${LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
<maxFileSize>${LOG_FILE_MAX_SIZE:-10MB}</maxFileSize>
<maxHistory>${LOG_FILE_MAX_HISTORY:-0}</maxHistory>
</rollingPolicy>
</appender>
</included>
Ces deux sont exactement ce dont j'ai besoin pour prendre en charge la configuration des propriétés des ressorts, mais ils n'incluent pas l'encodeur/la disposition dont j'ai besoin.
Il apparaît dans mes tests initiaux que je ne peux pas simplement nommer mon appender comme ceux-ci et fournir mes dispositions. Par exemple:
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
<timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSSX</timestampFormat>
<timestampFormatTimezoneId>Etc/UTC</timestampFormatTimezoneId>
<jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
<prettyPrint>true</prettyPrint>
</jsonFormatter>
</layout>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
</configuration>
conduit à la journalisation du message au format JSON et au format texte brut.
Je peux en effet simplement copier et coller le contenu de ces 3 fichiers dans ma configuration personnalisée plutôt que de les importer du tout. Ensuite, je peux remplacer ce que je souhaite personnaliser.
Cependant, au fur et à mesure que le printemps évolue et que de nouvelles versions sont ajoutées, ce qui peut ajouter des fonctionnalités, je me forcerais pour toujours à garder, copier et coller les nouveaux fichiers et apporter mes modifications et les tester.
Y a-t-il une meilleure façon que je puisse:
Note de bas de page: logzio fournit ne dépendance on peut importer, mais je n'aime pas l'idée de coupler directement le fournisseur de journalisation dans le code. Je pense que si le serveur produit des journaux JSON sur stdout ou un fichier, il est facile pour n'importe quel fournisseur de les traiter et de les expédier vers une destination.
Je n'utilise aucune dépendance. Simplement, le faire via application.yml, c'est tout. Cette solution résout également les problèmes de journaux multilignes.
logging:
pattern:
console: "{\"time\": \"%d\", \"level\": \"%p\", \"correlation-id\": \"%X{X-Correlation-Id}\", \"source\": \"%logger{63}:%L\", \"message\": \"%replace(%m%wEx{6}){'[\r\n]+', '\\n'}%nopex\"}%n"
On dirait que vous devez copier-coller avec des modifications 3 fichiers sur 4 d'ici https://github.com/spring-projects/spring-boot/tree/v2.1.1.RELEASE/spring-boot-project/ spring-boot/src/main/resources/org/springframework/boot/logging/logback dans votre configuration.
La bonne nouvelle est que vous n'avez pas besoin de copier-coller https://github.com/spring-projects/spring-boot/blob/v2.1.1.RELEASE/spring-boot-project/spring-boot /src/main/resources/org/springframework/boot/logging/logback/defaults.xml
Cela peut être inclus comme ça <include resource="org/springframework/boot/logging/logback/default.xml"/>
Cela vous donnera une partie de la configuration par défaut du printemps sans copier ni coller