syslogの出力をスクリプトに渡す方法

前回の記事で、apacheのログ出力をスクリプトに渡すには、httpd.confのCustomLogの部分をパイプを使って書けばいいだけでした。

しかし、syslogの場合は、syslog.confに同様の記述をすると、スクリプトのソース内にログを出力してしまいます。

そのため、syslogの出力をスクリプトに渡すには少し工夫がいるわけです。

今回はその手順を簡単に説明します。


以下のコマンドでfifoスペシャルファイルを作成します。

$ mkfifo test.fifo

このファイルは、簡単に言うと、コマンドのパイプのように、一時的にパイプする出力を保存しておく特別なファイルです。

そして、syslogの出力をこのfifoファイルにパイプして一時的に保存しておきます。
syslog.confの設定例は以下。

*.info;mail.none;authpriv.none;cron.none                |/root/test/test.fifo

そして、このfifoファイルをスクリプト内でファイルオープンすることで、syslogの出力を受け取ることができるわけです。

例えば、前回の記事のircに書き込む出力を用いて、直接パイプでスクリプトに渡すのではなく、スクリプト内でファイルハンドルをオープンするように書き換えます。

後は、スクリプトをバックグラウンドで実行することで、ircにsyslogのログを出力できるわけです。

以下、スクリプトの変更例。

sub irc_write
{
my $input;
my $fifo_name = "/root/src/test.fifo";

while(<SOCKET>)
{
print $_;

if($_ =~ /End of NAMES list/)
{
open(HANDLE, $fifo_name);
while($input = <HANDLE>) 
{
if($input =~ /^$/)
{
print SOCKET "PRIVMSG $channel :\t\r\n";
sleep 5;
}
else
{
$input = &url_decode($input);
Jcode::convert(\$input,"jis");
print SOCKET "PRIVMSG $channel :$input\r\n";
sleep 5;
}
}
close(HANDLE);
print SOCKET "QUIT\r\n";
}
}
}

書き込みのサブルーチンはこんな感じです。