日志分发

最近更新时间:2024-10-18 10:20:11

我的收藏

场景描述

小王将日志采集到日志服务(Cloud Log Service,CLS),日志通过双竖线||分割,有日志的时间、日志级别、任务 ID、进程名称、主机 IP 等。现在小王想将日志结构化,并按照 ERROR、WARNING、INFO 三个级别,把日志分发到三个不同的目标日志主题中,便于后续的分析。

场景分析

1. 日志结构化:按照双竖线||分割符,对日志进行结构化。
2. 日志分发:按照 ERROR、WARNING、INFO 三个级别,把日志分发到三个不同的目标日志主题。
说明:
新建数据加工任务 时,目标日志主题选择固定日志主题,并提前定义目标名称。该名称将用在 log_output("目标名称") 函数中。




原始日志

[
{
"message": "2021-12-09 11:34:28.279||INFO||605c643e29e4||BIN--Python||192.168.1.1"
},
{
"message": "2021-12-09 11:35:28.279||WARNING||615c643e22e4||BIN--Java||192.168.1.1"
},
{
"message": "2021-12-09 11:36:28.279||ERROR||635c643e22e4||BIN--Go||192.168.1.1"
}
]

DSL 加工函数

//使用||作为分隔符(竖线需要转义),从message中提取time,loglevel,taskId,ProcessName,ip字段.
ext_sepstr("message","time,loglevel,taskId,ProcessName,ip",sep="\\|\\|")

//丢弃message
fields_drop("message")

//使用switch语句进行分发
t_switch(

//loglevel为"INFO",输出到info_log
op_str_eq(v("loglevel"),"INFO"),log_output("info_log"),
//loglevel为"WARNING",输出到warning_log
op_str_eq(v("loglevel"),"WARNING"),log_output("warning_log"),
//loglevel为"ERROR",输出到error_log
op_str_eq(v("loglevel"),"ERROR"),log_output("error_log")

)

加工结果

error_log 中:
{
"ProcessName":"BIN--Go",
"ip":"192.168.1.1",
"loglevel":"ERROR",
"taskId":"635c643e22e4",
"time":"2021-12-09 11:36:28.279"
}
warning_log 中:
{
"ProcessName":"BIN--Java",
"ip":"192.168.1.1",
"loglevel":"WARNING",
"taskId":"615c643e22e4",
"time":"2021-12-09 11:35:28.279"
}
info_log 中:
{
"ProcessName":"BIN--PYTHON",
"ip":"192.168.1.1",
"loglevel":"INFO",
"taskId":"605c643e29e4",
"time":"2021-12-09 11:34:28.279"
}
注意
必须要提前配置好目标日志主题和目标名称。