syslog

[戻る]

概要

daemonプロセスを作るとき、何らかのメッセージをオペレータに伝える方法としてsyslogを使う。
これはsyslogdが管理していて、/etc/syslog.confでログの取り方を規定する。

ログのオープン

syslogを使う前に識別とデフォルトの設定を行う。書式は以下の通り。

#include <syslog.h>

void openlog(char *ident, int logout, int facility);
identは識別。オープン後ログにはこれが識別情報として付加される。
logoutはオプション。よく使うのは、以下のもの。オプションは|で繋いで、複数同時に指定が可能。
LOG_PID
ログにプロセスIDが付加される。
LOG_CONS
syslogdへメッセージを送れない場合、コンソールに出力する。
facilityは/etc/syslog.confと組合せて、異なるfacilityからのメッセージを別々に扱える。通常はLOG_USERにしておく。
ログのオープンは特に行う必要はない。

ログの記録

ログを記録するにはsyslogを使う。書式は以下の通り。

void syslog(int priority, char *logstring, ...);
priorityは以下の順番で優先度、緊急度が高い。 これは、/etc/syslog.confの記述とも関係があり、/etc/syslog.confにerrと書かれていれば、erre以上、つまりemerg, alert, crit, errが発生した場合に記録される。
また、priorityにはopenlogのlogoputとfacilityで指定するもと同じものを|で繋いで指定することができる。
logstring以降に記録するメッセージを書くが、これはprintfなどと同様の書式。ただし、%mという特殊なフォーマットがあって、これはerrorの値に対応したエラーメッセージ文字列(strerror)に置き換えられる。これは値を渡す必要はない。

ログのクローズ

ログのクローズはsyslogdとのソケットを開放する。書式は以下の通り。

void closelog(void);

デバッグ用フロントエンド

デバッグ時まで本当のログに記録されるのは問題があるので、デバッグ用フロントエンドを作ってみた。これは「詳解UNIXプログラミング」に載っていたものをベースに作成した。もとのは、もう少し複雑なことをしている。
使い方はopenlogの代わりにlog_open、syslogの代わりにlog_sys、closelogの代わりにlog_closeと記述する。書式はもとと同じ。
グローバルな変数にint debugを用意しておき、これが真(!0)のとき、ログに記録する代わりに標準エラー出力にメッセージを出力する。debugが偽(0)のとき、通常のsyslogと同じ動作をする。
ソースは以下。


Copyright © 1998 by Jun Takahashi