2014-11-14 68 views
0

我正在使用ELK堆棧配置。 logstash-轉發用作日誌託運人,記錄每種類型的標記有一個類型標籤:logstash,syslog和grok

{ 
    "network": { 
    "servers": [ "___:___" ], 
    "ssl ca": "___", 
    "timeout": 15 
    }, 
    "files": [ 
    { 
     "paths": [ 
     "/var/log/secure" 
     ], 
     "fields": { 
     "type": "syslog" 
     } 
    } 
    ] 
} 

這部分工作得很好......現在,我想logstash的消息字符串分割其部分;幸運的是,在默認模式神交已實現,所以logstash.conf仍然很簡單迄今:

input { 
    lumberjack { 
     port => 6782 
     ssl_certificate => "___" ssl_key => "___" 
    } 
} 
filter { 
    if [type] == "syslog" { 
     grok { 
      match => [ "message", "%{SYSLOGLINE}" ] 
     } 
    } 
} 
output { 
    elasticsearch { 
     cluster => "___" 
     template => "___" 
     template_overwrite => true 
     node_name => "logstash-___" 
     bind_host => "___" 
    } 
} 

我這裏的問題是,由elasticsearch接收的文件上仍佔據整條生產線(包括時間戳等)在消息字段中。另外,@timestamp仍然顯示logstash收到消息的日期,這使得搜索不好,因爲kibana確實在查詢@timestamp以便按日期過濾......任何想法我做錯了什麼?

謝謝,丹尼爾

回答

3

您的「消息」字段包含原始日誌行(包括時間戳等)的原因在於缺省情況下grok過濾器不允許覆蓋現有字段。換句話說,即使SYSLOGLINE pattern

SYSLOGLINE %{SYSLOGBASE2} %{GREEDYDATA:message} 

捕獲消息爲「Message」字段不會覆蓋當前的字段值。解決方法是設置grok filter's "overwrite" parameter

grok { 
    match => [ "message", "%{SYSLOGLINE}" ] 
    overwrite => [ "message" ] 
} 

要填充「@timestamp」字段,請使用date filter。這可能適合你:

date { 
    match => [ "timestamp", "MMM dd HH:mm:ss", "MMM d HH:mm:ss" ] 
} 
+0

太棒了!我通過1)從'message'移動到'logline',2)grok'logline',3)刪除'logline'來解決消息部分。 RTFM,我想...謝謝 – sontags 2014-11-18 06:20:12

0

這是很難知道的是這個問題沒有看到,是造成你的問題的例子事件。我建議您嘗試grok debugger以驗證模式是否正確,並在發現問題後根據需要進行調整。

+1

沒有多少grok模式調整將解決他的@ timestamp字段問題。 – 2014-11-17 07:13:51