#!/usr/bin/php -q <?php echo udp_syslog("172.16.0.20", LOG_INFO, "うんこー!"); function udp_syslog($server, $severity, $text) { $pri = LOG_LOCAL0 | $severity; // PRI $date = date("c", time()); // TIMESTAMP $host = php_uname('n'); // HOSTNAME $app = "UNKO_APP"; // APP-NAME $pid = getmypid(); // PROCID $mid = mt_rand(); // MSGID $bom = "\xEF\xBB\xBF"; $data = "<$pri>1 $date $host $app $pid $mid [unko] $bom$text"; $size = strlen($data); $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_sendto($socket, $data, $size, 0, $server, 514); socket_close($socket); return $data; }
- RFC 5424 - The Syslog Protocol 日本語訳
- 【図解】syslogプロトコル再入門 ~フォーマット(BSD/IETF形式),Facility/Severity一覧,Ciscoの設定~ | SEの道標
SYSLOGのフォーマット
syslogのフォーマットはBSD形式とIEFT形式とがあり、BSD形式は簡単でIEFT形式はちょっと入り組んでいる。
IEFT形式はRFC-5424に定義されてる。
だいたいこのようなフォーマットになっている
(MSGIDとMSGの間に STRUCTURED-DATA があるけど絵では省略)
これを UDP 514 でシスログサーバに投げてやればよい
PRI
< > で囲われた数値。 Facility(ファシリティ)とSeverity(重大度)を掛けたり足したりしたもの。
PRI = Facility*8 + Severity
Facility(ファシリティ)
0 | kern | カーネル | 6 | lpr | プリンタ |
---|---|---|---|---|---|
1 | user | ユーザー | 7 | news | ニュース |
2 | メール | 8 | uucp | UUCP | |
3 | daemon | デーモン | 9 | cron | クロン |
4 | auth | 認証 | 10 | authpriv | 認証(プライベート) |
5 | syslog | syslog | 11 | ftp | FTP |
16~23 | local0〜7 | 好きに使っていい |
PHPで定義されてるファシリティ(LOG_LOCAL0とか)はあらかじめ8倍してあるので、あとはSeverityを足すだけでいい
Severity(重大度)
0 | emerg | 致命的 | 4 | warning | 警告 |
---|---|---|---|---|---|
1 | alert | 警戒 | 5 | notice | 通知 |
2 | crit | 危機的 | 6 | info | 情報 |
3 | err | エラー | 7 | debug | デバック |
VERSION
1固定。
TIMESTAMP
ISO 8601 形式で書く。省略不可。Tは省けない。小数点以下はマイクロ秒まで書ける。
HOSTNAME
送信元ホスト名を書く欄。 とはいっても何を書いてもいい
APP-NAME
送信元のアプリの名前。
PROCID
送信元PID。 実は数値じゃなくても可
MSGID
メッセージID。 メッセージが重複してるかのチェックに使われるはず。
STRUCTURED-DATA
カギ括弧 [ ] で囲まれた変数。 書かないことで省略できるけど、一応明示的に - を使うのが無難。
MSG
メッセージ本体。 UTF-8のときは、必ずBOMを付けること。