rsyslogのデータをMySQLに保存する

rsyslogのTLS(SSL)暗号化 でCollectorに対してFORWARDしましたが、その続編的な内容になります。

rsyslogにはMySQLやHDFSに保存するモジュールなど色々あり、Collectorで集めたログをどう扱うかと悩んだ結果、今回はMySQLでやってみることにしました。



リンク

  • MySQL Database Output Module rsyslog
  • rsyslog でDBに記録する – いますぐ実践! Linuxシステム管理 / Vol.209
  • バックエンドに Mysql を使用して rsyslog を インストール – harry’s memorandum


  • 選択理由

    ログ量が少なくて重要度が低いなら、ローカルファイルでlogwatchとか、
    ログが膨大ならBigDataを間借りしてHDFS+Hiveとか考えたけど、
    中規模以下ならMySQLが安定だな~と思った理由がこんな感じです。

  • 複数Collectorから安定して保存できる
  • 集計がSQLで簡単
  • バックアップしやすい
  • 時系列なので古くなった不要ログの管理をしやすい

  • RDBMSにとっちゃアタリマエですが、rsyslogであまりやらないことだから書いてみました。
    複数CollectorはLVSを挟めば簡単に実現できます。


    バージョン

    OSはWheezyで、rsyslogは標準パッケージの 5.8.11 です。

    6.3.3 から設定記法が新しくなって、条件分岐とかちゃんと書けるようになるので、何気に楽しみだったりします(legacyだと無駄な分岐記述になったりするので…)。
  • Rainer’s Blog: rsyslog 6.3.3 config format improvements

  • MySQLのバージョンはなんでもいいです。


    MySQL Server

    MySQLのインストール

    私はクセでPerconaを使いますが、好きなMySQLを入れてmy.cnf設定まで。
    何度も書いてるので手順は割愛します。

    GRANT

    作業内容はこんな感じです。
  • rsyslogサーバにはINSERT権限
  • 参照して解析処理をするサーバにSELECT(今回はrsyslogサーバと同じ)
  • mysqldump用にlocalhostに色々
  • レプリケーション用ユーザ作成
  • rsyslog用DB作成

    デフォのDB名がSyslogなのでそのまま使います。
    SOURCEで作るテーブルはデフォ用テーブルですが、独自テーブルにする場合は不要です。

    独自テーブル作成

    デフォ用テーブルはかなり余計なカラムがあるので、お好みで作成します。
    月単位で削除しやすいようにパーティションも切っておきます。

    これでMySQLサーバの準備は完了です。


    rsyslogサーバ

    rsyslogのTLS(SSL)暗号化 の続きなので、サーバとして受信する設定は設定済みとします。

    モジュール

    MySQLのクライアントとなるrsyslogサーバに、モジュールのパッケージを入れます。

    転送ログ一部削除の設定

    FORWARDされてきたものの、MySQLに保存しないで破棄する用の設定ファイルを置いておきます。クライアントに送らせないのが一番ですが、サーバですぐ対応できるので。

    /etc/rsyslog.d/50-collector-drop.conf

    MySQLに保存する設定

    クライアント同様Queueを利用し、MySQLのダウンに備えます。

    独自テーブルに合わせてテンプレートを作成し、リモートからきたログのみMySQLに保存します。
    %msg% は先頭のスペースを削除しています。

    /etc/rsyslog.d/51-collector-mysql.conf

    反映&確認

    再起動して反映します。

    クライアントから適当にログを送って、MySQLデータを確認します。


    デフォルト構成

    付属のテーブル構成・デフォルトテンプレートを確認しておきます。
    テーブル名は SystemEvents になっています。

    スキーマ

    データ

    テンプレート


    プロパティの確認

    リンク

  • The Rsyslogd Property Replacer rsyslog
  • Templates – rsyslog.conf rsyslog
  • 新世代syslogデーモン徹底活用(5):マクロとテンプレートによるrsyslog活用法 (1/2) – @IT

  • プロパティ確認用の設定

    プロパティが実際に保存する値がどんなものか確認するための設定です。
    ドキュメントにある項目をズラズラ並べただけです。
    $now なども %$now% と同じように % で挟んで使用します。

    プロパティごとの保存値

    注意点

    IPアドレス
    ソースIPアドレスとなる %fromhost% と %fromhost-ip% の違いはドキュメントに書いてあるからいいとして、

    実際に保存されるIPアドレスはL3層でのrsyslogサーバ接続ソースアドレスになるので、NATされているとNAT時のアドレスが記録されることになります。要望的にはログを記録したクライアントのプライベートアドレスがベストなのですが、VPN限定にでもしない限り仕組み的にどうしようもないので気持ち記録しておく程度になります。
  • troubleshooting rsyslog rsyslog

  • 先頭スペース
    %msg% と %app-name% の先頭にスペースが入ります。%app-name% は %programname% を使えばいいですが、%msg% は使わざるを得ないので、気持ち悪いですが保存時に2文字目から終端までを使うことになります。


    バックアップ

    蓄積データなので、バックアップはテーブル・DB丸ごと取ると無駄になります。
    スクリプトの抜粋になりますが、こんな感じで -w でConditionsを指定して一日分抽出しています。

    本当は転送遅延を考慮して ReceivedAt で条件付けた方が正しいかもですが、ジャスト0時にとるわけじゃないし、その辺は重要度とかインデックスの都合でよしなに・・・


    古いデータの削除

    特に自動化せず、ディスク容量のアラートがきたら削除する程度でよいかと。


    解析

    詳しくは省きますが、1分に1回の検知系と、1日1回の集計系を仕込んでいます。

    検知したいログが発見されたら、ほぼ同じスキーマの別テーブルに INSERT INTO ~ SELECT でコピーしておきつつ、詳細を記載した検知アラートを出すなどしています。



    syslog-ng と両方使ったことがありますが、rsyslog の方が圧倒的に取っ付きやすくて好きですね。

    地味なところですけど、ちゃんと理解して使えるようになっておきたいところです。