Cuturnの適当日記

徒然なるままに適当に駄文を吐き出しております

Fluentdでsyslogを受けるとき、facilityとpriorityをちゃんと分ける方法

多分、実はもっと簡単にできるよって方法があるんじゃないかと思って、しかもみんなわかってるから敢えてBlogに書いたりしないんじゃないかと思っているんですが…恥さらしに書いとこう。

fluentdのin_syslogは2015年8月31日現在、tagとして「指定したキー」.「facility」.「priority」を追加していて、データとして分離したものは持っていない。でも、これは何となく迂遠だ。データとして意味が異なる物なんだからきちんと分けようという気分になる。

多分、これを解決する方法は3つくらい思いつくのだが、私はsyslog受け口のプラグインの方を書き換える方向にした。 他はプラグインの使い方を考える方向性で汎用性が低いかもしれないが、プラグイン書き換えの方が勉強になるのかなっと後から言い訳。

  1. in_syslogプラグインを書き換える
  2. filter系のプラグインを使ってデータ置換・フィールド追加する
  3. elasticsearchのフィルタ系プラグインでデータを加工・追加する

1.ソースを持ってくる

下記の公式fluentdのリポジトリからin_syslog.rbのソースを持ってきます

fluent/fluentd · GitHub

2.ソースを書き換える

クラス名とプラグイン名の記載は変えます。何でもいいです。

module Fluent
  class SyslogInput < Input           ←SyslogInputを別のものに
    Plugin.register_input('syslog', self)   ←'syslog'を別のものに

in_syslog.rbのemit関数のところ、facility変数とpriority変数の定義の後、record連想配列に突っ込む2行を追加するだけ。

      facility = FACILITY_MAP[pri >> 3]
      priority = PRIORITY_MAP[pri & 0b111]
+     record["facility"] = facility
+     record["priority"] = priority

要は、record連想配列の中に最終的にelasticsearchに突っ込むデータが全部入ってるので、その連想配列に新しく突っ込んであげればおっけーという認識です。

3.フォルダに配置する

/etc/td-agent/plugin にrbファイルを配置し、td-agentを再起動して完了。

こうしておくことで、Kibanaでinfoを一律停止などが操作しやすくなります。別にこうしとかなくてもできますが、やりやすくなります…。

4.Elasticsearchのインデクスへの手当

fluentdを通してelasticsearchに入れることになるのですが、syslogにおいてはmessageフィールド以外は変に文字列解析されると困るので、 host、facility、priority、ident、pidフィールドを"string"型の"not_analyzed"インデクスタイプに変更するよう、 テンプレートをelasticsearchに突っ込む。

# logstash-template.json
{
  "template": "logstash-*",
  "mappings": {
    "syslog": {
      "properties": {
        "host": {
          "type": "string",
          "index": "not_analyzed"
        },
        "facility": {
          "type": "string",
          "index": "not_analyzed"
        },
        "priority": {
          "type": "string",
          "index": "not_analyzed"
        },
        "ident": {
          "type": "string",
          "index": "not_analyzed"
        },
        "pid": {
          "type": "string",
          "index": "not_analyzed"
        }
      }
    }
  }
}

以下コマンドにてtemplateを投入する。

# curl -XPUT 'http://localhost:9200/_template/logstash-template/' -d @/etc/elasticsearch/logstash-template.json