― Web Technology and Life ―

fluentdでメールが送れなかったフラグをDBのデータにたてるメモと疑問たち

2013-12-15
fluentdを触ってみたいと思っていたらいつの間にか情報があふれかえっていていろいろ目移りして手間取ったし、すぐ忘れそうなので、やったことと疑問をメモです。sendmailでメール送信したときに失敗の結果が/var/log/mail.logに残るので、それをDBに反映させるときのとった取り急ぎの手段。

前提となるビジネス環境と1台サーバーの小規模環境

会員登録してくれたんだけどメール認証とか後回しで、とりあえずすぐ使ってほしいから仮登録なんて言うは最近むしろ流行のようですが、結局メールアドレス間違えていて有効な会員としてしてカウントしたくないのでフラグ立てておきたいなんて要望どっかでありそうな気がしますが、そういうのを愚直に扱う際にひとつのTipsです。

fluentdを使うとログを取り扱う際のいい媒介となるようだから、使うことにした。PlackがWebアプリとWebサーバーの間に立つように、fluentdがログ群と様々なログ処理の間に立ってくれるというわけですな。

今回の設定は、以下の各ミドルウェアがすべて同じサーバーにあることを前提としていますので、

  • postfix
  • mysql
  • webアプリ
  • fluentd

fluent-agent-lite](http://studio3104.hatenablog.com/entry/20120824/1345795228)はかまさない。また、メールはサーバー内のsendmailを使って送信する。

なお、さっと触るには、いくつかの記事を参考にさせて頂いたが、特に柔軟なログ収集を可能にする「fluentd」入門がシンプルで始めやすかった。

ubuntu12.04にfluentdをインストールするゆるふわchefのレシピ

ubuntu10.04だと、install用のshのpreciseがlucidにして、gemのパスを「/usr/lib/fluent/・・・」から「/usr/lib64/fluent/・・・」に変える感じで大丈夫だった。td-agentというのが安定板のfluentdの名称で、以下でrubyも一緒に入れてくれるから楽ちん。

    bash "fluentd install" do
      user "root"
      group "root"
      not_if { File.exist?("/etc/td-agent/td-agent.conf") }
      code <<-EOC
        curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-precise.sh | sh
        sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-rewrite fluent-plugin-mysql
      EOC
      action :nothing
    end

    ##起動
    service "td-agent" do
        action [ :start ]
        supports :status => true, :restart => true
    end

    template "td-agent.cnf" do
        path "/etc/td-agent/td-agent.cnf"
        source "td-agent.cnf"
        owner "root"
        group "root"
        mode 00644
        notifies :restart, 'service[td-agent]'
    end

    # 扱いログのパーミッションの変更設定
    file "/var/log/mail.log" do
      mode "0644"
      action :touch
    end

td-agent.confの設定

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

    #入力したログの処理設定その1~対象のaddressでないものは除外~
    <match maillog>
      type rewrite

      remove_prefix maillog
      add_prefix filtered

      <rule>
        key     process
        pattern ^postfix\/(qmgr|pickup|cleanup|bounce)
        ignore  true
      </rule>
      <rule>
        key     address
        pattern \@myserivice.com$
        ignore  true
      </rule>
    </match>

    #入力したログの処理設定その2~メールが送れなかったものはDBでアップデート~
    <match filtered>
      type mysql
      host localhost
      database myapp
      key_names address
      sql UPDATE member set isnt_mail_send = 1 WHERE mail_address = ?
      username root
      password test
      flush_interval 10s
    </match>

    #(参考)入力したログの処理設定~最終的にファイルに吐き出す場合~
    #<match filtered>
    #  type file  #out_fileプラグインを指定
    #  path /var/log/td-agent/httpd/mail.log  #出力先ファイルを指定
    #  time_slice_format %Y%m%d  #ファイル名に含める日時情報を指定
    #  time_slice_wait 10m  #ログファイルの更新後に旧ログファイルへのログ記録を継続する時間を指定
    #  compress gzip  #ログをgzip形式で圧縮
    #</match>

あと、DBには、myappデータベースとmemberテーブルがある前提です。

いくつかの疑問

ログファイルのパーミッションを変えるのか?

fluentdで扱うためにログファイルパーミッションを変えるのが王道なのか不安

HTTPでPOSTする処理はどうしたらいいのか?

スケールを考えると、DBのデータを変更するのをHTTPのWebAPIを用意したいところだったが、out_exec経由でcurlなりをたたけばいいのか、王道は何か疑問

エラーログを気軽にメール通知する処理はどうすればいいのか?

今回とは別に、そんなに負荷もないmysqlやapacheを運用していると、めったにエラーなど起きないが、起きた場合はそれをうまく処理したい。

とりあえずどんなエラーが起きるかも想像もつかないから、とりあえず、エラーメッセージをメールで飛ばしたいという感じだけど、この一般的にありそうな出力方法もいまいち王道が何か疑問。

時流に乗り遅れると。。。

新しいときに触っていると、いろいろ障害に出くわして大変だけど、ちょうど今のfluentdくらいに書籍されていないけど、メジャーな状態(Nginxも似たようなもんだけどまだ2冊くらい本が出ているからまし)で入門しようとすると、なかなか大変です。。。あと、chefも久々に使うと何が何だか忘れていてつらい。。。プログラムに限らずツールっていうのは使い続けないと忘れちゃうのが問題ですなー

もし、お時間があれば疑問に答えている人、絶賛募集中ー!!!

Linux update_at : 2013-12-15T17:54:15
hirobanex.netの更新情報の取得
 RSSリーダーで購読する   
blog comments powered by Disqus