向应用程序中添加日志记录功能

运行 WebSphere® Application Server Liberty 应用程序时,可以使用 Java 日志记录 (使用 java.util.logging) 来生成应用程序日志记录。

[ 24.0.0.9 以及之后]Open Liberty 您可以使用 遥测功能( 及更高版本)作为单一解决方案,通过 协议为 MicroProfile 2.0 OpenTelemetry 您的Liberty 应用程序收集和发送日志、指标和跟踪。 更多信息,请访问 Open Liberty 网站

有关此任务

相比在代码中添加 System.out.println 语句,此方法更有优势:
  • 消息将会使用含额外数据(例如,自动添加的日期和时间戳记)的标准消息格式,显示在 messages.logtrace.log 文件中。
  • 您可以更轻松地将自己应用程序中的问题和事件与与 Liberty 组件相关联的问题和事件相关联。
  • 您可以使用 Liberty 日志文件管理功能部件。
  • 您可以在 server.xml 文件中使用日志记录元素的 traceSpecification 来控制记录器级别。

过程

配置 LogRecordContext API 以向日志和跟踪记录添加名称/值对。
Liberty 提供了可用于以 "名称/值" 对形式向日志和跟踪记录添加上下文的 API。 这些“名称/值”对会显示在以下位置中:
  • messages.log 文件(如果该日志配置为使用 JSON 格式)
  • 控制台输出(如果控制台配置为使用 JSON 格式)
  • logstashCollector 发送到 Logstash 的记录

更多信息,请参阅 LogRecordContext API文档

请使用以下示例来包括使用 JSON 格式的“名称/值”对:

LogRecordContext API
Applications that use the LogRecordContext API will have the name-value pairs that have been added to the LogRecordContext included in the JSON mapping for logs and trace emitted on the same thread.

STRING/STRING pairs
// included in json at root level as "ext_someName":"someValue"
LogRecordContext.addExtension("someName","someValue");          

STRING/INTEGER pairs
// included in json at root level as "ext_someName_int":someValue (or entirely omitted if someValue isn't parseable as an int)
LogRecordContext.addExtension("someName_int","someValue");      

STRING/FLOAT pairs
// included in json at root level as "ext_someName_float":someValue (or entirely omitted if someValue isn't parseable as a float)
LogRecordContext.addExtension("someName_float","someValue");      

STRING/BOOLEAN pairs
// included in json at root level as "ext_someName_bool":someValue (or entirely omitted if someValue isn't parseable as a bool)
LogRecordContext.addExtension("someName_bool","someValue");

请参阅 LogRecordContext API 所使用的“名称/值”对的以下示例:

LogRecordContext.addExtension("userName","don");          
LogRecordContext.addExtension("isGoldCustomer_bool":"true");
Logger.info("some message");
LogRecordContext.removeExtension("userName");
LogRecordContext.removeExtension("isGoldCustomer_bool");
Logger.info("some other message");

// first message includes the extensions
{"ibm_datetime":"2018-02-04T18:56:30.318-0500","type":"liberty_message","host":"192.168.1.1","ibm_userDir":"\/wlp\/usr\/","ibm_serverName":"server1","ibm_sequence":"1517788590318_000000003A4A7","loglevel":"INFO","module":"com.ibm.somelogger.QuickLogTest","ibm_threadId":"00002db5","message":"some message", "ext_userName":"don", "isGoldCustomer_bool":true}

// second message does not include extensions
{"ibm_datetime":"2018-02-04T18:56:30.318-0500","type":"liberty_message","host":"192.168.1.1","ibm_userDir":"\/wlp\/usr\/","ibm_serverName":"server1","ibm_sequence":"1517788590318_000000003A4A8","loglevel":"INFO","module":"com.ibm.somelogger.QuickLogTest","ibm_threadId":"00002db5","message":"some other message"}