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>
コンソールの別の行にログオンできるように、構成に何か不足していますか?.
これについて何か助けてくれてありがとう。
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>
JSONレイアウトとして問題がなかった logstash-logback-encoder を使用するように切り替えました。
次のようなものを使用して、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)'
PrettyPrintをtrueに設定することが1つの解決策です。ただし、クラウドウォッチなどのサービスにリーミングする場合のように、1行のログが必要な場合があります。レイアウトに以下を追加
<appendLineSeparator>true</appendLineSeparator>
編集済み: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>