マクロやテンプレでsyslog-ngを使い倒す:新世代syslogデーモン徹底活用(3)(3/3 ページ)
UNIX系OSのシステムロギングをおよそ20年の長きにわたって支えてきた「syslogd」にも、限界が見えつつあります。その限界を打ち破る機能を備えた新しいシスログデーモンを紹介します。(編集部)
データベースサーバにログメッセージを挿入する
syslog-ngには、今回紹介している無償版以外に、有償版も用意されています。有償版では、MySQLやOracleのようなデータベースサーバにログを挿入することができます。しかし無償版でも「名前付きパイプ(注2)」経由で、データベースサーバにログを挿入することができます。
注2 名前付きパイプ:複数のプロセス間で、双方向にデータをやりとりするための共有メモリ領域です。ファイル同様に読み書きが可能です。
MySQLサーバを例に、設定方法を解説します。名前付きパイプを利用するため、syslog-ngサーバ上でMySQLを稼働させる必要があります。MySQLのインストールや起動は「今から始めるMySQL入門」などを参考にしてください。
MySQLが利用可能なことを確認し、リスト11の手順でデータベース・テーブルを作成し、権限を設定します。テーブルやフィールドの定義などは、用途によって適宜変更するようにします。
# yum install mysql mysql-server (FedoraやCentOSなど、yumが使用できるディストリビューションでのMySQLのインストール) # /etc/init.d/mysqld start (MySQLの起動)
# mysqladmin create syslogng (データベースの作成) # mysql syslogng mysql> CREATE TABLE `logs` ( -> `host` varchar(32) default NULL, -> `facility` varchar(10) default NULL, -> `priority` varchar(10) default NULL, -> `level` varchar(10) default NULL, -> `tag` varchar(10) default NULL, -> `date_time` datetime NOT NULL, -> `program` varchar(32) default NULL, -> `msg` text, -> `seq` int(10) unsigned NOT NULL auto_increment, -> PRIMARY KEY (`seq`), -> KEY `host` (`host`), -> KEY `seq` (`seq`), -> KEY `program` (`program`), -> KEY `priority` (`priority`), -> KEY `facility` (`facility`) -> ); Query OK, 0 rows affected (0.05 sec) (テーブルの作成) mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON syslogng.* TO user@localhost IDENTIFIED BY 'password'; Query OK, 0 rows affected (0.00 sec) (権限の設定)
データベース: syslogng テーブル: logs ユーザー名: syslogng パスワード: password
syslog-ng.confに加える設定は、リスト13のとおりです。「template」とマクロを使って、MySQLに挿入するINSERTクエリを組み立てます。「destination」で名前付きパイプを出力先に指定するには、pipe()を用います。
source s_sys { file ("/proc/kmsg" log_prefix("kernel: ")); unix-stream ("/dev/log"); internal(); }; template t_sql { template("INSERT INTO logs (host, facility, priority, level, tag, date_time, program, msg) VALUES ('$HOST', '$FACILITY', '$PRIORITY', '$LEVEL','$TAG', '$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC', '$PROGRAM', '$MSG' );\n"); template_escape(yes); }; destination d_mysql { pipe("/var/log/mysql.pipe" template(t_sql)); }; log { source(s_sys); destination(d_mysql); };
続いて、名前付きパイプをmkfifoコマンドで作成します。
># mkfifo /var/log/mysql.pipe
名前付きパイプに出力されるINSERTクエリを拾い、クエリを実行するために、付録2のようなスクリプト「syslog2mysql.sh」を用意します。スクリプト中で使用しているコマンドパスなどは適宜変更してください。また、MySQLユーザーとパスワード、データベース名やテーブル名を変更している場合は、スクリプトを修正します。詳細はスクリプト中のコメントを参照してください。
スクリプト準備後、次のようにスクリプトに実行権を与えます。今回、スクリプトは常駐プロセスとしてバックグラウンドで実行します。
# chmod +x /..pathto../syslog2mysql.sh (実行権設定) # /..pathto../syslog2mysql.sh & (バックグラウンドで実行)
作業終了後、syslog-ngを再起動し設定を有効にします。ログがMySQLに挿入されているかを次のようにして確認します。
# mysql --user=user --password=password syslogng mysql> SELECT * FROM logs LIMIT 0,5; (先頭から5件だけ表示) 5 rows in set (0.00 sec) +---------+----------+----------+---------+------+---------------------+-----------+--------------------- | host | facility | priority | level | tag | date_time | program | msg +---------+----------+----------+---------+------+---------------------+-----------+--------------------- | Fedora9 | syslog | notice | notice | 2d | 2008-09-11 21:02:41 | syslog-ng | syslog-ng[3660]: sys | Fedora9 | authpriv | info | info | 56 | 2008-09-11 21:04:24 | sshd | sshd[3674]: Invalid | Fedora9 | authpriv | info | info | 56 | 2008-09-11 12:04:25 | sshd | sshd[3675]: input_us | Fedora9 | authpriv | warning | warning | 54 | 2008-09-11 21:04:26 | sshd | sshd[3674]: pam_unix | Fedora9 | authpriv | notice | notice | 55 | 2008-09-11 21:04:26 | sshd | sshd[3674]: pam_unix +---------+----------+----------+---------+------+---------------------+-----------+--------------------- (END) ※表示が乱れる場合は、「mysql> PAGER less -S」でページャを使って表示を抑制できます。
syslog-ngには多くの活用事例があります。今回は紹介できませんでしたが、ファイルシステムへログ書き込むタイミングを指定したり、ログ収集サーバとしてほかのサーバからログを受け取ることもできます。ログを受け取る際には、TCPを使うこともできます。そうした用途でsyslog-ngを使用するには、下記サイトを参考にしてください。
次回はもう1つの次世代syslogデーモンの候補「rsyslog」を取り上げ、インストール方法や基本設定を解説します。
Copyright © ITmedia, Inc. All Rights Reserved.