logstash 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 前面的空格

uri

这给了我一个输出:

%{DATA:uuid} > %{WORD:LOGlevel_WORD}:%{INT:LOGlevel_INT} %{WORD:RClevel_WORD}:[ ]{0,99}%{NUMBER:RClevel_NUMBER}[ ]{0,99}%{WORD:LOGtype} :%{GREEDYDATA:message}

更新(2021-04-29):可以有负CT值前面没有空格,更新了grok

,

问题似乎是当您使用单个空格作为分隔符时,对吗?

logstash got grok %{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 根据您需要的字符获取数字