php-syslog-ng を rsyslog のフロントエンドに仕立て上げる

syslog-ng のフロントエンドである php-syslog-ngrsyslog のフロントエンドとして使ってみる。rsyslog のサイトに Using php-syslog-ng with rsyslog ってドキュメントもあるけど、最新の php-syslog-ng はスキーマが変更されててうまくいかない。それに、rsyslog のほうが項目数が多いので、単純にスキーマだけ合わせると情報が劣化してしまう。

そこで、php-syslog-ng のスキーマに合ったビューを作って、それを表示するように設定する。

facility と priority のテキスト化

rsyslog と php-syslog-ng のそれぞれのスキーマで、一番大きな違いが facility と priority で、rsyslog は数値なのに対して、php-syslog-ng はテキストが決め打ちになっている。なので、数値とテキストを対応付けるテーブルを作って、JOIN する。

facility
CREATE TABLE `facilities` (
    `facility` SMALLINT(5) NOT NULL,
    `name` TEXT NOT NULL,
    PRIMARY KEY (`facility`)
);

INSERT INTO `facilities` VALUES
    (0, 'kern'),
    (1, 'user'),
    (2, 'mail'),
    (3, 'daemon'),
    (4, 'auth'),
    (5, 'syslog'),
    (6, 'lpr'),
    (7, 'news'),
    (8, 'uucp'),
    (9, 'cron'),
    (10, 'authpriv'),
    (11, 'ftp'),
    (16, 'local0'),
    (17, 'local1'),
    (18, 'local2'),
    (19, 'local3'),
    (20, 'local4'),
    (21, 'local5'),
    (22, 'local6'),
    (23, 'local7');
priority
CREATE TABLE `priorities` (
    `priority` SMALLINT(3) NOT NULL,
    `name` TEXT NOT NULL,
    PRIMARY KEY (`priority`)
);

INSERT INTO `priorities` VALUES
    (0, 'emerg'),
    (1, 'alert'),
    (2, 'crit'),
    (3, 'err'),
    (4, 'warning'),
    (5, 'notice'),
    (6, 'info'),
    (7, 'debug');

ビューを作る

あとはビューにするだけ。

CREATE OR REPLACE VIEW `logs` AS
SELECT
    `FromHost` AS `host`,
    `facilities`.`name` AS `facility`,
    `priorities`.`name` AS `priority`,
    `priorities`.`name` AS `level`,
    `SysLogTag` AS `tag`,
    `ReceivedAt` AS `datetime`,
    `SysLogTag` AS `program`,
    `Message` AS `msg`,
    `ID` AS `seq`,
    NULL AS `counter`,
    NULL AS `fo`,
    NULL AS `lo`
FROM `SystemEvents`
LEFT OUTER JOIN `facilities`
    ON `SystemEvents`.`Facility` = `facilities`.`facility`
LEFT OUTER JOIN `priorities`
    ON `SystemEvents`.`Priority` = `priorities`.`priority`
;

利点

SystemEvents テーブルには手を加えてないので、rsyslog の設定をするのが簡単。さらに、phpLogCon とも共存させることもできる。

問題点

ログの件数が多くなるとビューのオーバーヘッドが影響してくるのかな?そこまでは検証してない。SystemEvents テーブルにインデックスを追加すればいいのかも。