Fluentd结合OpenSearch:@timestamp字段来源探究
问题:OpenSearch中
@timestamp字段的来源疑惑 我在Kubernetes集群中以DaemonSet方式运行Fluentd,将日志写入OpenSearch。日志流转流程如下:
- Kubernetes Pod将日志输出到stdout,容器运行时把日志写入
/var/logs/pods/<pod_specific_location>,日志格式示例:
31-12-23T12:00:00.123456Z stdout F my great log message
- Fluentd通过cri parser插件解析后得到如下结构化数据:
{ "time": "31-12-23T12:00:00.123456Z", "stream": "stdout", "logtag": "F", "message": "my great log message" }
- 再经kubernetes metadata插件注入Kubernetes元数据后,日志记录会包含namespace、pod名称等信息,最后通过opensearch插件发送至OpenSearch。
但在OpenSearch Dashboards中发现@timestamp字段,且该字段值与解析得到的time字段存在差异。我认为该字段并非来自OpenSearch插件,因为在非Kubernetes环境下使用其他输入插件时,不会出现该字段。请问@timestamp字段究竟来自哪里?
回答
@timestamp是Fluentd的内置时间字段,默认由输入插件生成。在你的K8s日志采集场景中,用的是tail输入插件(用于读取/var/logs/pods下的日志文件),这个插件默认会把日志被Fluentd采集到的时间(也就是文件读取时间)赋值给@timestamp,而非日志本身携带的time字段,这就是两个字段值存在差异的原因。
你提到非K8s环境用其他输入插件时没遇到这个问题,是因为不同输入插件的默认行为不同——有些插件不会自动生成这个字段,或者你之前的配置里显式覆盖/禁用了它。
如果想要让@timestamp和日志本身的time字段保持一致,有两种常用配置方式:
- 利用tail插件的
time_key参数:直接在tail输入插件的配置里指定time_key time,让插件自动将解析出的time字段作为@timestamp的来源,无需额外过滤插件。 - 使用record_transformer插件覆盖:在filter阶段添加配置,将解析后的
time字段转成标准时间格式后替换@timestamp:
<filter **> @type record_transformer enable_ruby true <record> @timestamp ${Time.parse(record["time"]).iso8601} </record> </filter>
内容的提问来源于stack exchange,提问作者YoavKlein
相关产品推荐
相关产品推荐

