web-dev-qa-db-ja.com

同じ行にすべてのログを出力するLogback JsonLayout

Spring BootでJsonLayoutを使用して、メッセージを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-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>

コンソールの別の行にログオンできるように、構成に何か不足していますか?.

これについて何か助けてくれてありがとう。

17
Anoop

appendLineSeparatorオプションをtrueに設定して、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>
26
mvmn

JSONレイアウトとして問題がなかった logstash-logback-encoder を使用するように切り替えました。

1
Anoop

次のようなものを使用して、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)'
0
Paul Cunningham

PrettyPrintをtrueに設定することが1つの解決策です。ただし、クラウドウォッチなどのサービスにリーミングする場合のように、1行のログが必要な場合があります。レイアウトに以下を追加

<appendLineSeparator>true</appendLineSeparator>
0
Santhosh VS

編集済み:prettyPrintをtrueに変更してみてください-> <prettyPrint>true</prettyPrint>

consoleAppenderでログを2回再書き込みします

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