gpt4 book ai didi

java - Log4J2 JsonLayout 打印类、方法和行以及@timestamp 覆盖

转载 作者:太空宇宙 更新时间:2023-11-04 10:09:15 25 4
gpt4 key购买 nike

因此,我们有一个应用程序,我们将把它的所有日志发送到 Kibana 服务器(通过 Kafka 服务器)。

以下是我们设法开始工作的基础知识,可以毫无问题地发布到 Kibana:

        <Kafka name="KafkaAppender" topic="topic1">
<JsonLayout compact="true">
<KeyValuePair key="service" value="some_app_tag"/>
<KeyValuePair key="@timestamp" value="${date:yyyy-MM-dd HH:mm:ss.SSS}"/>
<KeyValuePair key="host_name" value="${hostName}"/>
<KeyValuePair key="unique_id" value="$${map:name:-NA}"/>
</JsonLayout>
<Property name="bootstrap.servers">kafka1.com:9092,kafka2.com:9092,kafka3.com:9092</Property>
</Kafka>

但是我们发现很难在 JsonLayout 中打印出类、方法和行号。这样它就可以被 elasticSearch 索引,从而可以在 Kibana 中作为字段进行搜索。

我们为这 3 个字段尝试了各种语法组合/变体,例如 %c{2} , %M%L对于 Line - 它们都按字面意思打印出来,作为我们尝试放入的变量。

在控制台附加程序中,它们使用: <pattern>%23.23d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] [$${map:name:-NA}] %c{1}.%M(%F:%L): %highlight{%m%n%throwable}</pattern>

"$${map:name:-NA}"是我们添加的内容,用于添加可以根据用户收到的错误消息进行搜索的唯一错误 ID,它的设置方式如下:

    StringMapMessage mapMsg = new StringMapMessage();
mapMsg.put("name", "arun");
LOGGER.fatal(mapMsg);

这有效,我们唯一的问题是

  1. 为 Kafka 输入输出 JSON 中的类、行和方法

  2. 到目前为止,我们还无法覆盖 Kibana 的 @timestamp字段,以便它包含由 log4j 生成的时间戳,以便我们可以可靠地按生成日志的时间/日期进行排序(否则如果它们以随机顺序出现,它们会令人困惑) - 当我们添加 @ 时标志,Kibana 添加了一个标签,如 _timestampparsefailure ,并显示提交的@timestamp_@timestamp ,而不是使用它来覆盖它生成的时间戳。

有人能给点建议吗?我们进行了广泛的搜索,但到目前为止还没有找到任何接近的东西。

谢谢。

最佳答案

将“locationInfo="true"”添加到 Log4j2 配置文件中的 JSON 属性:例如:

<JsonLayout complete="false" locationInfo="true" properties="true" propertiesAsList="true" eventEol="true">

关于java - Log4J2 JsonLayout 打印类、方法和行以及@timestamp 覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52538117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com