ようへいの日々精進XP

よかろうもん

postfix のログを fluentd を使って redis に突っ込んでみる(1)

きっかけ

  • 「メールが届いてないんだけど?」という問い合わせに膨大なログから手早く該当のログを見つけ出すカッコイイ方法はないかなと思いたったが吉日

環境


準備

postfix の準備

Debian の標準 MTA は Exim4 なので postfix と入れ替える

apt-get install postfix

冒頭で Exim4 をアンインストールするか否かを問われるので恐縮しつつアンインストール。

fluentd の準備

ruby 1.9.3p392 (2013-02-22) [x86_64-linux] な環境に gem でインストールしてみる。

sudo gem install fluentd --no-ri --no-rdoc -V

実行後、暫くすると...

Successfully installed fluentd-0.10.35

と出力され、無事にインストールが出来たようなので、こちらの通りにインストールを確認してみる。

fluentd --setup ./fluent
fluentd -c ./fluent/fluent.conf -vv &
echo '{"json":"message"}' | fluent-cat debug.test

上記を実行すると以下のように出力された。

% echo '{"json":"message"}' | fluent-cat debug.test
2013-07-11 05:24:59 +0900 [trace]: plugin/in_forward.rb:147:initialize: accepted fluent socket object_id=18704480
2013-07-11 05:24:59 +0900 debug.test: {"json":"message"}
2013-07-11 05:24:59 +0900 [trace]: plugin/in_forward.rb:188:on_close: closed fluent socket object_id=18704480

とにかく速いって思った。

redis の準備

泣く子も黙る redis は以下のようにビルドしてインストール。

wget http://redis.googlecode.com/files/redis-2.6.14.tar.gz
tar zxvf redis-2.6.14.tar.gz
cd redis-2.6.14
ls
make
sudo make install

こんなに毎回素直にビルドが通るプロダクトは個人的には初めて。好きです redis

一応、デーモンモードで起動したいので redis.confdaemonize nodaemonize yes として redis-server を起動する。尚、redis.conf は展開したソースコード内にあるので適宜コピーして利用する。

sudo /usr/local/bin/redis-server /usr/local/etc/redis.conf

以下のように起動を確認する。

/usr/local/bin/redis-cli ping

起動していれば PONG と返ってくる。標準では 6379 ポートで Listen する。

fluentd の redis プラグインの準備

fluentdredis を連携させる為の fluent-plugin-redis をインストールする。これも gem でインストール。

sudo gem install fluent-plugin-redis --no-ri --no-rdoc -V

暫くすると以下のようにインストールが完了する。

Successfully installed redis-2.2.2
Successfully installed fluent-plugin-redis-0.2.0

やってみる

fluent.conf の設定

fluent.conf を以下のように記載する。

<source>
  type tail
  format /^(?<date>[^ ]+) (?<host>[^ ]+) (?<process>[^:]+): (?<message>((?<key>[^ :]+)[ :])? ?((to|from)=<(?<address>[^>]+)>)?.*)$/
  path /var/log/mail.log
  tag redis.maillog
  pos_file /tmp/fluent.pos
</source>

<match redis.**>
  type redis

  host 127.0.0.1
  port 6379

  # database number is optional.
  db_number 0        # 0 is default
</match>

format正規表現こちらをそのまま利用させて頂きました。

mail.log のフォーマットを修正

デフォルトは mail.log のフォーマットは下記のようなフォーマットとなり、上記の正規表現では fluentd 側でログをパース出来ない...

Jul 11 05:11:05 debian postfix/master[3179]: daemon started -- version 2.7.1, configuration /etc/postfix

原因は日付の部分が Jul 11 05:11:05 となっている為で、ヘタレな自分はとりあえずログのフォーマットを変更した。

/etc/rsyslog.conf を以下のように修正し、/etc/init.d/rsyslog restart した。

#$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$ActionFileDefaultTemplate RSYSLOG_FileFormat

修正後は以下のようになった。

2013-07-11T06:31:31.032225+09:00 debian postfix/qmgr[7636]: 06D5723728: from=<>, size=2036, nrcpt=1 (queue active)

起動

以下のように fluentd を起動する。

sudo fluentd -c fluent.conf -vv

sudo を付けないと /var/log/mail.log を権限の関係で参照出来ないので起動しない。


確認

テストメール

mail コマンドでメールを送ってみる

mail hoge@hoge.com
Subject: test
test
.
Cc: 

確認

redis-cli を利用して redis-server にアクセスしてテストメールの内容がログに記録されているかを確認する。

/usr/local/bin/redis-cli

redis-server にアクセスしてキーの一覧を取得する。

redis 127.0.0.1:6379> keys *
 1) "redis.maillog.1373493704.9"
 2) "redis.maillog.1373493704.4"
 3) "redis.maillog.1373493704.2"
 4) "redis.maillog.1373493704.1"
 5) "redis.maillog.1373493704.7"
 6) "redis.maillog.1373493704.0"
 7) "redis.maillog.1373493704.3"
 8) "redis.maillog.1373493704.8"
 9) "redis.maillog.1373493704.5"
10) "redis.maillog.1373493704.6"

おお、ログが記録されてるじゃあーりませんか。

redis 127.0.0.1:6379> HGETALL redis.maillog.1373493704.2
 1) "host"
 2) "debian"
 3) "date"
 4) "2013-07-11T07:01:44.672404+09:00"
 5) "process"
 6) "postfix/qmgr[7636]"
 7) "message"
 8) "A20D023759: from=<kappa@debian.inokara.com>, size=303, nrcpt=1 (queue active)"
 9) "address"
10) "kappa@debian.inokara.com"
11) "key"
12) "A20D023759"

ハッシュの中身も上記のように記録されている。ということで、思い立ったが吉日でサクッとログの記録まで試せたのは良かった。そして、今日も先人たちの努力に感謝。


課題

  • 業務現場に投入する場合にはログのフォーマットを確認する必要があり、ログフォーマットを変更するのかパースする正規表現を頑張るかしないといけない
  • 記録するログを精査した上で redis-server に放り込むようにしたい

参考