Fluentdでsyslogを受けるとき、facilityとpriorityをちゃんと分ける方法
多分、実はもっと簡単にできるよって方法があるんじゃないかと思って、しかもみんなわかってるから敢えてBlogに書いたりしないんじゃないかと思っているんですが…恥さらしに書いとこう。
fluentdのin_syslogは2015年8月31日現在、tagとして「指定したキー」.「facility」.「priority」を追加していて、データとして分離したものは持っていない。でも、これは何となく迂遠だ。データとして意味が異なる物なんだからきちんと分けようという気分になる。
多分、これを解決する方法は3つくらい思いつくのだが、私はsyslog受け口のプラグインの方を書き換える方向にした。 他はプラグインの使い方を考える方向性で汎用性が低いかもしれないが、プラグイン書き換えの方が勉強になるのかなっと後から言い訳。
1.ソースを持ってくる
下記の公式fluentdのリポジトリからin_syslog.rbのソースを持ってきます
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