課題
Logstashでログファイル(sendmailのmaillog)をElasticsearchに放り込んだところ、
タイムスタンプのフィールドをdate型で認識してくれない。
解決
いろいろ調べた結果、明示的に「タイムスタンプフィールドをstring
型からdate
型に変換する」処置が必要らしい。
今回利用した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フィルタについて抜粋。
... 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の場合、target
にtimestamp
を指定することで、timestamp
(string型)をtimestamp
(date型)で上書きしている。1
以上。
参考
-
target => "logtimestamp"
等とした場合、string型のtimestamp
フィールドは保持され、新たにdate型のlogtimestamp
フィールドが生成される。 ↩