Open LibertyでJSON形式のログを出す場面でハマったので、解決方法の備忘録です。
課題
以下の記事を参考にOpen Liberty上で稼働するJakarta EEアプリケーションのJSONログを標準出力に書き出そうとしました。 このアプリケーションは、Log4j 2でログをJSONに成形しています。
しかし、Open Libertyのserver.xmlで <logging appsWriteJson="true" />
を入れているのにも関わらず、
Open Liberty本体のJSONログの message
フィールドに、アプリケーションのJSONログがラップされてしまう事象に遭遇しました。
以下のJSONはログの出力例です。JSONログの中に本来出力したかったJSONが含まれています。
{ "type": "liberty_message", "host": "...", "ibm_userDir”:”…”, ”ibm_serverName": "defaultServer", "message": "{\"timeMillis\":1659259664388,\"thread\":\"Default Executor-thread-8\",\"level\":\"INFO\",\"loggerName\":\"net.ponzmild.rest.resource.SampleResource\",\"message\":\"Called endpoint: GET /sample\",\"endOfBatch\":false,\"loggerFqcn\":\"org.apache.logging.slf4j.Log4jLogger\",\"threadId\":51,\"threadPriority\":5}\r", ... }
解決方法:JSONログ末尾に改行コードを入れない
答えはタイトル通りです。
Open Liberty本体から出力されたログの message
フィールドの内容を見ると、ログメッセージ末尾に改行コード \r
が含まれています。
Open LibertyではアプリケーションのJSONログ末尾に改行コードが含まれていると、JSON形式のログと解釈されないようです。
ドキュメントでこの挙動となる記述を見つけられませんでした。
改行コードを出力しないようにLog4j 2の設定ファイル log4j2.xml を設定します。
gistc985b983b747dbf8bdc303d0ace87528
JSONLayoutタグで eventEol="false"
をセットすればOKです。
Logback等の別のログ出力ライブラリを使用している場合は、同等の設定をすれば解消できるはずです。
課題で挙げたログをOpen Libertyで再度出力させると、Open Libertyのログにラップされず標準出力に出力されるようになりました。
{"timeMillis":1659259784373,"thread":"Default Executor-thread-1","level":"INFO","loggerName":"...","message":"Called endpoint: GET /sample","endOfBatch":false,"loggerFqcn":"org.apache.logging.slf4j.Log4jLogger","threadId":37,"threadPriority":5}
環境情報
今回の課題と解決方法は次の環境で確認しています。 今後のOpen Libertyのバージョンアップで挙動は変わるかもしれません。
以上。