daemonプロセスを作るとき、何らかのメッセージをオペレータに伝える方法としてsyslogを使う。
これはsyslogdが管理していて、/etc/syslog.confでログの取り方を規定する。
syslogを使う前に識別とデフォルトの設定を行う。書式は以下の通り。
identは識別。オープン後ログにはこれが識別情報として付加される。#include <syslog.h> void openlog(char *ident, int logout, int facility);
facilityは/etc/syslog.confと組合せて、異なるfacilityからのメッセージを別々に扱える。通常はLOG_USERにしておく。
- LOG_PID
- ログにプロセスIDが付加される。
- LOG_CONS
- syslogdへメッセージを送れない場合、コンソールに出力する。
ログを記録するにはsyslogを使う。書式は以下の通り。
priorityは以下の順番で優先度、緊急度が高い。void syslog(int priority, char *logstring, ...);
ログのクローズはsyslogdとのソケットを開放する。書式は以下の通り。
void closelog(void);
デバッグ時まで本当のログに記録されるのは問題があるので、デバッグ用フロントエンドを作ってみた。これは「詳解UNIXプログラミング」に載っていたものをベースに作成した。もとのは、もう少し複雑なことをしている。
使い方はopenlogの代わりにlog_open、syslogの代わりにlog_sys、closelogの代わりにlog_closeと記述する。書式はもとと同じ。
グローバルな変数にint debugを用意しておき、これが真(!0)のとき、ログに記録する代わりに標準エラー出力にメッセージを出力する。debugが偽(0)のとき、通常のsyslogと同じ動作をする。
ソースは以下。