web-dev-qa-db-fra.com

Existe-t-il un moyen recommandé d'obtenir un démarrage de printemps aux journaux au format JSON avec logback

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"
}

Pourquoi?

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.

Problèmes avec cette approche

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 andfile-appender.xml`.

Un exemple de console-appender

<included>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>
</included>

Un exemple du fichier appender

<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:

  • Apportez simplement des modifications supplémentaires aux annexes plutôt que de les redéfinir entièrement, par ex. Gardez la configuration du printemps mais fournissez mon propre encodeur ou ma propre disposition à utiliser par ces appenders.
  • Configurez Spring dans le journal JSON via des propriétés entièrement sans aucune configuration - j'en doute: S

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.

6
David

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"
2
Ahmet Vehbi Olgaç

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

0
JacobSTL