Logback JsonLayout在同一行上打印所有日志

时间:2016-11-13 17:54:27

标签: logging spring-boot logback

我正在使用JsonLayout和Spring Boot来记录JSON格式的消息。我只希望将日志消息记录到控制台而不是日志文件。

我注意到JSON日志在同一行上连续记录。在生产时,这将是正常的,因为我们将日志发送到日志聚合器。但是,对于本地发展来说,这有点难以分析。

记录

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

以下是logback配置
的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>

我是否遗漏了配置中的内容,以便在控制台上单独登录。

感谢您提供任何帮助。

5 个答案:

答案 0 :(得分:12)

您需要为appendLineSeparatortrue选项设置为ch.qos.logback.contrib.json.classic.JsonLayout。例如:

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

答案 1 :(得分:2)

将prettyPrint设置为true是一种解决方案。但是在某些情况下,我们需要单行日志,例如用于扩展到云监视之类的服务。 在布局中添加以下内容

let file = await fetch(source).then(r => r.blob()).then(blobFile => new File([blobFile], fileName, {
        type: res[0]
      })); 

答案 2 :(得分:1)

我切换到使用没有问题的logstah-logback-encoder作为JSONLayout。

答案 3 :(得分:0)

编辑:尝试将prettyPrint更改为true - &gt; <prettyPrint>true</prettyPrint>

您在consoleAppender

中重写了两次日志
   <logger name="jsonLogger" additivity="false" level="DEBUG">
        <appender-ref ref="consoleAppender"/>
    </logger>
    <root level="INFO">
        <appender-ref ref="consoleAppender"/>
    </root>

更改为

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

答案 4 :(得分:0)

使用以下内容将Spring Boot应用程序(或JSON日志文件)的输出传递给jq

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

这将提供一个漂亮的,颜色突出的,漂亮的json,它遵循应用程序的输出。您的应用程序输出的非JSON的任何内容都将被忽略(例如:Spring Boot标题)。

您可以在jq中使用过滤器仅显示INFO级别消息输出:

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

或者您可以使用过滤器删除您不想看到的键:

java -jar target/myapp.jar | jq -c -R 'fromjson? | del(.timestamp,.thread)'