Ponz Dev Log

ゆるくてマイペースな開発日記

Open Libertyで出力するJSONログは末尾に改行を入れるな

Open LibertyでJSON形式のログを出す場面でハマったので、解決方法の備忘録です。

課題

以下の記事を参考にOpen Liberty上で稼働するJakarta EEアプリケーションのJSONログを標準出力に書き出そうとしました。 このアプリケーションは、Log4j 2でログをJSONに成形しています。

qiita.com

しかし、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のバージョンアップで挙動は変わるかもしれません。

  • Open Liberty ... 22.0.0.7
  • Java ... OpenJDK 11.0.16
  • Log4j 2 ... 2.18.0

以上。