簡體   English   中英

Logstash:從可選行讀取多行數據

[英]Logstash: Reading multiline data from optional lines

我有一個日志文件,其中包含以時間戳開頭的行。 每條帶時間戳的行之后可能會出現數量不確定的額外行:

SOMETIMESTAMP some data
extra line 1 2
extra line 3 4

額外的行將為帶時間戳的行提供補充信息。 我想提取1、2、3和4並將其另存為變量。 如果我知道其中有多少行,我可以將多余的行解析為變量。 例如,如果我知道有兩條額外的線,則下面的grok過濾器將起作用。 但是,如果我事先不知道會存在多少行,該怎么辦? 在應用多行過濾器之前,是否有某種方法可以逐行解析這些行? 這可能會有所幫助。

另外,即使我知道我只會有2條額外的行,但過濾器是否是訪問它們的最佳方法?

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

    if "multiline" in [tags] {
        grok {
            match => { "message" => "(?m)^%{SOMETIMESTAMP} %{DATA:firstline}(?<newline>[\r\n]+)%{DATA:secondline}(?<newline>[\r\n]+)%{DATA:thirdline}$" }
        }
    }
    # After this would be grok filters to process the contents of
    # 'firstline', 'secondline', and 'thirdline'. I would then remove
    # these three temporary fields from the final output.
}

(我將這些行划分為單獨的變量,因為這使我可以分別對行的內容進行其他模式匹配,而不必再次遍歷整個模式。例如,基於第一行的內容,我可能想展示其他行的分支行為。)

你為什么需要這個?

您是要插入一個具有所有值的單個事件,還是它們真的是單獨的事件,只需要共享同一時間戳?

如果它們都需要出現在同一事件中,則您需要使用ruby過濾器將事件中的多余行分隔為多個字段,然后可以進一步進行處理。

例如:

if "multiline" in [tags] {
    grok {
        match => { "message" => "(?m)^%{SOMETIMESTAMP} %{DATA:firstline}(?<newline>[\r\n]+)" }
    }
    ruby {
       code => '
         event["lines"] = event["message"].scan(/[^\r\n]+[\r\n]*/);
       '
    }
}

如果它們確實是單獨的事件,則可以使用logstash 1.5及更高版本的memorize插件。

相對於ELK Direct事件字段引用(即event ['field'])的版本,此更改已被禁用,有利於使用事件get和set方法(例如event.get('field'))。

filter {
    grok {
        match => { "message" => "%{TIMESTAMP_ISO8601:logtime} %{LOGLEVEL:level}%{DATA:firstline}" }
    }
    ruby { code => "event.set('message', event.get('message').scan(/[^\r\n]+[\r\n]*/))" }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM