LogstashでFilebeatの送信ファイル名を取得する

Logstash.conf で Filebeat から送信されたファイル名を grok で取得したいのですが、
下記で出来ませんでした。(バージョン7.5.2)

6.3.1 では出来ていて、ドキュメントを読んでも同様の動作が
可能な方法が見つからない状況です。

Filebeatの送信ファイルパスは、/var/log/2.log です。
どなたかご教示いただければと思います。

input {
  beats {
    port => 5044
  }
}

filter {
  grok {
    match => { "source" => "/var/log/%{INT:filename}.log" }
  }
}

output {
  file {
    path => "/usr/local/var/logstash/%{filename}.tsv"
    codec => line { format => "%{message}" }
  }
}

こんにちわ

filebeat6.3.1と、7.5.2ではlogstashに送られる中身の構造が変わっているかと思います。
これは、7系からElastic Common Schemaに準拠するようになったからかと思っています。

例えば、7.5.2ではこんなデータになってLogstashに送られていますね。

{
    "@version" => "1",
    "@timestamp" => 2020-02-06T10: 14: 11.310Z,
    "agent" => {
        "hostname" => "a00271752ce1",
        "version" => "7.5.2",
        "id" => "b26e6309-0577-408e-9284-b059421fcf0c",
        "type" => "filebeat",
        "ephemeral_id" => "c4eb8204-77e1-4d87-a252-c5ad5f978afb"
    },
    "log" => {
        "offset" => 0,
        "file" => {
            "path" => "/var/log/2.log"
        }
    },
    "ecs" => {
        "version" => "1.1.0"
    },
    "message" => "aaaa",
    "host" => {
        "hostname" => "a00271752ce1",
        "containerized" => true,
        "os" => {
            "version" => "7 (Core)",
            "kernel" => "4.19.76-linuxkit",
            "family" => "redhat",
            "name" => "CentOS Linux",
            "platform" => "centos",
            "codename" => "Core"
        },
        "name" => "a00271752ce1",
        "architecture" => "x86_64"
    },
    "input" => {
        "type" => "log"
    }
}

このため、従来 sourceに入っていたところのファイルのパスが log.file.pathになっています。
ここがLogstash側でエラーになっている原因かと推察します。

ですので、grokの部分をlog.file.pathにあわせて変更してやれば良いとなります。
こんな感じです。

input {
  beats {
    port => 5044
  }
}

filter {
  grok {
    # データ取得元を変更
    match => { "[log][file][path]" => "/var/log/%{INT:filename}.log" }
  }
}

output {
  stdout {
  }
}

まず、一度stdoutでgrokのエラーが出ないことを確認してから、ファイル出力でお試しいただくのが良いかと思います。

ご参考になれば幸いです。

ご丁寧なご説明と、貴重な情報をありがとうございます。
無事に解決できました。

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.