2017-01-09 82 views
0

我想了解logstash的grok插件中的DATA模式。 按照文檔DATA比賽如下:logstash中的數據模式 - grok

DATA .*? - >我的解讀是,長度爲1什麼N [請 糾正我,如果我的理解是錯誤的。

在我的腳本中,它無法正確解析我的輸入。
Logstash CONF:

input{ 
file { 
     path => ["/home/osboxes/logstash_conf/mydir/test_logs/*"] 
     start_position => beginning 
     sincedb_path => "/home/osboxes/logstash_conf/mydir/.sincedb" 
    } 
} 
filter{ 
     grok { 
       match => { "message" => "^%{TIMESTAMP_ISO8601:timeStamp},%{DATA:ID},%{DATA:somedata}" } 
     } 
} 
output { 
    stdout { 
     codec => json_lines 
    } 
} 

輸入:

2017-01-09 02:00:03.887,a,a 

輸出:

{ 
    "message": "2017-01-09 02:00:03.887,a,a", 
    "@version": "1", 
    "@timestamp": "2017-01-09T12:28:20.958Z", 
    "path": "/home/osboxes/logstash_conf/mydir/test_logs/data", 
    "host": "osboxes", 
    "timeStamp": "2017-01-09 02:00:03.887", 
    "ID": "a" 
} 

我期望的標籤somedata將充滿值,因爲它對於標籤ID],但它從輸出中被省略。任何人都請幫我理解DATA模式的行爲。

回答

1

.*?零次和無限次匹配,儘可能少的次數,根據需要進行擴展。事實上,它可以匹配次是你沒有看到結果的原因。

寫出來的,有問題的部分看起來像這樣:

,(.*?),(.*?)(捕捉組增加了可讀性)

這符合:,a,

1.Take第一,和與之相匹配。

2.Try至(逐字符,直到圖案是有效的)用盡可能少地匹配.*?此相匹配的a

3.Try以匹配下一個,。這會導致第一個.*?完成。

4.試着匹配.*?。因爲這可以匹配次它將這樣做並且匹配完成。


簡單的解決問題的方法是在你的模式的末尾添加$$是字符串錨點的結尾,因此您的第二個.*?被迫與其他a匹配。

+0

謝謝你的回答。在這種情況下,有可靠的'DATA'模式還是需要尋找其他模式?正如你所提到的,它可能匹配零個字符,在某些情況下,它可能會跳過我確實感興趣的值... –

+0

@ G.S如果用'$'終止你的模式,那麼你應該好好走。這將確保你的第二個'DATA' __has__匹配一些東西。 – Fairy

+0

瞭解。我只是擔心,如果類似的行爲發生在中間的「數據」。 '$'只能用於最後一個字段。不知道'DATA'是否可能在中間字段失敗。只是爲了確保它是可靠的 –