■あれこれ仕事関係の調べものをしていて、ふと、自分が使っているサーバー(Fedora)のシスログはrsyslogだということを思い出しました。あんまり意識しないものなんですが、rsyslogはTCPでリモートからのメッセージを受けられるし、メッセージサイズの制限もはずれて大きなものも受けられるようになっている。PCからのメッセージを受けられるようにしたらちょっと便利かもしれんと思い、作ることにしました。
最初はできあいのWindowsエージェントを探したのですが、ちょっと多機能すぎるのと、多機能なくせにシンプルなカスタムメッセージ送信には使えないということで断念しました。とりあえずtelnetクライアントを使ってポート514に接続して何か適当に送信するとまともな出力にはならないにしても何かしら出てくる。
LinuxにはloggerというコマンドがあってそれもTCPを使えるらしいのだけど、UDPを使ってもシスログにメッセージが出てこない。とりあえずwiresharkでキャプチャしてみるとプロトコルがRSHとなっていた。どうもよくわからないのだけど埒が明かないのでキャプチャしたパケットの内容をまねてtelnet端末から流し込むとログが出てくる。単純にソケットを開けてメッセージを流し込めばいいみたいだ。
syslogプロトコルの詳細はRFC3164でわかる。ただこのRFCはあくまでもsyslogプロトコルであってTCPで送信するときの実装には触れていない。そこはtelnetクライアントでのお試しでなんとなく。
メッセージの内容はメッセージの分類とプライオリティを示す数値を組み合わせたヘッダ部と、メッセージ本体部分から構成されている。ヘッダ部は'<(3桁の数値)>'という単純なもので、続いてメッセージ本体の文字列が続く。メッセージ本体はLF CRで終わり、メッセージ全体はLFで終わる? らしい。PHPだと3行で記述できる。
$dstRsyslg = fsockopen($server, 514, $errno, $errstr, 5); fwrite($dstRsyslg, $header.$body); fclose($dstRsyslg);
あとはヘッダの組み立てとか、メッセージボディの組み立てくらいは付け足す必要があるけれど、ずいぶんあっさりクライアントは作れる。Windows側では起動・停止スクリプトに組み込んで、rsyslogへ飛ばしてみようと思っています。