简介
字段处理函数,就是对日志中的字段进行处理,如下图所示:
v 函数
函数定义
获取字段值,返回对应字符串。
语法描述
v(字段名)
参数说明
参数名称 | 参数描述 | 参数类型 | 是否必须 | 参数默认值 | 参数取值范围 |
field | 字段名 | string | 是 | - | - |
示例
获取 "message" 字段的值,将它赋值给一个新字段 "new_message"。
原始日志:
{"message": "failed", "status": "500"}
加工规则:
fields_set("new_message", v("message"))
加工结果:
{"message": "failed", "new_message": "failed","status": "500"}
fields_drop 函数
函数定义
根据字段名进行匹配,删除匹配到的字段。
语法描述
fields_drop(字段名1, 字段名2, ..., regex=False,nest=False)
参数说明
参数名称 | 参数描述 | 参数类型 | 是否必须 | 参数默认值 | 参数取值范围 |
可变参,字段名或字段名的正则表达式 | 可变参,字段名或字段名的正则表达式 | string | 是 | - | - |
regex | 是否启用正则表达式,匹配模式为全匹配 | bool | 否 | False | - |
nest | 是否是嵌套字段 | bool | 否 | False | - |
示例
示例1:删除字段名为 "field" 的字段。
原始日志:
{"field": "a,b,c", "status": "500"}
加工规则:
fields_drop("field")
加工结果:
{"status":"500"}
示例2:嵌套字段的处理。
原始日志:
{"condition":"{\\"a\\":\\"aaa\\", \\"c\\":\\"ccc\\", \\"e\\":\\"eee\\"}","status":"500"}
加工规则:
//nest=True,表示该字段是嵌套字段,将condition.a和condition.c丢弃后,只剩下condition.e字段。t_if(if_json(v("condition")), fields_drop("condition.a", "condition.c", nest=True))
加工结果:
{"condition":"{\\"e\\":\\"eee\\"}","status":"500"}
示例3:嵌套字段的处理。
原始日志:
{"App": "thcomm","Message": "{\\"f_httpstatus\\": \\"200\\",\\"f_requestId\\": \\"2021-11-09 08:40:17.832\\tINFO\\tservices/http_service.go:361\\tbb20ac02-fcbc-4a56-b1f1-4064853b79da\\",\\"f_url\\": \\"wechat.wecity.qq.com/trpcapi/MbpsPaymentServer/scanCode\\"}"}
加工规则:
//nest=True,表示该字段是嵌套字段,将Message.f_requestId", Message.f_url丢弃后,只剩下字f_httpstatus段。t_if(if_json(v("Message")), fields_drop("Message.f_requestId", "Message.f_url", nest=True))
加工结果:
{"App":"thcomm","Message":"{\\"f_httpstatus\\":\\"200\\"}"}
fields_keep 函数
函数定义
根据字段名进行匹配,保留匹配到的字段。
语法描述
fields_keep(字段名1, 字段名2, ..., regex=False)
参数说明
参数名称 | 参数描述 | 参数类型 | 是否必须 | 参数默认值 | 参数取值范围 |
可变参,字段名或字段名的正则表达式 | 可变参,字段名或字段名的正则表达式 | string | 是 | - | - |
regex | 是否启用正则表达式,匹配模式为全匹配 | bool | 否 | False | - |
示例
保存字段名为 "field" 的字段,其余字段丢弃。
原始日志:
{"field": "a,b,c", "status": "500"}
加工规则:
fields_keep("field")
加工结果:
{"field":"a,b,c"}
fields_pack 函数
函数定义
根据正则表达式来匹配字段名,并将匹配到的字段打包到新的字段,新字段值使用 JSON 格式进行组织。
语法描述
fields_pack(目标字段名, include=".*", exclude="", drop_packed=False)
参数说明
参数名称 | 参数描述 | 参数类型 | 是否必须 | 参数默认值 | 参数取值范围 |
output | 打包后的新字段名称 | string | 是 | - | - |
include | 包含字段名称的正则 | string | 否 | - | - |
exclude | 排除字段名称的正则 | string | 否 | - | - |
drop_packed | 是否删除原有被打包的字段 | bool | 否 | False | - |
示例
原始日志:
{"field_a": "a,b,c","field_b": "abc", "status": "500"}
加工规则:
fields_pack("new_field","field.*", drop_packed=False)
加工结果:
{"new_field":"{\\"field_a\\":\\"a,b,c\\",\\"field_b\\":\\"abc\\"}","field_a":"a,b,c","field_b":"abc","status":"500"}
fields_set 函数
函数定义
用来设置字段值,或者增加新字段。
语法描述
fields_set(字段名1, 字段值1, 字段名2, 字段值2, mode="overwrite")
参数说明
参数名称 | 参数描述 | 参数类型 | 是否必须 | 参数默认值 | 参数取值范围 |
可变参 | key、value 交替的参数列表 | string | - | - | - |
mode | 字段覆写模式 | string | 否 | overwrite | - |
示例
示例1:将级别从 “Info” 修改为 “Waring”。
原始日志:
{"级别": "Info"}
加工规则:
fields_set("级别", "Warning")
加工结果:
{"级别":"Warning"}
示例2:新增两个字段,"new"和"new2"。
原始日志:
{"a": "1", "b": "2", "c": "3"}
加工规则:
fields_set("new", v("b"), "new2", v("c"))
加工结果:
{"a":"1","b":"2","c":"3","new":"2","new2":"3"}
fields_rename 函数
函数定义
字段重命名。
语法描述
fields_rename(字段名1, 新字段名1, 字段名2, 新字段名2, regex=False)
参数说明
参数名称 | 参数描述 | 参数类型 | 是否必须 | 参数默认值 | 参数取值范围 |
可变参 | 旧字段名、新字段名交替的参数列表 | string | - | - | - |
regex | 字段名是否启用正则匹配,启用使用正则匹配旧字段名,不启用则是相等匹配 | bool | 否 | False | - |
示例
原始日志:
{"regieeen": "bj", "status": "500"}
加工规则:
fields_rename("reg.*", "region", regex=True)
加工结果:
{"region":"bj","status":"500"}
has_field 函数
函数定义
字段存在时,返回 True,否则返回 False。
语法描述
has_field(字段名)
参数说明
参数名称 | 参数描述 | 参数类型 | 是否必须 | 参数默认值 | 参数取值范围 |
field | 字段名 | string | 是 | - | - |
示例
原始日志:
{"regiooon": "bj", "status": "500"}
加工规则:
t_if(has_field("regiooon"), fields_rename("regiooon", "region"))
加工结果:
{"region":"bj","status":"500"}
not_has_field 函数
函数定义
字段不存在时,返回 True,否则返回 False。
语法描述
not_has_field(字段名)
参数说明
参数名称 | 参数描述 | 参数类型 | 是否必须 | 参数默认值 | 参数取值范围 |
field | 字段名 | string | 是 | - | - |
示例
原始日志:
{"status": "500"}
加工规则:
t_if(not_has_field("message"), fields_set("no_message", True))
加工结果:
{"no_message":"TRUE","status":"500"}
extract_tag 函数
函数定义
为动态生成的主题打标签。从日志字段中提取标签值,并将这些标签值作为动态生成主题的标签。
注意:
仅可用于动态生成日志主题,即log_auto_output()函数之后。
其中静态标签和动态标签的总数不超过10对。
例如这条语句
log_auto_output(v("pd"),"我的日志集",index_options="content_index", period=3,tag_static="Ckafka:test_env,developer:MikeWang",tag_dynamic=extract_tag("pd",v("pd"),"team", v("team")))
语法描述
extract_tag(标签名1,标签值1,标签名2,标签值2....)
参数说明
参数名称 | 参数描述 | 参数类型 | 是否必须 | 参数默认值 | 参数取值范围 |
标签名 | 标签名 | string | 是 | - | - |
标签值 | 标签值 | string | 是 | - | - |
示例
原始日志:
[{"pd": "CDN", "team": "test"},{"pd": "CLS", "team": "product"},{"pd": "COS", "team": "sales"},{"pd": "CLS", "team": "test"},{"pd": "CKafka", "team": "product"}]
说明:
同一个日志主题,相同的标签名,仅最早的标签值生效,该示例中,名称为CLS的日志主题,team:produc是最早的标签值,该标签生效,后续的team:test 标签不生效,因为它们的标签名相同。
加工规则:
log_auto_output(v("pd"),"我的日志集",index_options="content_index", period=3,tag_static="Ckafka:test_env",tag_dynamic=extract_tag("pd",v("pd"),"team", v("team")))
加工结果:
生成了名为COS,CKafka,CLS ,CDN的日志主题,并为这几个日志主题打标签。语句中有静态标签tag_static1对,动态标签2对,因此都生成了3对标签。