我的日志文件中有这样的内容:
DATATYPE::SERVICEPERFDATA TIMET::1519222690 HOSTNAME::localhost SERVICEDESC::Total Processes SERVICEPERFDATA::procs=59;250;400;0; SERVICECHECKCOMMAND::check_local_procs!250!400!RSZDT HOSTSTATE::UP HOSTSTATETYPE::HARD SERVICESTATE::OK SERVICESTATETYPE::HARD
我想将消息中的SERVICEPERFDATA::procs=59;250;400;0;
替换为此类键值对。
SERVICEPERFDATA::59
所以我可以使用kv过滤器将数据拆分为键和值。
我尝试过使用Logstash mutate和gsub,但找不到合适的正则表达式来实现我的目标。
谢谢, 查兰
答案 0 :(得分:3)
您可以使用捕获组来获取正则表达式的一部分,并在mutate / gsub配置的替换部分中使用它。
mutate {
gsub => ["message","(?<=SERVICEPERFDATA::)procs=(\d+);\S+", "\1"]
}
(?<=SERVICEPERFDATA::)
使正则表达式仅适用于SERVICEPERFDATA::
。 procs=(\d+);\S+
正则表达式会将procs=
和下一个;
之间的所有数字放在一个组中,然后将其用于配置的替换部分("\1"
)。 / p>
过滤器的结果:SERVICEPERFDATA::59
另一种选择是使用两个mutate / gsub过滤器,每个过滤器都有一个更简单的配置。
答案 1 :(得分:2)
正则表达式:procs=([^;]+)\S+
或(?<=SERVICEPERFDATA::)procs=([^;]+)\S+
Substutution :\1
详细说明:
()
捕获小组[^]
匹配列表中不存在的单个字符+
匹配一次且无限次\S
匹配任何非空格字符(等于[^\r\n\t\f\v ]
)\1
第1组。代码:
mutate {
gsub => [
"fieldname", "procs=([^;]+)\S+", "\1",
]
}