如何将同一份日志输出到不同存储目标?

本文介绍如何将日志分发到不同存储目标,并且每次输出的日志字段集合不同。

背景信息

如果您需要将日志重复输出到多个目标中,但输出到每个目标的字段集合有所不同。例如,原始日志的字段为f1、f2、f3、f4、f5。

  • 输出到target1时,去掉字段f1和f2,保留其他字段。

  • 输出到target2时,去掉字段f3和f4,保留其他字段。

配置示例

原始日志

__time__ : 1591754815
f1: GET
f2: https
f3: aliyun
f4: 200
f5: standard

加工语法

说明

以下示例涉及的数据加工函数,请参见函数总览

  1. 用e_set函数为日志新增字段tag: target1, target2

  2. 用e_split函数根据tag字段将日志分成两份,分别带有字段tag: target1tag: target2

  3. 对于带有字段tag: target1的日志,丢弃f1、f2字段,只有f3、f4、f5字段输出到target1。用e_output函数输出后,带有字段tag: target1的日志不再执行后面的加工规则。

  4. 对于带有字段tag: target2的日志,丢弃f3、f4字段。

e_set("tag", "target1, target2")
e_split("tag")
e_if(e_search("tag==target1"), e_compose(e_drop_fields("f1", "f2", regex=False), e_output("target1")))
e_drop_fields("f3", "f4", regex=False)
e_output("target2")

输出到目标target1

__time__ : 1591754815
f3: aliyun
f4: 200
f5: standard

输出到目标target2

__time__ : 1591754815
f1: GET
f2: https
f5: standard

错误配置

如果您使用如下加工语法,则输出到target1的结果满足需求,但target1的结果会直接输入到target2,导致target2的日志丢失f1、f2字段。

e_drop_fields("f1", "f2", regex=False)
e_coutput("target1")
e_drop_fields("f3", "f4", regex=False)
e_output("target2")