使用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在文档中插入的元信息吗?
暂无答案!
目前还没有任何答案,快来回答吧!