logback-fluentd:json消息发送到elasticsearch时未反序列化

wlwcrazw  于 2021-06-10  发布在  ElasticSearch
关注(0)|答案(0)|浏览(270)

使用elasticsearch 7.5.1
一切都在openshift中启动和运行。elasticsearch数据源配置正确,并创建了一个非常简单的 Jmeter 板。
在openshift中运行的spring服务中,我使用logback通过fluentd将json对象记录到elasticsearch中。我需要在elasticsearch中构造json,使每个字段都能在根级别(与elasticsearch生成的元信息级别相同)被索引。
问题是:我没有得到结构化字段,但是,除了元信息之外,还有一个名为“message”的字段,其中jsonobject作为一个整体编写。
示例:我正在发送一个非常简单的json: '{"key1":"value1", "key2": "value2"}' 通过fluentd进行ElasticSearch。正如我在elasticsearch中看到的数据,一切似乎都联系得很好。但是没有看到两个新领域 key1 以及 key2 ,我得到的是一个新领域 message 哪个值是整个json字符串。
从java方面看,这是发送消息的代码:

import com.fasterxml.jackson.databind.ObjectMapper;

(...)

    ObjectMapper mapper = new ObjectMapper();

    Map<String, String> myMap = new HashMap<>();
    myMap.put("key1", "value1");
    myMap.put("key2", "value2");

    logger.info(mapper.writeValueAsString(myMap));

这是我在控制台里看到的:

10:39:12.453 [http-nio-8083-exec-1] INFO  e.m.o.c.s.impl.LoggerServiceImpl - {"key1":"value1","key2":"value2"}

这就是我在fluentd中学到的:

2020-10-05 08:39:12.000000000 +0000 onpay.log: {"traceId":"2ce0c25e938aff9a","spanId":"2ce0c25e938aff9a","spanExportable":"false","X-Span-Export":"false","level":"INFO","X-B3-SpanId":"2ce0c25e938aff9a","logger":"es.minsait.onesait.commons.services.impl.LoggerServiceImpl","X-B3-TraceId":"2ce0c25e938aff9a","thread":"http-nio-8083-exec-1","message":"{\"key1\":\"value1\",\"key2\":\"value2\"}"}

这就是我在格拉法纳所得到的:

绝对不是预期的那样。
以下是logback和fluentd的版本:

<dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.30</version>
    </dependency>

    <dependency>
        <groupId>org.fluentd</groupId>
        <artifactId>fluent-logger</artifactId>
        <version>0.3.4</version>
    </dependency>

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.2.3</version>
    </dependency>

    <dependency>
        <groupId>com.sndyuk</groupId>
        <artifactId>logback-more-appenders</artifactId>
        <version>1.8.0</version>
    </dependency>

这是我的logback配置文件:

<configuration scan="true" scanPeriod="10 seconds">
    <appender name="STDOUT"
          class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
            </pattern>
        </encoder>
    </appender>

    <appender name="FLUENT_TEXT"
              class="ch.qos.logback.more.appenders.DataFluentAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>

        <tag>onpay</tag>
        <label>log</label>

        <remoteHost>127.0.0.1</remoteHost>
        <port>24224</port> <!-- Port is locally forwarded to the Openshift pod -->
        <useEventTime>false</useEventTime>
    </appender>

    <root level = "all">
        <appender-ref ref = "STDOUT"/>
        <appender-ref ref = "FLUENT_TEXT"/>
    </root>
</configuration>

这是我的fluentd配置文件:

<source>
    @type forward
    port 24224
    bind 0.0.0.0
  </source>
  <match *.**>
    @type copy
    <store>
      @type "elasticsearch"
      host "elasticdb"
      port 9200
      logstash_format true
      logstash_prefix "applogs"
      logstash_dateformat "%Y%m%d"
      include_tag_key true
      type_name "app_log"
      tag_key "@log_name"
      flush_interval 1s
      <parse>
        @type json
      </parse>
      <buffer>
        flush_interval 1s
      </buffer>
    </store>
    <store>
      @type "stdout"
    </store>
  </match>

一些非常重要的事情需要注意。如果我将fluentd配置更改为http:

<source>
  @type http
  port 24224
  (...)
</source>
(...)

发送此邮件:

curl --location --request POST 'http://127.0.01:24224/' \
--header 'Content-Type: application/json' \
--data-raw '{
    "key1": "value1",
    "key2": "value2"
}'

它确实很有魅力。这就是我在fluentd中得到的(与其他策略不完全相同):

2020-10-05 08:51:28.099832100 +0000 : {"key1":"value1","key2":"value2"}

这就是我在格拉法纳所得到的:

如上所述,在“转发”版本中,fluentd将元信息插入到要在elasticsearch中索引的文档中:

2020-10-05 08:39:12.000000000 +0000 onpay.log: {"traceId":"2ce0c25e938aff9a","spanId":"2ce0c25e938aff9a","spanExportable":"false","X-Span-Export":"false","level":"INFO","X-B3-SpanId":"2ce0c25e938aff9a","logger":"es.minsait.onesait.commons.services.impl.LoggerServiceImpl","X-B3-TraceId":"2ce0c25e938aff9a","thread":"http-nio-8083-exec-1","message":"{\"key1\":\"value1\",\"key2\":\"value2\"}"}

这使得“重要”消息(我的json对象)被降级到第二级,这就是为什么它被写成一个完整的文本字段。
有人知道如何删除fluentd在文档中插入的元信息吗?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题