2012年11月8日木曜日

rsyslog のログを DB で管理する ( MySQL / PostgreSQL )

こんにちは。サイオステクノロジーの小川です。

前回は rsyslog でログを転送管理する設定をご紹介しました。今回は rsyslog のログを MySQL または PostgreSQL のデータベースに保存する方法をご紹介します。

rsyslog はデフォルトの設定ではログをテキストファイルで保存しますが、rsyslog にモジュールを追加し機能を拡張することでデータベースにログを保存できるようになります。

rsyslog で提供されているモジュールは MySQL の ommysqlPostgreSQL の ompgsql があり、これらのモジュールを追加することで、データベースにログを書き込むことができるようになります。サーバのログをデータベースで一元管理したい、 というような場合は rsyslog のモジュールを是非活用してみてください。

本記事で使用する OS は前回と同様 CentOS 6.3 64bit です。rsyslog やデータベースの使用で必要なパッケージはすべて CentOS に同梱されているものを使用します。 パッケージのバージョンは rsyslog 5.8.10、rsyslog-mysql-5.8.10、mysql-server-5.1.61、rsyslog-pgsql 5.8.10、postgresql-server 8.4.11 です。


  • rsyslog の設定の書式

  • はじめに rsyslog にモジュールを追加するために必要な設定の書式を以下に記載します。設定は rsyslog の設定ファイル /etc/rsyslog.conf で行います。

    書式
    $ModLoad module_name
    
    * $ModLoad
    rsyslog のログをデータベースに書き込みの際に使用する rsyslog の拡張モジュールを module_name に指定します。MySQL を使用する場合は ommysql、PostgreSQL を使用する場合は ompgsql を指定します。

    次にデータベースに rsyslog のログを書き込む設定の書式を以下に記載します。

    書式
    Facility.Severity:module_name:database_server,database_name,database_userid,database_password
    
    * Facility.Severity
    Facility および Severity の説明は前回の記事で Facility と Severity に記載しています。

    * module_name
    $ModLoad で指定したモジュールを指定します。

    * database_server
    データベースサーバが動作するホストを指定します。

    * database_name
    データベースの名前を指定します。

    * database_userid
    データベースユーザ名を指定します。

    * database_password
    データベースユーザのパスワードを指定します。


  • MySQL の準備

  • [MySQL 側の準備]

    MySQL の設定例を以下に記載します。

    1. yum コマンドで MySQL サーバのパッケージをインストール。

    # yum install mysql-server

    2. yum コマンドで rsyslog-mysql パッケージをインストール。

    # yum install rsyslog-mysql

    3. MySQL サーバを起動します。

    /etc/init.d/mysqld start

    ※ 今回はデフォルトの設定のため、ポート 3306 番を使用しています。

    4. mysql コマンドで MySQL サーバに接続した後、SET 文で root ユーザのパスワードを設定。

    太文字の password に root ユーザのパスワードを指定します。

    実行例
    mysql> SET PASSWORD FOR root@localhost=PASSWORD('password');

    実行結果
    Query OK, 0 rows affected (0.00 sec)
    

    5. mysql コマンドで createDB.sql を読み込み、Syslog データベースと SystemEvents、SystemEventsProperties テーブルを作成。

    rsyslog-mysql のパッケージで /usr/share/doc/rsyslog-mysql-5.8.10 に createDB.sql が用意されているので活用しましょう。

    # mysql -u root -p < /usr/share/doc/rsyslog-mysql-5.8.10/createDB.sql
    Enter password:root ユーザのパスワードを入力

    6. mysqlshow コマンドで Syslog データベースが作成されていること確認。

    # mysqlshow

    実行結果
    +--------------------+
    |     Databases      |
    +--------------------+
    | information_schema |
    | Syslog             |
    | mysql              |
    | test               |
    +--------------------+
    
    7. mysql コマンドを使用して root ユーザで Syslog データベースにアクセスし、SHOW 文で SystemEvents と SystemEventsProperties テーブルが作成されていることを確認。

    # mysql -u root Syslog
    mysql> SHOW TABLES;

    実行結果
    +------------------------+
    | Tables_in_Syslog       |
    +------------------------+
    | SystemEvents           |
    | SystemEventsProperties |
    +------------------------+
    2 rows in set (0.00 sec)
    

    8. Syslog データベースのすべての権限を所有する rsyslog ユーザの作成と rsyslog ユーザのパスワードを設定。

    今回は rsyslog と MySQL サーバが同一サーバなので localhost を指定していますが、rsyslog とMySQL サーバが別のサーバで動いている場合は "@" の後ろを IP アドレスやサーバのホスト名を指定してください。

    IDENTIFIED 句で rsyslog のパスワードを指定します。太文字の password は適切なパスワードに変更してください。

    実行例
    mysql> GRANT ALL PRIVILEGES ON Syslog.* TO rsyslog@localhost IDENTIFIED BY 'password';

    実行結果
    Query OK, 0 rows affected (0.00 sec)
    

    [MySQL を使用する場合の rsyslog の設定例]
    次にMySQL を使用するための rsyslog の設定例を以下に記載します。

    1. rsyslog の設定ファイル /etc/rsyslog.conf を以下のように設定。

    設定例
    $ModLoad ommysql
    *.* :ommysql:localhost,Syslog,rsyslog,password
    
    2. rsyslog のサービスを再起動。

    # service rsyslog restart

    以上で MySQL を使用する場合の設定はすべて完了です。

  • 動作確認

  • [MySQL を使用した場合の動作結果]

    1. rsyslog ユーザで Syslog データベースにアクセスする。

    # mysql -u rsyslog -p Syslog
    Enter password: rsyslog ユーザのパスワードを入力

    2. SystemEvents テーブルにログが記録されていることを確認する。

    実行例
    mysql> SELECT priority,message FROM SystemEvents WHERE priority = 6 LIMIT 3;

    実行結果
    +----------+------------------------------------------------------------------------------------------------------+
    | priority | message                                                                                              |
    +----------+------------------------------------------------------------------------------------------------------+
    |        6 | imklog 5.8.10, log source = /proc/kmsg started.                                                      |
    |        6 |  [origin software="rsyslogd" swVersion="5.8.10" x-pid="16085" x-info="http://www.rsyslog.com"] start |
    |        6 | ip_tables: (C) 2000-2006 Netfilter Core Team                                                         |
    +----------+------------------------------------------------------------------------------------------------------+
    3 rows in set (0.00 sec)
    



  • PostgreSQL の準備

  • [PostgreSQL 側の準備]

    PostgreSQL の設定例を以下に記載していきます。

    1. yum コマンドで PostgreSQL サーバのパッケージをインストール。

    # yum install postgresql-server

    2. yum コマンドで rsyslog-pgsql パッケージをインストール。

    # yum install rsyslog-pgsql

    3. データベースを初期化。

    # /etc/init.d/postgresql initdb --no-locale

    4. PostgreSQL の設定ファイル postgresql.conf を以下のように設定。

    今回 PostgreSQL サーバは rsyslog サーバと同一ホストで動かしているので localhost を指定しています。

    設定例
    listen_addresses = 'localhost'
    
    * listen_address
    PostgreSQL が稼働するサーバの IP アドレスまたはホスト名を指定します。今回はローカルホストで動かしているため localhost を指定しています。なお、ポート番号はデフォルトの 5432 番を使用します。

    5. PostgreSQL の設定ファイル pg_hba.conf を以下のように設定。

    設定例
    local   Syslog      rsyslog                       md5
    

    * local
    UNIX ドメインを使用して接続するクライアントを認証したい場合に指定します。上記の設定では rsyslog ユーザが Syslog データベースにアクセスする際は MD5 で暗号化されたパスワードで認証が行われます。

    * host
    TCP/IP を使用して接続するクライアントを認証したい場合に指定します。上記の設定ではローカルホストから rsyslog ユーザが Syslog データベースにアクセスする際は MD5 で暗号化されたパスワードで認証が行われます。

    6. PostgreSQL サーバを起動。

    # /etc/init.d/postgresql start

    7. postgres ユーザに切り替え、createuser コマンドでデータベースユーザ rsyslog を作成。

    # su - postgres
    $ createuser -P rsyslog

    実行結果
    新しいロールのパスワード:パスワードを入力する
    もう一度入力してください:パスワードを再入力する
    新しいロールをスーパーユーザとしますか?  (y/n)n
    新しいロールにデータベース作成権限を与えますか? (y/n)n
    新しいロールにロールを作成する権限を与えますか? (y/n)n
    

    8. psql コマンドで createDB.sql を読み込み、Syslog データベースと SystemEvents、SystemEventsProperties テーブルを作成。

    rsyslog-pgsql のパッケージで /usr/share/doc/rsyslog-pgsql-5.8.10 に createDB.sql が用意されているので活用しましょう。

    $ psql -f /usr/share/doc/rsyslog-pgsql-5.8.10/createDB.sql

    デフォルトのプログラムを実行した場合は以下のようなエラーが出力されます。

    エラーメッセージを抜粋
    ERROR:  "'Syslog'"またはその近辺で構文エラー
    行 1: CREATE DATABASE 'Syslog' WITH ENCODING 'SQL_ASCII';
                          ^
    \connect: FATAL:  データベース"Syslog"は存在しません
    

    PostgreSQL では大文字と小文字を区別する場合、文字をダブルクォーテーションで括る必要があります。

    そのため、createDB.sql に記述されている CREATE DATABASE 'Syslog' の SQL 文を以下のようにシングルクォーテーションではなくダブルクォーテーションに変更してください。

    修正内容
    CREATE DATABASE "Syslog" WITH ENCODING 'SQL_ASCII';
    
    修正後、再度 psql コマンドを実行して createDB.sql を読み込ませると、以下のようなエラーが発生します。

    エラーメッセージを抜粋
    ERROR:  新しい符号化方式(SQL_ASCII)はテンプレートデータベースの符号化方式(UTF8) と互換性がありません
    HINT:  テンプレートデータベースの符号化方式と同じものを使うか、もしくは template0 をテンプレートとして使用してください
    \connect: FATAL:  データベース"Syslog"は存在しません
    
    上記のエラーはテンプレートデータベースの符号化方式 UTF8 と SQL_ASCII の互換性がないため出力されるエラーです。

    このメッセージが表示された場合はエンコーディングを UTF8 に指定することでエラーが解消しますので createDB.sql を以下のように修正してください。

    修正内容
    CREATE DATABASE "Syslog" WITH ENCODING 'UTF8';
    
    Syslog データベースの所有者を rsyslog にするので、ついでに CREATE DATABASE の SQL 文に OWNER rsyslog を追記しておきましょう。

    追記内容
    CREATE DATABASE "Syslog" WITH ENCODING 'UTF8' OWNER rsyslog ;
    
    また、作成したテーブルの所有者も rsyslog にするので createDB.sql の最終行に以下の 2 行を追記します。

    追記内容
    ALTER TABLE SystemEvents OWNER TO rsyslog;
    ALTER TABLE SystemEventsProperties OWNER TO rsyslog;
    
    修正が完了しましたら、再度 psql で createDB.sql を読み込ませます。問題なければエラーが出力されることなく SQL 文が実行され、Syslog データベースと SystemEvents および SystemEventsProperties テーブルの作成が完了します。

    9. Syslog データベースと SystemEvents、SystemEventsProperties のテーブルが作成されていることを確認。

    [データベースの一覧]

    # psql -c "\l" -U rsyslog Syslog

    実行結果
                                             データベース一覧
       名前    |  所有者  | エンコーディング |  照合順序   | Ctype(変換演算子) |    
      アクセス権       
    -----------+----------+------------------+-------------+-------------------+----
    -------------------
     Syslog    | rsyslog  | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
     postgres  | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
     template0 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/
    postgres
                                                                               : pos
    tgres=CTc/postgres
     template1 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/
    postgres
                                                                               : pos
    tgres=CTc/postgres
    (4 行)
    

    [テーブルの一覧]

    # psql -c "\dt" -U rsyslog Syslog

    実行結果
                       リレーションの一覧
     スキーマ |          名前          |    型    | 所有者  
    ----------+------------------------+----------+---------
     public   | systemevents           | テーブル | rsyslog
     public   | systemeventsproperties | テーブル | rsyslog
    (2 行)
    

    [PostgreSQL を使用する場合の rsyslog の設定例]

    次に PostgreSQL を使用するための rsyslog の設定例を以下に記載します。

    1. rsyslog の設定ファイル /etc/rsyslog.conf を以下のように設定。

    設定例
    $ModLoad ompgsql
    *.* :ompgsql:localhost,Syslog,rsyslog,password
    
    2. rsyslog のサービスを再起動。

    # service rsyslog restart

    以上で PostgreSQL を使用する場合の設定はすべて完了です。



  • 動作確認

  • [PostgreSQL を使用した場合の動作結果]

    1. rsyslog ユーザで Syslog データベースにアクセスする。

    $ psql -U rsyslog Syslog
    Password for user rsyslog:rsyslog ユーザのパスワードを入力

    2. SystemEvents テーブルにログが記録されていることを確認する。

    実行例
    Syslog=> SELECT priority,message FROM SystemEvents WHERE priority = 6 LIMIT 3;

    実行結果
      priority |                                               message                                               
    ----------+-----------------------------------------------------------------------------------------------------
            6 | imklog 5.8.10, log source = /proc/kmsg started.
            6 |  [origin software="rsyslogd" swVersion="5.8.10" x-pid="6700" x-info="http://www.rsyslog.com"] start
            6 |  pam_unix(su-l:session): session opened for user postgres by root(uid=0)
    (3 rows)
    
    上記結果より rsyslog のログがデータベースに書き込まれていることを確認できました。



    最後に参考になるサイトを以下に記載します。

    Writing syslog messages to MySQL, PostgreSQL or any other supported Database
    http://www.rsyslog.com/doc/rsyslog_pgsql.html

    0 件のコメント:

    コメントを投稿