LoginSignup
3
6

More than 5 years have passed since last update.

[Logstash]inputしたログファイルのタイムスタンプをstring型からdate型に変換

Last updated at Posted at 2017-09-20

課題

Logstashでログファイル(sendmailのmaillog)をElasticsearchに放り込んだところ、
タイムスタンプのフィールドをdate型で認識してくれない。

解決

いろいろ調べた結果、明示的に「タイムスタンプフィールドをstring型からdate型に変換する」処置が必要らしい。

今回利用したlogstash.confは以下。

logstash.conf
input {
    file {
        path => "/data/log/maillog*"
        start_position => "beginning"
        type => "sendmail"
    }
}

filter {
  grok {
    patterns_dir => ["/usr/share/logstash/pipeline/patterns"]
    match => { "message" => "%{SYSLOGBASE} %{SENDMAIL}" }
    overwrite => [ "message" ]
  }
  date {
    match => ["timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss"]
    target => "timestamp"
  }
}


output {
    if [type] == "sendmail" {
        elasticsearch {
            index => "logstash_sendmail-%{+YYYY.MM.dd}"
            hosts => "elasticsearch:9200"
        }
    } else {
        elasticsearch {
            hosts => "elasticsearch:9200"
        }
    }
}

以下、dateフィルタについて抜粋。

logstash.conf
... snip ...
  date {
    match => ["timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss"]
    target => "timestamp"
  }
... snip ...

match

match => [ "フィールド名", "タイムスタンプ形式1", "タイムスタンプ形式2", ... ]
フィールド内のデータがタイムスタンプ形式にマッチした場合、マッチしたデータをdate型として認識する。
上のconfの場合、string型のtimestampフィールドを、date型として認識させている。

target

target => "フィールド名"
上のmatchで認識したdate型のデータを、targetで指定するフィールドに放り込む。
上のconfの場合、targettimestampを指定することで、timestamp(string型)をtimestamp(date型)で上書きしている。1

以上。

参考


  1. target => "logtimestamp"等とした場合、string型のtimestampフィールドは保持され、新たにdate型のlogtimestampフィールドが生成される。 

3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6