0

我正在尝试为这样的东西创建一个 grok 模式

********************************************************
18.03.13, 10:14:25: Starting new session 
********************************************************

 12:43:38   Warning: X-Ray blocked because signal  XRAY_ENABLE_FPD is high.
 13:31:08   Error 770.999 (DigitizerPt1000Pixium): 
OffsetCalibration: mode not active
 13:31:21   Error 770.999 (DigitizerPt1000Pixium): 
Cannot stop grabbing

然而

13:31:08    Error 770.999 (DigitizerPt1000Pixium): 
OffsetCalibration: mode not active

这是一个日志条目而不是两个(grok 将其视为两个不同的条目) grok 或任何其他过滤器中是否有任何模式我可以使用???

我还想将第一行中给出的日期与警告和错误日志条目相关联

注意:我为它创建了 grok 模式,只有以下问题未解决。

我尝试使用以下代码(对于此处给出的整个日志文件)。但我无法将第一行的日期与错误和警告条目联系起来

input {
    file {
        path => "E:\Softwares\logstash-1.5.4\bin\Error_log_29092015.txt"
        start_position => beginning
        sincedb_path => "E:/sincedb"
    }
}
filter {
    multiline {
       pattern => "^%{NOTSPACE}"
       what => previous

    }
        if "Starting" in [message]{
            grok {
                match => [ "message", "%{DATE_EU:Start_date}, %{TIME:Start_time}: %{WORD:session_status}"]          
                }
            }
        else if "Terminating" in [message] {
            grok{
              match => [ "message", "%{DATE_EU:Terminate_date}, %{TIME:Terminate_time}: %{WORD:session_status}"]
            }
        }

        else if "Warning" in [message] {
                                grok {
                                     match => [ "message", "%{TIME:Warning_time} \t%{WORD:Indicator}: %{GREEDYDATA:Warning_Message}\r"]     
                                    }

                            }
        else if "Error" in [message] { 
                        if "Generator" in [message]{
                            grok{
                            match => ["message","%{TIME:Error_time} \t%{WORD:Indicator} G %{NOTSPACE:Error_Num} %{NOTSPACE:Error_Type}: \r\n%{GREEDYDATA:Error_Message}\r"]
                            }
                        }
                        else{
                                grok {
                                     match => [ "message", "%{TIME:Error_time} \t%{WORD:Indicator} %{NOTSPACE:Error_Num} %{NOTSPACE:Error_Type}: \r\n%{GREEDYDATA:Error_Message}\r"]
                                    }
                                }
                            }   
        else if "Invalid" in [message]{
            grok {
                 match => [ "message", "%{TIME:InvalidCode_time} \t%{WORD:Type} Code. %{GREEDYDATA:InvalidCode_Message}"]
                }
            }   


        else if "Sedecal" in [message]{
            grok {
                 match => [ "message", "%{TIME:Sedecal_time} \t%{GREEDYDATA:Type}: %{GREEDYDATA:InvalidCode_Message}"]
                }
            }   
        else if "UIMS" in [message]{
            grok {
                 match => [ "message", "%{TIME:UIMSInternalState_time} \t%{GREEDYDATA:Type}: %{GREEDYDATA:UIMSInternalState_Message}"]
                }
            }       

        else {
            drop{}
        }                   

}

output {
    stdout{ codec => rubydebug}
    elasticsearch{
    cluster => "My_ProjectC"
        host => localhost
        codec => rubydebug} 
}
4

2 回答 2

1

您可以使用多行插件

input {
        stdin {
        }
}

filter{
        multiline{
                pattern => "^%{TIME}"
                negate => "true"
                what => "previous"
        }
}

output {
  stdout{codec => "rubydebug"}
}

所有不以 TIME 开头的日志将被合并到上一个日志行。

合并多行日志后,可以使用 grok 过滤你想要的字段。

于 2015-10-08T01:26:42.607 回答
0

您需要的不是合并,而是logstash的记忆过滤器插件。它可以让您记住以前日志消息中的日期和时间,以便您以后可以将其添加为字段。已经有一个 SO 线程显示其基本用途。

memorize插件不再出现在当前过滤器插件列表中,它应该仍然可以在 logstash 2 中使用

于 2016-09-22T11:43:15.793 回答