Pythonのsyslogモジュールを使ってsyslogd経由でログ出力してみる。

手順としては、

  1. syslogモジュールをimport
  2. syslog.openlog()でプログラム名,Option,Facilityを設定し、syslogdに接続開始
  3. syslog.syslog()でログレベルを設定してメッセージを出力
  4. syslog.closelog()でsyslogdとの接続終了

python-2.6.4のコードを見ると、


static PyObject *
syslog_openlog(PyObject * self, PyObject * args)
{
long logopt = 0;
long facility = LOG_USER;
PyObject *new_S_ident_o;

if (!PyArg_ParseTuple(args,
"S|ll;ident string [, logoption [, facility]]",
&new_S_ident_o, &logopt, &facility))
return NULL;

/* This is needed because openlog() does NOT make a copy
* and syslog() later uses it.. cannot trash it.
*/
Py_XDECREF(S_ident_o);
S_ident_o = new_S_ident_o;
Py_INCREF(S_ident_o);

openlog(PyString_AsString(S_ident_o), logopt, facility);

Py_INCREF(Py_None);
return Py_None;
}

となっていて、内部的にはopenlog()を呼び出している。なるほどね。
実際に書いてみるとこんな感じ。

$ python
>>> import syslog
>>> syslog.openlog('testprog',syslog.LOG_PID|syslog.LOG_PERROR,syslog.LOG_SYSLOG)
>>> syslog.syslog(syslog.LOG_ALERT,'TEST MESSAGE')
testprog[35777]: TEST MESSAGE <---LOG_PERRORを指定しているので標準エラー出力にもメッセージ出力される
>>> syslog.closelog()
>>> ^D
$ tail -n 1 /var/log/system-log
Feb 6 12:40:49 yukikaze testprog[35777]: TEST MESSAGE

Optionの設定値は以下の通り(複数指定時は論理和をとる)

  • syslog.LOG_CONS エラーがあれば、システムロガーに送る一方でシステムコンソールにも直接書く
  • syslog.LOG_NDELAY ログ記録用プログラムとの接続を即座に開始する (通常は、最初のメッセージが記録される時に接続を開く)
  • syslog.LOG_NOWAIT メッセージを記録する際に生成される子プロセスの終了を待たない
  • syslog.LOG_ODELAY syslog() が呼ばれるまで接続の開始を行わない。
  • syslog.LOG_PERROR stderr にも出力する
  • syslog.LOG_PID 個々のメッセージに PID を含める

Facilityの設定値は以下の通り

  • syslog.LOG_AUTH セキュリティ/認証 メッセージ (非推奨。代わりに LOG_AUTHPRIV を使用すること)
  • syslog.LOG_AUTHPRIV セキュリティ/認証 メッセージ (プライベート)
  • syslog.LOG_CRON クロックデーモン (cron と at)
  • syslog.LOG_DAEMON 特定の facility 値を持たないシステムデーモン
  • syslog.LOG_FTP ftp デーモン
  • syslog.LOG_KERN カーネルメッセージ (ユーザプロセスから生成することはできない)
  • syslog.LOG_LOCAL0-7 ローカルな使用のためにリザーブされている
  • syslog.LOG_LPR ラインプリンタ・サブシステム
  • syslog.LOG_MAIL メール・サブシステム
  • syslog.LOG_NEWS USENET ニュース・サブシステム
  • syslog.LOG_SYSLOG syslogd(8) によって内部的に発行されるメッセージ
  • syslog.LOG_USER デフォルト値。一般的なユーザレベルメッセージ
  • syslog.LOG_UUCP UUCPサブシステム

ログレベルは以下の通り

  • syslog.LOG_EMERG システムが使用不可
  • syslog.LOG_ALERT 直ちに行動を起こさなければならない
  • syslog.LOG_CRIT 危険な状態
  • syslog.LOG_ERR エラーの状態
  • syslog.LOG_WARNING ワーニングの状態
  • syslog.LOG_NOTICE 通常だが重要な状態
  • syslog.LOG_INFO デフォルト値。インフォメーションメッセージ
  • syslog.LOG_DEBUG デバッグレベルのメッセージ