我们的日志服务器通过kubernetes pods sysout使用我们的日志消息,该格式设置为json,并为json字段建立索引。 我们需要在消息中指定一些预定义的字段,以便我们可以跨Pod跟踪事务。 对于我们的其中一个Pod,我们使用Liberty配置文件,并遇到了配置日志以满足这些需求的问题。
一个想法是使用log4j在控制台中发送自定义的json消息。但是,所有消息都会被处理并修改在控制台中完成的所有日志的Liberty日志系统破坏。我无法根据需要配置Liberty日志记录参数(copySystemStreams = false,控制台日志级别= NO),并且总是有自由来修改我的输出和交错的非json消息。
要解决所有使用liberty consoleFormat =“ json”记录参数的问题,但这引入了不必要的字段,并且不允许我指定自定义字段。
是否可以控制自由日志记录和控制台? 使用Liberty(以及Log4j,如果可能的话)的最佳用例是什么?
答案 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`
[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)
以防万一,我遇到了同样的问题,发现的最佳解决方案是:
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还将动态更改日志记录,因此,它几乎具有所有必需的位;例如,恕我直言。