2014-04-07 78 views
20

我正在使用Logstash + Elasticsearch + Kibana來概覽我的Tomcat日誌文件。Logstash:如何將文件名稱添加爲字段?

對於每個日誌條目,我需要知道它來自哪個文件的名稱。我想將其添加爲字段。有沒有辦法做到這一點? 我google了一下,我只找到this SO question,但答案不再是最新的。

到目前爲止,我看到的唯一的解決方法是指定不同的「add_field」每個可能的文件名單獨的配置,像這樣:

input { 
    file { 
    type => "catalinalog" 
    path => [ "/path/to/my/files/catalina**" ] 
    add_field => { "server" => "prod1" } 
    } 
} 

但後來我需要logstash每次重新配置有新的可能文件名。 有什麼更好的想法?

回答

35

嗨我添加了一個grok過濾器來做到這一點。我只想讓文件名不在路徑中,但可以根據需要更改它。

filter { 
    grok { 
    match => ["path","%{GREEDYDATA}/%{GREEDYDATA:filename}\.log"] 
    } 
} 
+0

感謝您的回答:)是不是會查找文件名INSIDE內的日誌文件內容? – machinery

+2

通常情況下,您不會在郵件字段中使用grok,但我使用path字段,這是一個由logstash自動添加的特殊字段。 –

+0

非常感謝:)您的解決方案的工作原理 - 在「{GREEDYDATA:filename}」之前添加百分比符號後。請更新您的答案,我會接受它作爲解決方案。 我只是沒有意識到「路徑」字段的存在。 – machinery

1

如果你想在消息和文件名中的一個事件相結合:

filter { 
grok { 
    match => { 
     message => "ERROR (?<function>[\S]*)" 
     } 
} 
grok { 
    match => { 
     path => "%{GREEDYDATA}/%{GREEDYDATA:filename}\.log" 
     } 
}} 

結果在ElasticSearch(側重於「名」和「功能」字段):

"_index": "logstash-2016.08.03", 
    "_type": "logs", 
    "_id": "AVZRyEI49-A6kyBCq6Yt", 
    "_score": 1, 
    "_source": { 
     "message": "27/07/16 12:16:18,321 ERROR blaaaaaaaaa.internal.com", 
     "@version": "1", 
     "@timestamp": "2016-08-03T19:01:33.083Z", 
     "path": "/home/admin/mylog.log", 
     "host": "my-virtual-machine", 
     "function": "blaaaaaaaaa.internal.com", 
     "filename": "mylog" 
    } 
相關問題