Posts Tagged ‘syslog’

syslog-ng と rsyslog

January 8th, 2010 by naoya | No Comments | Filed in day

そろそろ本格的に、CentOS な本番サーバを syslog-ng あるいは rsyslog に切替えようと、実際に試してみました。切替えたい目的は、必要なログは集中管理したいためです。今回は、本番環境でも使う Apache のアクセスログを他のサーバに転送するための設定方法だけ紹介します。

まずは、syslog-ng。

syslog-ng の本家サイトをみると、次のような3種類のバージョンがあります。

  • オープンソース版: フリー、syslog-ng のオープンソースブランチ
  • プレミアム版: いくつかの追加機能をオリジナルのオープンソース版 syslog-ng からフォークした商用版
  • ストアボックス版: ログのライフサイクル管理の中央ログサーバアプライアンス

次に CentOS では、バージョン 2.1.4 が EPEL のリポジトリから提供されています。本家サイトでは、次のバージョンが stable として提供されています。

  • 3.0.5 – 3.0.1
  • 2.1.4 – 2.1.3
  • 2.0.10

EPEL で提供されているのは、2.1 系の最新版ということになります。最新版のバージョン 3 系の changelog は、ここで確認できます。おもな変更は、次の内容になります。

  • IETF によって策定された新しい syslog プロトコルの標準に対応した、具体的な仕様はここここを参照してください
  • Log ステートメントに他の複雑なログのパスを組み込むことができるようになった
  • 元ファイルの文字コードを設定することが可能になった(内部的には、syslog-ng はすべてのメッセージを UTF-8 として記憶している)
  • syslog-ng のアプリケーションは、すべてのログメッセージに対してユニークなメッセージ識別子を付与できるようになった
  • syslog-ng のアプリケーションは、テンプレートや正規表現を使って構造化されたメッセージを読み込んだり、処理できたり、書き直すことができるようになった(例えば、Apache のウェブサーバログ)。フィールドサイズを変更することとデリミッターで区切られているフィールドの両方のメッセージをサポートした

それほど大きな変更点はないようなので、EPEL で提供されているものを十分だと思われます。EPEL が利用できるなら、インストールは次のコマンドでできます。

$ sudo yum install syslog-ng

インストールすると、制御スクリプトが /etc/syslog-ng、設定ファイルが /etc/syslog-ng/syslog-ng.conf にインストールされます。

実際に使用する前に、syslog-ng のおもな特徴をまとめておきます。

  • 既存の syslog の設定ファイルと互換性がない(デフォルトでインストールされている設定ファイルがデフォルトの syslog の設定と同じになっています)
  • facility などで細かく出力するログの内容を設定することができる
  • 出力するログファイル名に、日付などを設定することができる(これによりログローテート入らずになります)
  • UDP/TCP によって、任意のサーバへログ転送することができる(デフォルトのポートは、514)
  • facility、priority、ホスト名、アプリケーション名、などで自分のプログラムを起動することができる

syslog-ng と rsyslog は、従来の syslog を置き換えるものなので、事前に syslog を必ず止めて起動しないようにしておきます。(さようなら syslog、今までありがとう syslog…)

$ sudo /etc/init.d/syslog stop

$ sudo chkconfig syslog off

今回は、Apache のアクセスログを syslog-ng と rsyslog でシスログ転送する方法をそれぞれ紹介します。

Apache のアクセスログは、パイプで logger コマンドを指定すると syslog へ出力することができます。

CustomLog “|/usr/bin/logger -i -p local4.info -t httpd” combined

syslog-ng の設定は、次の内容を /etc/syslog-ng/syslog-ng.conf に追加します。

filter f_httpd {
facility(local4) and level(info);
};

destination d_httpd {
file(“/var/log/syslog_httpd_access_log”);
udp(“192.168.1.2″);
};

log { source(s_sys); filter(f_httpd); destination(d_httpd); };

上のように設定しておくと、/var/log/syslog_httpd_access_log にアクセスログが出力されて、かつ 192.168.1.2 のサーバにログを UDP で転送するという設定になります。

