web-dev-qa-db-ja.com

Logstash:ファイル名をフィールドとして追加する方法は?

Logstash + Elasticsearch + Kibanaを使用して、Tomcatログファイルの概要を把握しています。

各ログエントリについて、それが由来するファイルの名前を知る必要があります。フィールドとして追加したいと思います。それを行う方法はありますか?私は少しグーグルで検索しました this SO question ですが、答えは最新ではありません。

これまでのところ、唯一の解決策は、次のように異なる「add_field」を使用して、可能性のあるファイル名ごとに個別の構成を指定することです。

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

ただし、新しいファイル名が見つかるたびにlogstashを再構成する必要があります。より良いアイデアはありますか?

22
machinery

こんにちは、これを行うためにgrokフィルターを追加しました。パスではなくファイル名だけが必要でしたが、必要に応じて変更できます。

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

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"
    }
3
Vladik Y