logstash Grok 从包含不同日志的日志文件中提取不同的数据
logstash Grok to extract different data from log file containing different log
我的日志文件包含来自不同进程的数据写入同一文件的数据。日志文件如下所示。
我写信是为了编写 Grok 过滤器模式来提取不同的数据并在 Kibana 板中使用它。我尝试了一种模式,但它只适用于日志文件中的一行,它不适用于整个日志文件。
%{UUID:uuid} > %{WORD:level}:%{INT:LOGlevel} %{WORD:RClevel}: %{INT:RClevel} %{WORD:LOGtype} :%{GREEDYDATA:message }
我需要日志中有关 MGMT_RDCIP_INFO、PCI、DP_DRIVER 的数据,例如 RATIO、QUALITY、Ceiling 数据。谁能指导我如何从日志中获取特定关键字数据。
ef22119900-99ecf-10e9-7dfc-ffe0ea066dfff > LVL:3 CT: 0 MGMT_RDCIP_INFO :Bandwidth Management for Server: Ceiling = 112500.000000, Floor = 12500.000000, Active = 14825.552639
ef22119900-99ecf-10e9-7dfc-ffe0ea066dfff > LVL:3 CT: 0 PCI :Display 0 codec 0 (H264 Encoder) frames encoded per second : 11.56
ef22119900-99ecf-10e9-7dfc-ffe0ea066dfff > LVL:3 CT: 0 PCI :Display 1 codec 0 (H264 Encoder) frames encoded per second : 25.92
ef22119900-99ecf-10e9-7dfc-ffe0ea066dfff > LVL:3 CT: 0 PCI :QUALITY: 81.3918 81.3918 0.0 0.0
ef22119900-99ecf-10e9-7dfc-ffe0ea066dfff > LVL:3 CT: 0 PCI :RATIO: 5.73013 94.2699 0.0 0.0
ef22119900-99ecf-10e9-7dfc-ffe0ea066dfff > LVL:3 CT: 0 DP_DRIVER :Display duplication output id: 1 move MPPS 0.00, dirty MPPS 162.59, total MPPS 162.59```
[![snaphot of log file][1]][1]
[1]: https://i.stack.imgur.com/wuFum.jpg
UUID 最好看成DATA 类型,还要确保你没有在RCLevel 和LOGtype
前面选择spaces
%{DATA:uuid} > %{WORD:LOGlevel_WORD}:%{INT:LOGlevel_INT} %{WORD:RClevel_WORD}:[ ]{0,99}%{NUMBER:RClevel_NUMBER}[ ]{0,99}%{WORD:LOGtype} :%{GREEDYDATA:message}
这给了我这样的输出:
{
"RClevel_INT": "0",
"LOGlevel_WORD": "LVL",
"LOGtype": "MGMT_RDCIP_INFO",
"RClevel_WORD": "CT",
"LOGlevel_INT": "3",
"message": "Bandwidth Management for Server: Ceiling = 112500.000000, Floor = 12500.000000, Active = 14825.552639",
"uuid": "ef22119900-99ecf-10e9-7dfc-ffe0ea066dfff"
}
{
"RClevel_INT": "0",
"LOGlevel_WORD": "LVL",
"LOGtype": "PCI",
"RClevel_WORD": "CT",
"LOGlevel_INT": "3",
"message": "Display 0 codec 0 (H264 Encoder) frames encoded per second : 11.56\r",
"uuid": "ef22119900-99ecf-10e9-7dfc-ffe0ea066dfff"
}
更新 (2021-04-29): 可以有负的 CT 值前面没有 space,更新了 grok
问题似乎出在您使用单个 space 作为分隔符时,对吗?
logstash 得到 grok %{SPACE}
它将删除整个 space 直到下一个字符
我的 grok 过滤器
%{UUID:uuid} > %{WORD:level}:%{INT:LOGlevel} %{WORD:RClevel}:%{SPACE}%{WORD:LOGtype}%{SPACE}%{DATA:stuffyouwant}%{SPACE}:%{GREEDYDATA:message}
我已经测试过了,它适用于所有情况。
编辑
似乎您有一些案例可以使用 if 语句。
它需要 2 grok as
filter{
grok{
match{
"message"="%{UUID:uuid} > %{WORD:level}:%{INT:LOGlevel} %{WORD:RClevel}:%{SPACE}%{WORD:LOGtype}%{SPACE}%{DATA:stuffyouwant}%{SPACE}:%{DATA:parameters}: %{GREEDYDATA:stuffs}"
}
}
if [parameters] == "RATIO"{
grok{
match{
"stuff"="%{NUMBER:ratio1} %{NUMBER:ratio2} %{NUMBER:ratio3} %{NUMBER:ratio4}%{GREEDYDATA:allratio}"
}
}
} else if [parameters]=="QUALITY"{
grok{
match{"stuff"="%{NUMBER:q1} %{NUMBER:q2} %{NUMBER:q3} %{NUMBER:q4}%{GREEDYDATA:allq}"
}
}
}else if [parameters]==""{
grok{
etc...
}
}
}
}
首先grok识别参数,
每个 if 语句的第二个 grok 根据您需要的字符获取数字
我的日志文件包含来自不同进程的数据写入同一文件的数据。日志文件如下所示。
我写信是为了编写 Grok 过滤器模式来提取不同的数据并在 Kibana 板中使用它。我尝试了一种模式,但它只适用于日志文件中的一行,它不适用于整个日志文件。
%{UUID:uuid} > %{WORD:level}:%{INT:LOGlevel} %{WORD:RClevel}: %{INT:RClevel} %{WORD:LOGtype} :%{GREEDYDATA:message }
我需要日志中有关 MGMT_RDCIP_INFO、PCI、DP_DRIVER 的数据,例如 RATIO、QUALITY、Ceiling 数据。谁能指导我如何从日志中获取特定关键字数据。
ef22119900-99ecf-10e9-7dfc-ffe0ea066dfff > LVL:3 CT: 0 MGMT_RDCIP_INFO :Bandwidth Management for Server: Ceiling = 112500.000000, Floor = 12500.000000, Active = 14825.552639
ef22119900-99ecf-10e9-7dfc-ffe0ea066dfff > LVL:3 CT: 0 PCI :Display 0 codec 0 (H264 Encoder) frames encoded per second : 11.56
ef22119900-99ecf-10e9-7dfc-ffe0ea066dfff > LVL:3 CT: 0 PCI :Display 1 codec 0 (H264 Encoder) frames encoded per second : 25.92
ef22119900-99ecf-10e9-7dfc-ffe0ea066dfff > LVL:3 CT: 0 PCI :QUALITY: 81.3918 81.3918 0.0 0.0
ef22119900-99ecf-10e9-7dfc-ffe0ea066dfff > LVL:3 CT: 0 PCI :RATIO: 5.73013 94.2699 0.0 0.0
ef22119900-99ecf-10e9-7dfc-ffe0ea066dfff > LVL:3 CT: 0 DP_DRIVER :Display duplication output id: 1 move MPPS 0.00, dirty MPPS 162.59, total MPPS 162.59```
[![snaphot of log file][1]][1]
[1]: https://i.stack.imgur.com/wuFum.jpg
UUID 最好看成DATA 类型,还要确保你没有在RCLevel 和LOGtype
前面选择spaces%{DATA:uuid} > %{WORD:LOGlevel_WORD}:%{INT:LOGlevel_INT} %{WORD:RClevel_WORD}:[ ]{0,99}%{NUMBER:RClevel_NUMBER}[ ]{0,99}%{WORD:LOGtype} :%{GREEDYDATA:message}
这给了我这样的输出:
{
"RClevel_INT": "0",
"LOGlevel_WORD": "LVL",
"LOGtype": "MGMT_RDCIP_INFO",
"RClevel_WORD": "CT",
"LOGlevel_INT": "3",
"message": "Bandwidth Management for Server: Ceiling = 112500.000000, Floor = 12500.000000, Active = 14825.552639",
"uuid": "ef22119900-99ecf-10e9-7dfc-ffe0ea066dfff"
}
{
"RClevel_INT": "0",
"LOGlevel_WORD": "LVL",
"LOGtype": "PCI",
"RClevel_WORD": "CT",
"LOGlevel_INT": "3",
"message": "Display 0 codec 0 (H264 Encoder) frames encoded per second : 11.56\r",
"uuid": "ef22119900-99ecf-10e9-7dfc-ffe0ea066dfff"
}
更新 (2021-04-29): 可以有负的 CT 值前面没有 space,更新了 grok
问题似乎出在您使用单个 space 作为分隔符时,对吗?
logstash 得到 grok %{SPACE}
它将删除整个 space 直到下一个字符
我的 grok 过滤器
%{UUID:uuid} > %{WORD:level}:%{INT:LOGlevel} %{WORD:RClevel}:%{SPACE}%{WORD:LOGtype}%{SPACE}%{DATA:stuffyouwant}%{SPACE}:%{GREEDYDATA:message}
我已经测试过了,它适用于所有情况。
编辑
似乎您有一些案例可以使用 if 语句。 它需要 2 grok as
filter{
grok{
match{
"message"="%{UUID:uuid} > %{WORD:level}:%{INT:LOGlevel} %{WORD:RClevel}:%{SPACE}%{WORD:LOGtype}%{SPACE}%{DATA:stuffyouwant}%{SPACE}:%{DATA:parameters}: %{GREEDYDATA:stuffs}"
}
}
if [parameters] == "RATIO"{
grok{
match{
"stuff"="%{NUMBER:ratio1} %{NUMBER:ratio2} %{NUMBER:ratio3} %{NUMBER:ratio4}%{GREEDYDATA:allratio}"
}
}
} else if [parameters]=="QUALITY"{
grok{
match{"stuff"="%{NUMBER:q1} %{NUMBER:q2} %{NUMBER:q3} %{NUMBER:q4}%{GREEDYDATA:allq}"
}
}
}else if [parameters]==""{
grok{
etc...
}
}
}
}
首先grok识别参数, 每个 if 语句的第二个 grok 根据您需要的字符获取数字