192.168.1.2 の syslog-ng の設定は、s_sys source のコメントをはずします。なお、UDP/TCP の 514 ポートが iptables でブロックされていないか確認しておきましょう。tcp にしたい場合には、udp を tcp に置き換えます。

udp(ip(0.0.0.0) port(514));

syslog-ng を起動する前に、設定ファイルに記述ミスがないかどうか調べてみます。

$ sudo /etc/init.d/syslog-ng checkconfig

Checking Configuration:                                    [  OK  ]

問題がなければ起動してみます。

$ sudo /etc/init.d/syslog-ng start

Starting syslog-ng:                                        [  OK  ]

これで、httpd へのアクセスログがローカルのディスクに出力されて、かつ 192.168.1.1 のサーバにも同じ内容が転送されてアクセスログとして出力されます。

syslog-ng の設定項目は、膨大なので公式ドキュメント(PDF 形式)を参考にしたほうがよいと思います。

次に rsyslog。

rsyslog は、CentOS の base リポジトリで、バージョン 2.0.6 が提供されています。rsyslog にも、いくつかのバージョンが stable として提供されています。

四系統もバージョンがあり、かなり複雑な印象をうけます。v2 と v3 では、互換性がないようで専用の互換モードが用意されています。それぞれのバージョンでも互換モードが用意されています。v2 は、すでにサポートされていないので、v3 stable 以降を使うといいと思います。

ちなみに、Fedora では Fedora 8 から、syslog のかわりに rsyslog を採用しています。最新版の Fedora 12 では、rsyslog のバージョンは 4.4.1 でした。

なので、v4 stable のバージョン 4.4.2 を使うのがよさそうです。このバージョンは、RPM では提供されていないので、Fedora プロジェクトのものを使って RPM を作成するといいと思います。Fedora プロジェクトのもので RPM を作成すると、sysklogd パッケージと /etc/logrotate.d/syslog がコンフリクトしてしまいますが、従来の /etc/logrotate.d/syslog の内容と同じもので rsyslog の RPM を作成すればコンフリクトを解消することができます。設定ファイル内のスペースとタグも区別するので、まったく同じ内容になるように作成してください(僕はここですこしはまりました…)。

rsyslog をインストールすると、制御スクリプトが /etc/init.d/rsyslog、設定ファイルが /etc/rsyslog.conf、にインストールされます。rsyslog.conf をみて分かるとおり、従来の syslog の設定ファイルとほぼ同じ内容になっています。

rsyslog のおもな特徴は、次のとおりです。これらの機能は、syslog-ng では提供されていない機能だと思われます。特に圧縮転送はうれしい機能の一つです。マクロは、syslog-ng と同じようなものが提供されています。その他の詳しい機能は、本家サイトで確認してください。

  • MySQLやPostgreSQLをモジュールなどで拡張することなく、ネイティブでサポート
  • libdbiを使用すれば、Firebird/Interbase/MS SQL/SQLLite/Oracleなどに対応可能
  • 圧縮転送が可能
  • stunnelを使ったシスログのセキュアな転送が可能
  • シスログのディスク書き込みで、I/Oの処理が間に合わない場合など、スプールを使用することができる。特にバックエンドにデータベースを使用している場合に有効に機能する

Apache のアクセスログを出力している側の rsyslog の設定は、次の内容を追加します。

local4.info @@192.168.1.2

たったこれだけです。@@ というのは、TCP でログを転送するという意味になります。UDP で転送したい場合は、@ と指定します。

syslog-ng と rsyslog、どちらも試してみましたが、どちらもほぼ同じ機能が提供されています。設定ファイルの書き方が、まったく違うので、どちらかを常用するべきか決めたほうがいいと思います。

僕の場合、CentOS であること、Fedora が rsyslog を標準採用したということで、RedHat もそろそろ標準採用しそうか感じがあるので、rsyslog を本番環境へ本格的に投入してみることしました。

rsyslog を本番環境へ投入するにあたりかなりはまったので、この内容は別にエントリする予定です。

Tags: