Graylogで作成されるElasticsearchのIndexのエラーを解消する

ペパボでは大和田と呼ばれる、全社共通のインフラを大和田家の次男である僕が構築運用している。

大和田の一角を担うのが、Kafka ClusterとGraylogからなるログ検索基盤であり、ペパボで構築されたk8s ClusterやFlutend経由で転送されたログはGraylogで検索できるようになっている。

Graylogは取り込んだログに合わせて自動でESの動的テンプレートを作成してくれるのだが、Indexを複数の種類のログで利用する場合、下記のようなログが出ることがある。

{"type":"mapper_parsing_exception","reason":"failed to parse field [time] of type [long]","caused_by":{"type":"illegal_argument_exception","reason":"For input string: \"2019-12-01T21:36:01Z\""}}

これは time というカラムに 1575375367 のようなunix timeが入るケースと、 2019-12-01T21:36:01Z のような文字列が混在する場合に、カラムの型が合わないので取り込みに失敗している場合に出現する。

対応方法としてはESのテンプレートを変えるか、Graylogのpipelineを利用してログの内容をゴニョゴニョする方法がある。

ペパボの場合は、timeカラムを運用として利用していないので今回は下記のようなpipelineを追加して、timeカラムを削除した。

rule "delete time"
when
   has_field("time")
then
   remove_field("time");
end

またこれ以外にregex_replaceを利用して値を置換したり、date formatを変換することもできるので、そこは用途に応じて手段を選択したらいいと思う。

注意すべき点としては、jsonなどのログをパースした後、つまりExtractorを経由した後にpipelineを適用したい場合は、System/Configureで適用順をMessage Filter Chainの後にPipeline Processorの後に適用する必要がある。

ただこの場合でもSimuratorでは適用結果が出力としては変更されないのでちょっと分かりづらいので注意が必要。

Graylog、ESにログを取り込むインターフェースとしても、検索基盤としてもめちゃ便利なんでおすすめ。