过滤数据时出现logstash grok问题

Posted

技术标签:

【中文标题】过滤数据时出现logstash grok问题【英文标题】:logstash grok issue while filtering data 【发布时间】:2019-05-21 05:26:44 【问题描述】:

我有一个数据,基本上是通过 rm 命令删除数据,如下所示。

ttmv516,19/05/21,03:59,00-mins,dvcm,dvcm 166820 4.1 0.0 4212 736 ? DN 03:59 0:01 rm -rf /dv/project/agile/mce_dev_folic/test/install.asan/install,/dv/svgwwt/commander/workspace4/dvfcronrun_IL-SFV-RHEL6.5-K4_kinite_agile_invoke_dvfcronrun_at_given_site_50322

我在下面使用 logstash grok,它工作正常,但直到最近我才看到两个奇怪的问题 1)_grokparsefailure 另一个 2)Hostname Field 没有正确显示,即它的初始字符不像ttmv516看起来像mv516

%HOSTNAME:Hostname,%DATE:Date,%HOUR:dt_h:%MINUTE:dt_m,%NUMBER:duration-%WORD:hm,%USER:User,%USER:User_1 %NUMBER:Pid %NUMBER:float %NUMBER:float %NUMBER:Num_1 %NUMBER:Num_2 %DATA (?:%HOUR:dt_h1:|)(?:%MINUTE:dt_m1|) (?:%HOUR:dt_h2:|)(?:%MINUTE:dt_m2|)%GREEDYDATA:CMD,%GREEDYDATA:PWD_PATH

但是,在 Kibana 数据中使用 grok Debugger 进行相同的测试显示正确。

我的logstash文件如下。

cat /etc/logstash/conf.d/rmlog.conf
input 
  file 
    path => [ "/data/rm_logs/*.txt" ]
    start_position => beginning
    sincedb_path => "/data/registry-1"
    max_open_files => 64000
    type => "rmlog"
  


filter 
  if [type] == "rmlog" 
    grok 
     match =>  "message" => "%HOSTNAME:Hostname,%DATE:Date,%HOUR:dt_h:%MINUTE:dt_m,%NUMBER:duration-%WORD:hm,%USER:User,%USER:User_1 %NUMBER:Pid %NUMBER:float %NUMBER:float %NUMBER:Num_1 %NUMBER:Num_2 %DATA (?:%HOUR:dt_h1:|)(?:%MINUTE:dt_m1|) (?:%HOUR:dt_h2:|)(?:%MINUTE:dt_m2|)%GREEDYDATA:CMD,%GREEDYDATA:PWD_PATH" 
      add_field => [ "received_at", "%@timestamp" ]
      remove_field => [ "@version", "host", "message", "_type", "_index", "_score" ]
   
  
 
output 
        if [type] == "rmlog" 
        elasticsearch 
                hosts => ["myhost.xyz.com:9200"]
                manage_template => false
                index => "pt-rmlog-%+YYYY.MM.dd"
  
 

任何帮助建议将不胜感激。

编辑:

根据我的观察失败的消息..

ttmv540,19/05/21,03:59,00-hrs,USER,USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND,/local/ntr/ttmv540.373
ttmv541,19/05/21,03:43,-mins,USER,USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND,/local/ntr/ttmv541.373

但是,我尝试使用以下条件编辑 grok,但它仍然删除了少数字段..

input 
  file 
    path => [ "/data/rm_logs/*.txt" ]
    start_position => beginning
    max_open_files => 64000
    sincedb_path => "/data/registry-1"
    type => "rmlog"
  

filter 
  if [type] == "rmlog" 
    grok 
     match =>  "message" => "%HOSTNAME:hostname,%DATE:date,%HOUR:time_h:%MINUTE:time_m,%NUMBER:duration-%WORD:hm,%USER:user,%USER:group %NUMBER:pid %NUMBER:float %NUMBER:float %NUMBER:num_1 %NUMBER:num_2 %DATA (?:%HOUR:time_h1:|)(?:%MINUTE:time_m1|) (?:%HOUR:time_h2:|)(?:%MINUTE:time_m2|)%GREEDYDATA:cmd,%GREEDYDATA:pwd" 
      add_field => [ "received_at", "%@timestamp" ]
      remove_field => [ "@version", "host", "message", "_type", "_index", "_score" ]
   
  
  if "_grokparsefailure" in [tags] 
    grok 
      match =>  "message" => "%HOSTNAME:hostname,%DATE:date,%HOUR:time_h:%MINUTE:time_m,-%WORD:duration,%USER:user,%USER:group%GREEDYDATA:cmd" 
      add_field => [ "received_at", "%@timestamp" ]
      remove_field => [ "@version", "host", "message", "_type", "_index", "_score" ]
  
 

output 
        if [type] == "rmlog" 
        elasticsearch 
                hosts => ["myhost.xyz.com:9200"]
                manage_template => false
                index => "pt-rmlog-%+YYYY.MM.dd"
  
 

注意:看起来_grokparsefailure 标记适用于以下消息,但在其他消息上仍然失败..

1) 这行得通..

 ttmv541,19/05/21,03:43,-mins,USER,USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND,/local/ntr/ttmv541.373

ttmv540,19/05/21,03:59,00-hrs,USER,USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND,/local/ntr/ttmv540.373

2) 第二行文本日志失败,因为它有 00-hrs 与之关联的数字,现在无法满足以下两个条件 grok ..

%HOSTNAME:hostname,%DATE:date,%HOUR:time_h:%MINUTE:time_m,-%WORD:duration,%USER:user,%USER:group%GREEDYDATA:cmd

【问题讨论】:

Logstash grok 过滤器是否总是在每个条目上失败?或者它对某些人有效而对其他人无效?如果它仅适用于某些条目,您能否提供更多示例?尝试修改脚本,以免删除“消息”字段,并在 grok 无法解析的条目上查看它的外观。 它在某些情况下大部分都失败了,我遇到了一些失败的情况,让我更新一下。 @mihomir,我只是用我应用的新东西更新帖子 【参考方案1】:

我将处理分成两部分,一部分处理主机名和时间戳问题,另一部分处理行的其余部分。我发现这使维护更容易。

所以你只剩下这两个输入:

ttmv541,19/05/21,03:43,-mins
ttmv540,19/05/21,03:59,00-hrs

你的两个模式将很好地匹配前几部分,所以问题是你想如何在时间之后解析出这些东西。在您的原始模式中,您使用 duration 作为数字部分,使用 hm 作为单位。在您的第二种模式中,您似乎将单位放入duration,这可能是不正确的。

如果没有更多信息,持续时间似乎是可选的,但您将始终拥有单位。这可以反映在您的模式中,例如:

(%NUMBER:duration)?-%WORD:hm

还要注意,如果您最终需要多个模式,则不必依赖 grokparsefailure 来使用它们 - match->message 可以采用数组。示例见the doc。

【讨论】:

@Alan,非常感谢这个很棒的建议 +1,我正在测试这个 艾伦,如果你不介意,你能解释一下Also note that if you ever end up needing multiple patterns, you don't have to depend on the grokparsefailure to use them - match->message can take an array. 我添加了文档的链接。你可以给匹配多个模式来使用。

以上是关于过滤数据时出现logstash grok问题的主要内容,如果未能解决你的问题,请参考以下文章

Logstash收集nginx日志之使用grok过滤插件解析日志

Logstash 应该只记录 grok 解析的消息

logstash grok 模式来监控 logstash 本身

未找到 logstash grok 过滤器模式

logstash使用filter删除不需要的日志

Logstash,grok 过滤器不适用于固定长度字段