Windowsでのsyslog

定数名 Linux Windows
LOG_EMERG 0 1
LOG_ALERT 1 1
LOG_CRIT 2 1
LOG_ERR 3 4
LOG_WARNING 4 5
LOG_NOTICE 5 6
LOG_INFO 6 6
LOG_DEBUG 7 6

defineされている値が違う。
Windowsではイベントログでsyslogがエミュレートされる。
PHP マニュアル - syslog

<?php
syslog(LOG_EMERG, 'emerg');
syslog(LOG_ALERT, 'alert');
syslog(LOG_CRIT, 'crit');
syslog(LOG_ERR, 'err');
syslog(LOG_WARNING, 'warning');
syslog(LOG_NOTICE, 'notice');
syslog(LOG_INFO, 'info');
syslog(LOG_DEBUG, 'debug');
?>

とすると、[スタート]->[コントロールパネル]->[管理ツール]->[イベントビューア]のアプリケーションのログを見るとズラズラ記録されている。


PHPソ−スのwin32/wsyslog.cのvoid syslog(int priority, const char *message, ...)を見ると

switch (priority) {			/* translate UNIX type into NT type */
    case LOG_ALERT:
        etype = EVENTLOG_ERROR_TYPE;
        evid = PHP_SYSLOG_ERROR_TYPE;
        break;
    case LOG_INFO:
        etype = EVENTLOG_INFORMATION_TYPE;
        evid = PHP_SYSLOG_INFO_TYPE;
        break;
    default:
        etype = EVENTLOG_WARNING_TYPE;
        evid = PHP_SYSLOG_WARNING_TYPE;
}

Windowsのイベントログは「エラー」「警告」「情報」の3種類しかないっぽい。
priorityを弄っても「警告」として処理されるようである。

なぜこんなことを書いたかというと、昨日のエントリ Ethna CacheManager キャッシュが見つからないときとかを書いてて、昔、開発環境がオールWindowsだった時に、Ethnaで'log_level'=>'notice'としていたら、Ethna_Loggerはこの定数をログレベルのマスクに使用してるため、notice以上指定なのにdebug用のSQLがズラズラ記録されて、BoBpp氏と一緒に困ってたのを思い出したから。