揮発性のメモ2

知識をメモ書きしておく

PHPから、UDPでsyslogを投げる

#!/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;
}



SYSLOGのフォーマット

syslogのフォーマットはBSD形式とIEFT形式とがあり、BSD形式は簡単でIEFT形式はちょっと入り組んでいる。
IEFT形式はRFC-5424に定義されてる。

f:id:iww:20220406154829p:plain

だいたいこのようなフォーマットになっている
(MSGIDとMSGの間に STRUCTURED-DATA があるけど絵では省略)
これを UDP 514 でシスログサーバに投げてやればよい

PRI

< > で囲われた数値。 Facility(ファシリティ)とSeverity(重大度)を掛けたり足したりしたもの。

PRI = Facility*8 + Severity
Facility(ファシリティ)
0 kern カーネル 6 lpr プリンタ
1 user ユーザー 7 news ニュース
2 mail メール 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を付けること。