logstash Grok从包含不同日志的日志文件中提取不同的数据

logstash Grok从包含不同日志的日志文件中提取不同的数据,logstash,logstash-grok,logfile,grok,logfile-analysis,Logstash,Logstash Grok,Logfile,Grok,Logfile Analysis,我的日志文件包含来自不同进程的数据,在同一文件上写入数据。日志文件如下所示 我写这篇文章的目的是编写Grok过滤器模式,以提取不同的数据,并将其用于Kibana板。我尝试了一种模式,但它只适用于日志文件中的一行,不适用于整个日志文件 %{UUID:UUID}>%{WORD:level}:%{INT:LOGlevel}%{WORD:RClevel}:%{INT:RClevel}%{WORD:LOGtype}:%{greedydyddata:message} 我需要从日志中获取有关管理信息、PCI、

我的日志文件包含来自不同进程的数据,在同一文件上写入数据。日志文件如下所示

我写这篇文章的目的是编写Grok过滤器模式,以提取不同的数据,并将其用于Kibana板。我尝试了一种模式,但它只适用于日志文件中的一行,不适用于整个日志文件

%{UUID:UUID}>%{WORD:level}:%{INT:LOGlevel}%{WORD:RClevel}:%{INT:RClevel}%{WORD:LOGtype}:%{greedydyddata:message}

我需要从日志中获取有关管理信息、PCI、DP驱动程序的数据,如比率、质量、上限数据。有人能告诉我如何从日志中获取特定的关键字数据吗

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最好被视为数据类型,同时确保您没有拾取RCLevel和LOGtype前面的空格

%{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值可能为负值,更新了grok

问题似乎在于使用单个空格作为分隔符,对吗

logstash获得了grok
%{SPACE}
它将删除整个空格直到下一个字符

我的grok过滤器

%{UUID:uuid} > %{WORD:level}:%{INT:LOGlevel} %{WORD:RClevel}:%{SPACE}%{WORD:LOGtype}%{SPACE}%{DATA:stuffyouwant}%{SPACE}:%{GREEDYDATA:message}
我已经对它进行了测试,它在所有情况下都有效

编辑 似乎您有使用if语句可以使用的case。 它需要2克

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...
        }
    }
    }
}

首先尝试确定参数,
第二步是根据你所需要的字符来计算每个if语句的数字

谢谢你,这帮了大忙。有必要从消息部分提取特定数据,比如每秒编码的帧。此外,CT值有时显示为负整数,例如
EF221119900-99ecf-10e9-7dfc-ffe0ea066dfff>LVL:1 CT:-520 PCI:No codec ID像素源元数据
,因此我将%{INT:RClevel_INT}更改为%{greedData:ctmessage}。请记住,您也可以使用数字数据类型,并且您可以更改模式以使用最小和最大空格数的计数,这将为此更新代码段谢谢。我的主要目标是从GREEDYDATA中获取信息。绘制图表所需的比率、质量、上限等信息。你知道我如何从日志中获取特定的关键字数据吗?请原谅我的误解,我添加了一些样本过滤器,似乎适合你的需要,如果我的答案对你有帮助,请投上一票,或者如果它满足了你的需要,请接受它作为答案。