Dateでmatchするフォーマットについて


#1

logstashでログを取り込もうとしていて、以下のような日付フォーマットのものが date{match=>}できずに困っています。

Mon Dec 17 12:23:34 JST 2018

これを "datetime"=>"Mon Dec 17 12:23:34 JST 2018" のように取り込んだのですが、 date{match}でマッチングさせる方法がわからないです。

  • "JST"表記は ZやZZZ に該当しないので、date{ match => ["datetime" , "EEE MMM d ZZZ h:m:s yyyy"] }はできない
  • JSTの文字さえ抜ければ、date{ match => ["datetime" , "EEE MMM d h:m:s yyyy"] }でいけそう

別のフィールドに「STを抜いた文字列」として格納して、それをmatchさせたほうが良いのでしょうか。


(tsgkdt) #2

こんにちわ

こんな形でできるかと思います。
(頂いたmatchの中身とは少し変えてます h -> HHとか)

match => [ "logdate", "EEE MMM dd HH:mm:ss 'JST' yyyy"]

文字列の中には、JSTしか入らないという決め打ちの前提が許されるのであればですが・・・

Logstashのマニュアルからリンクされている https://www.joda.org/joda-time/key_format.html で、

' escape for text delimiter

と書いてある部分を参考にして、 'JST'と文字列を入れることにしています。

今回試したlogstashの設定ファイルです。
logdateで示された形式の文字列をいれ、logdate_2に変換して入れています。

input {
  stdin {
      # テスト用の文字列
      add_field => { "logdate" => "Mon Dec 17 12:23:34 JST 2018" }
  }
}

filter {
    date {
        # 文字列 -> date
        match => [ "logdate", "EEE MMM dd HH:mm:ss 'JST' yyyy"]
        target => "logdate_2"
    }
}

output {
    stdout { codec => rubydebug }
}

stdoutのデバッグで、logdate_2の方は、 ” ” で囲まれていない(=文字列になっていない) ことが分かります。
文字列ではなく日付の型になっていることが確認できました。


#3

ありがとうございます!

'で除外できるのですね。テストまでして頂き、ありがとうございます。
あと、hh -> HH等、一部ミスしていたものも指摘頂き、すみません。


(system) closed #4

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