Logstash:如何链接到先前日志消息的时间戳

时间:2015-10-07 11:39:41

标签: filter logstash multiline elastic-stack grok

我正在尝试为这样的事情创建一个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} 
}

2 个答案:

答案 0 :(得分:1)

您可以使用多行插件

input {
        stdin {
        }
}

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

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

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

合并多行日志后,您可以使用grok过滤所需的字段。

答案 1 :(得分:0)

您需要的不是合并,而是memorize filter plugin for logstash。它让您记住上一条日志消息的日期和时间,以便稍后将其添加为字段。已经a SO thread显示其基本用途。

memorize 插件不再显示在list of current filter plugins中,而是it should be still usable in logstash 2