【问题标题】:Logstash: how to add file name as a field?Logstash:如何将文件名添加为字段?
【发布时间】:2016-08-08 22:50:10
【问题描述】:

我正在使用 Logstash + Elasticsearch + Kibana 来概览我的 Tomcat 日志文件。

对于每个日志条目,我需要知道它来自的文件的名称。我想将其添加为字段。有没有办法做到这一点? 我google了一下,只找到this SO question,但答案不再是最新的。

到目前为止,我看到的唯一解决方案是使用不同的“add_field”为每个可能的文件名指定单独的配置,如下所示:

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

但是每次有新的可能文件名时,我都需要重新配置logstash。 有更好的想法吗?

【问题讨论】:

    标签: logstash


    【解决方案1】:

    您好,我添加了一个 grok 过滤器来执行此操作。我只想拥有文件名而不是路径,但您可以根据需要进行更改。

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

    【讨论】:

    • 感谢您的回答 :) 那不是在日志文件内容中查找文件名吗?
    • 不,通常你会在 message 字段上使用 grok,但我使用 path 字段,这是一个由 logstash 自动添加的特殊字段。
    • 非常感谢 :) 您的解决方案有效 - 在“{GREEDYDATA:filename}”之前添加百分号之后。请更新您的答案,我将接受它作为解决方案。我只是不知道“路径”字段的存在。
    • 不错,把一个字抽多了,修好了。
    • @JettroCoenradie:grok 将被添加到过滤器下,但如果我们想要在file 中输入自己呢?
    【解决方案2】:

    如果您想将消息和文件名组合在一个事件中:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多