よろしくお願いします。
環境:LINUX CentOS 5.3
syslogをrsyslogに変更する事で、ログの吐出時点で外部プログラムを実行することは可能でしょうか?
また、可能であればログの内容を実行プログラムに渡すことは出来ますでしょうか?
実装計画としては、アパッチのアクセスログをシスログ経由で転送し、ログの内容によって登録処理(キューなどへ)をさせたいと思います。
アクセスに対してリアルタイムで登録させたいのでクーロンでの実装は考えておりません。
解説もしくは参考URLをいただければ助かります。
※syslog-ngなどで実装可能であればそちらの情報もいただけると助かります。
アパッチのアクセスログをシスログ経由で転送し、
まず、この点ですが、エラーログに関しては Apache 自体で syslog へ送る事が出来ますが、他のログは、apache 自体がファイルへ書き出してしまいます。
ErrorLog のドキュメント:
アクセスログの出力に使われる CustomLog のドキュメント:
mod_log_config - Apache HTTP Server
なので、まず、Apache 自体が吐き出すファイルを syslog へ送るための仕組が必要です。
下記のページでは、短い Perl のスクリプトを用意して、CustomLog の出力先として、このスクリプトを実行させるようにし、スクリプト中で、syslog サーバへ送っています。
http://www.oreillynet.com/pub/a/sysadmin/2006/10/12/httpd-syslog...
また、もっと単純に logger コマンドを呼び出すようにする例もありました。
DSAS開発者の部屋:Apacheのアクセスログをsyslog経由で出力するためのモジュールを作りました
この方は、syslog へ送るためのモジュールを作っているみたいです。
... と、ここまでが前段階(^^;。
ログの内容によって登録処理(キューなどへ)をさせたいと思います。
既に TransFreeBSD さんが回答されているように、syslog-ng で外部プログラムに処理させる方法はありますし、同様の事は rsyslog でも出来ます。
Actions - rsyslog.conf rsyslog
上記ページの「Named Pipes」という節に書かれていて、「|」を使って名前付きパイプを指定し、名前付きパイプに関連付けられたプログラムに処理させる事が出来るようになっています。
名前付きパイプに処理させる方法は、下記のページの angel さんの回答が詳しいです。
syslog.confの設定でinsert,updateだけのログを取りたい
で、上記のページを見ると分かりますが、名前付きパイプを使って外部プログラムに処理挿せる方法は、syslog-ng や rsyslog じゃなくても出来ます。どんな syslog サーバでも出来るかは、ちょっと分かりませんが、古くから Linux で使われている syslog サーバでも、名前付きパイプは対応しています。
なので、実は前述の事は、rsyslog や syslog-ng によらず、多くの syslog サーバで実現可能です。
強いて言うと、先に紹介した rsyslog のマニュアルのページに「Shell Execute」という節があり、「^」で任意のプログラムが実行出来そうです。ただ、その解説文で「WARINING」という警告文があって、あまり推奨出来るものでは無さそうです。しかも、この Shell Execute で呼び出されたプログラムの標準入力に、ログの内容が送られてくるとは書いていないので、zun1188 さんの目的には合わない可能性があります。
ご回答ありがとうございます。ですが、今回はソフトウェア製品の購入は考えておりません。
syslog-ngで出来るようです。以下の「監視機能について」にあります。
http://neta.ywcafe.net/000589.html
注意点として、飛んできたログ毎にプロセスを立ち上げるんじゃなくて、一度立ち上げたら同じプロセスで随時渡すようです。なので、標準入力を待って、一行来たら処理する、というのをループさせています。
導入や設定などは以下
http://www.atmarkit.co.jp/fsecurity/rensai/unix_sec09/unix_sec01...
ご回答ありがとうございます。
>注意点として、飛んできたログ毎にプロセスを立ち上げるんじゃなくて、一度立ち上げたら同じプロセスで随時渡すようです。
そうなんですね。参考になります。
アパッチのアクセスログをシスログ経由で転送し、
まず、この点ですが、エラーログに関しては Apache 自体で syslog へ送る事が出来ますが、他のログは、apache 自体がファイルへ書き出してしまいます。
ErrorLog のドキュメント:
アクセスログの出力に使われる CustomLog のドキュメント:
mod_log_config - Apache HTTP Server
なので、まず、Apache 自体が吐き出すファイルを syslog へ送るための仕組が必要です。
下記のページでは、短い Perl のスクリプトを用意して、CustomLog の出力先として、このスクリプトを実行させるようにし、スクリプト中で、syslog サーバへ送っています。
http://www.oreillynet.com/pub/a/sysadmin/2006/10/12/httpd-syslog...
また、もっと単純に logger コマンドを呼び出すようにする例もありました。
DSAS開発者の部屋:Apacheのアクセスログをsyslog経由で出力するためのモジュールを作りました
この方は、syslog へ送るためのモジュールを作っているみたいです。
... と、ここまでが前段階(^^;。
ログの内容によって登録処理(キューなどへ)をさせたいと思います。
既に TransFreeBSD さんが回答されているように、syslog-ng で外部プログラムに処理させる方法はありますし、同様の事は rsyslog でも出来ます。
Actions - rsyslog.conf rsyslog
上記ページの「Named Pipes」という節に書かれていて、「|」を使って名前付きパイプを指定し、名前付きパイプに関連付けられたプログラムに処理させる事が出来るようになっています。
名前付きパイプに処理させる方法は、下記のページの angel さんの回答が詳しいです。
syslog.confの設定でinsert,updateだけのログを取りたい
で、上記のページを見ると分かりますが、名前付きパイプを使って外部プログラムに処理挿せる方法は、syslog-ng や rsyslog じゃなくても出来ます。どんな syslog サーバでも出来るかは、ちょっと分かりませんが、古くから Linux で使われている syslog サーバでも、名前付きパイプは対応しています。
なので、実は前述の事は、rsyslog や syslog-ng によらず、多くの syslog サーバで実現可能です。
強いて言うと、先に紹介した rsyslog のマニュアルのページに「Shell Execute」という節があり、「^」で任意のプログラムが実行出来そうです。ただ、その解説文で「WARINING」という警告文があって、あまり推奨出来るものでは無さそうです。しかも、この Shell Execute で呼び出されたプログラムの標準入力に、ログの内容が送られてくるとは書いていないので、zun1188 さんの目的には合わない可能性があります。
ご回答ありがとうございます。
おかげで実装できる見通しが立ちました。
名前つきパイプを利用しました。
正確なやり方ではないかもしれませんが、一応実装例を書いておきます。
①名前つきパイプを作成
mkfifo /var/log/test_pipo
②ログの吐き出し先を名前つきパイプに指定 rsyslog.conf
*.* /var/log/test_pipo
rsyslog 再起動
③処理させるプログラムを作成 今回はPHPで作ってみました。
$target = '/var/log/test_pipo';
$set = '/var/log/test';
$handle = fopen($target, "r");
for ($i = 1; $i <= 10; $i++) {
if ($handle) {
$buffer = fgets($handle,1024);
if($buffer !== false) {
echo $buffer;
}
}
}
fclose($handle);
④プログラムを起動
すると流れてくるログをエコーさせることが出来ました。
実際に利用する場合はループ処理を無限ループにしてバックグラウンドで走らせることになります。
もちろんエコーの部分はログに対しての処理に変更します。
勘違いしていたのは、ログが吐き出されるたびにプログラムを実行するのではなく、実行されているプログラムが名前つきパイプを通して取得できるということ。(ここは今でも曖昧ですが)
みなさんありがとうございました。
ご回答ありがとうございます。
おかげで実装できる見通しが立ちました。
名前つきパイプを利用しました。
正確なやり方ではないかもしれませんが、一応実装例を書いておきます。
①名前つきパイプを作成
mkfifo /var/log/test_pipo
②ログの吐き出し先を名前つきパイプに指定 rsyslog.conf
*.* /var/log/test_pipo
rsyslog 再起動
③処理させるプログラムを作成 今回はPHPで作ってみました。
$target = '/var/log/test_pipo';
$set = '/var/log/test';
$handle = fopen($target, "r");
for ($i = 1; $i <= 10; $i++) {
if ($handle) {
$buffer = fgets($handle,1024);
if($buffer !== false) {
echo $buffer;
}
}
}
fclose($handle);
④プログラムを起動
すると流れてくるログをエコーさせることが出来ました。
実際に利用する場合はループ処理を無限ループにしてバックグラウンドで走らせることになります。
もちろんエコーの部分はログに対しての処理に変更します。
勘違いしていたのは、ログが吐き出されるたびにプログラムを実行するのではなく、実行されているプログラムが名前つきパイプを通して取得できるということ。(ここは今でも曖昧ですが)
みなさんありがとうございました。