使用log4j在自由控制台中记录消息

时间:2018-12-11 11:40:08

标签: kubernetes websphere-liberty open-liberty

我们的日志服务器通过kubernetes pods sysout使用我们的日志消息,该格式设置为json,并为json字段建立索引。 我们需要在消息中指定一些预定义的字段,以便我们可以跨Pod跟踪事务。 对于我们的其中一个Pod,我们使用Liberty配置文件,并遇到了配置日志以满足这些需求的问题。

一个想法是使用log4j在控制台中发送自定义的json消息。但是,所有消息都会被处理并修改在控制台中完成的所有日志的Liberty日志系统破坏。我无法根据需要配置Liberty日志记录参数(copySystemStreams = false,控制台日志级别= NO),并且总是有自由来修改我的输出和交错的非json消息。

要解决所有使用liberty consoleFormat =“ json”记录参数的问题,但这引入了不必要的字段,并且不允许我指定自定义字段。

是否可以控制自由日志记录和控制台? 使用Liberty(以及Log4j,如果可能的话)的最佳用例是什么?

2 个答案:

答案 0 :(得分:0)

正如您提到的,Liberty可以登录以JSON格式[1]进行控制台。对于您的用例,您提到的两个问题是:1)不必要的字段,以及2)不允许您指定自定义字段。

关于不必要的字段,Liberty在其JSON模式中具有一组固定的字段,您无法对其进行自定义。如果您发现不需要某些字段,可以考虑以下几种选择:

  • 使用Logstash。
    一些日志处理工具(例如Logstash)允许您删除[2]或更改[3]字段。如果您要将日志发送到Logstash,则可以按照这种方式调整JSON。

  • 使用jq更改Liberty发送到stdout的JSON格式。
    默认CMD(来自websphere-liberty:kernel Dockerfile)为:

    CMD ["/opt/ibm/wlp/bin/server", "run", "defaultServer"]

    您可以将自己的CMD添加到Dockerfile中,以覆盖此内容,如下所示(根据需要调整jq命令):

    CMD /opt/ibm/wlp/bin/server run defaultServer | grep --line-buffered "}" | jq -c '{ibm_datetime, message}'

如果您的用例还需要将log4J输出发送到stdout,我建议更改Dockerfile CMD以运行添加到映像的脚本。在该脚本中,您需要按以下方式尾部log4J日志文件(可以与上述有关如何更改CMD以也使用jq的建议结合起来)

`tail -F myLog.json &`
`/opt/ibm/wlp/bin/server run defaultServer`

[1] https://www.ibm.com/support/knowledgecenter/en/SSEQTP_liberty/com.ibm.websphere.wlp.doc/ae/rwlp_logging.html

[2] https://www.elastic.co/guide/en/logstash/current/plugins-filters-prune.html

[3] https://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html

答案 1 :(得分:0)

以防万一,我遇到了同样的问题,发现的最佳解决方案是:

  • 将应用程序转换为使用java.util.Logging(JUL)
  • server.xml中添加<logging consoleSource="message,trace" consoleFormat="json" traceSpecification="{package}={level}"/>(根据需要交换软件包和级别)。
  • 添加包含bootstrap.properties的{​​{1}}。

这将为您提供一致的JSON服务器和应用程序日志记录。服务器启动时有几行不是json,而是一行空行和“ Launching defaultServer ...”行。

我也希望JSON结构与使用Log4j2的其他容器保持一致,因此,我遵循了dbourne above的建议,并在dockerfile的CMD中添加了jq以重新格式化JSON:

com.ibm.ws.logging.console.format=json

CMD /opt/ol/wlp/bin/server run defaultServer | stdbuf -o0 -i0 -e0 jq -crR '. as $line | try (fromjson | {level: .loglevel, message: .message, loggerName: .module, thread: .ext_thread}) catch $line'停止管道(“ |”)缓冲其输出。

这会剥夺特定于自由的json属性,取决于您的观点,这是好是坏。我不需要新的价值观,因此我对此没有很好的建议。

尽管JUL API不如Log4j2或SLF4j好,但是将JUL API包装到更接近Log4j2的代码中却很少。具有varargs而不是Object []。

如果您编辑stdbuf -o0 -i0 -e0,OpenLiberty还将动态更改日志记录,因此,它几乎具有所有必需的位;例如,恕我直言。