web-dev-qa-db-fra.com

Logback JsonLayout imprimant tous les journaux sur la même ligne

J'utilise JsonLayout avec Spring Boot pour enregistrer les messages au format JSON. Je souhaite uniquement que les messages de journal soient enregistrés dans la console et non dans un fichier journal.

Je remarque que les journaux JSON sont enregistrés en continu sur la même ligne. En production, ce serait correct, car nous expédions les journaux à un agrégateur de journaux. Mais cela devient un peu difficile à analyser sur le développement local.

Journaux

{"timestamp":"2016-11-13 23:06:17.727","level":"INFO","thread":"qtp745835029-19","logger":"com.test.controller.TestController","message":"Info log:: printme 1","context":"default"}{"timestamp":"2016-11-13 23:06:17.727","level":"DEBUG","thread":"qtp745835029-19","logger":"com.test.controller.TestController","message":"Debug log:: printme","context":"default"}{"timestamp":"2016-11-13 23:06:17.727","level":"WARN","thread":"qtp745835029-19","logger":"com.test.controller.TestController","message":"Warn log:: printme","context":"default"}{"timestamp":"2016-11-13 23:06:17.727","level":"ERROR","thread":"qtp745835029-19","logger":"com.test.controller.TestController","message":"Error log:: printme","context":"default"}

Voici la configuration de la déconnexion
logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />
    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
            <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
                <prettyPrint>false</prettyPrint>
            </jsonFormatter>
            <timestampFormat>yyyy-MM-dd' 'HH:mm:ss.SSS</timestampFormat>
        </layout>
    </appender>
    <logger name="jsonLogger" additivity="false" level="DEBUG">
        <appender-ref ref="consoleAppender"/>
    </logger>
    <root level="INFO">
        <appender-ref ref="consoleAppender"/>
    </root>
</configuration>

Suis-je en train de manquer quelque chose dans la configuration pour qu'ils soient enregistrés sur des lignes distinctes sur la console.

Merci pour toute aide à ce sujet.

17
Anoop

Vous devez définir l'option appendLineSeparator sur true pour ch.qos.logback.contrib.json.classic.JsonLayout. Exemple de ceci:

<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
        <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter" />
        <timestampFormat>yyyy-MM-dd' 'HH:mm:ss.SSS</timestampFormat>
        <appendLineSeparator>true</appendLineSeparator>
    </layout>
</appender>

<root level="debug">
    <appender-ref ref="STDOUT" />
</root>
26
mvmn

Je suis passé à l'utilisation de logstash-logback-encoder qui n'avait pas le problème en tant que mise en page JSON.

1
Anoop

Dirigez la sortie de votre application Spring Boot (ou fichiers journaux JSON) vers jq en utilisant quelque chose comme ceci:

Java -jar target/myapp.jar | jq -R 'fromjson?'

Cela fournira un json Nice, surligné en couleur et joliment imprimé qui suit la sortie de votre application. Tout ce qui n'est pas JSON en sortie par votre application sera ignoré (par exemple: la bannière Spring Boot).

Vous pouvez utiliser des filtres dans jq pour afficher uniquement la sortie du message de niveau INFO:

Java -jar target/myapp.jar | jq -c -R 'fromjson? | select(.level="INFO") | {message}'

Ou vous pouvez utiliser des filtres pour supprimer les clés que vous ne souhaitez pas voir:

Java -jar target/myapp.jar | jq -c -R 'fromjson? | del(.timestamp,.thread)'
0
Paul Cunningham

Définir prettyPrint true est une solution. Mais il y a des cas où nous avons besoin de journaux sur une seule ligne, comme pour la diffusion vers des services comme la surveillance cloud. Ajouter le suivant dans la mise en page

<appendLineSeparator>true</appendLineSeparator>
0
Santhosh VS

Modifié: essayez de changer le prettyPrint en true -> <prettyPrint>true</prettyPrint>

Vous réécrivez les journaux deux fois dans le consoleAppender

   <logger name="jsonLogger" additivity="false" level="DEBUG">
        <appender-ref ref="consoleAppender"/>
    </logger>
    <root level="INFO">
        <appender-ref ref="consoleAppender"/>
    </root>

changer pour

<logger name="jsonLogger" additivity="false" level="DEBUG"/>
<root level="INFO">
    <appender-ref ref="consoleAppender"/>
</root>
0
Sagar