Logstash:如何将文件名称添加为字段?

问题描述:

我正在使用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每次重新配置有新的可能文件名。 有什么更好的想法?

嗨我添加了一个grok过滤器来做到这一点。我只想让文件名不在路径中,但可以根据需要更改它。

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

感谢您的回答:)是不是会查找文件名INSIDE内的日志文件内容? – machinery

+2

通常情况下,您不会在邮件字段中使用grok,但我使用path字段,这是一个由logstash自动添加的特殊字段。 –

+0

非常感谢:)您的解决方案的工作原理 - 在“{GREEDYDATA:filename}”之前添加百分比符号后。请更新您的答案,我会接受它作为解决方案。 我只是没有意识到“路径”字段的存在。 – machinery

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

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" 
    }