ファイヤープロジェクト
ロギング
2003-07-20T15:13+09:00   matsu
syslog関数によるロギングについて
ロギングにはsyslogを使用する.syslogのパラメータにはプライオリティレベルとログファシリティを指定する.この辺は/etc/syslog.confを設定する時と同様の考え方ができる.
kern.*                          /var/log/kern.log
kern.crit                       /var/log/kern-crit.log
mail.*                          /var/log/mail.log
user.*                          -/var/log/user.log
これはsyslog.confの設定例の一部である.各行は
ログファシリティ.プライオリティレベル    出力先ファイル
という構成である.*はすべてのファシリティやプライオリティレベルを意味する.また,出力先ファイルの前に-があると,ログ出力はバッファリングされる.
#include <syslog.h>

int main()
{
  syslog(LOG_INFO,"LOG_INFO message\n");
  syslog(LOG_USER,"LOG_USER message\n");

  exit(0);
}
実行すると以下のようになる(実行ファイル名はlog).
$./log
Message from syslogd@loki at Mon Nov 11 23:53:25 2002 ...
loki last message repeated 4 times
# tail -n1 /var/log/messages
Message from syslogd@loki at Mon Nov 11 23:55:41 2002 ...
loki log: LOG_USER message 
LOG_USERの方のメッセージは実行(仮想)端末に表示された.これはすぐには表示されない場合もある.待ち切れずに何度も実行すると
Message from syslogd@loki at Mon Nov 11 23:54:27 2002 ...
loki last message repeated 2 times
などと端末に表示される.これは2回に一回表示されるとは限らないようだ.これは,私がsyslog.confでログファシリティuserのログ出力をバッファリングするように設定したためだと考えられる.LOG_INFOの方のメッセージは/var/log/messagesに毎回出力される.ただし,以上の動作は環境の/etc/syslog.confに依存する(たぶん).
openlog関数を使用するとsyslog関数の設定ができる.そしてログといえばログマスク.LOG_MASKで指定したプライオリティのログマスクが,そしてLOG_UPTOで指定したプライオリティ以上のログマスクが得られる.ログマスクはsetlogmaskで設定できる.
#include <syslog.h>

int main()
{
  /* ログメッセージの形式の指定
     ログの頭にUser Program log2と表示される.
     LOG_PIDでログにPIDが付く.
     LOG_ODELAYで始めてsyslogが呼び出されるときにログファシリティをオープンする.
     syslogのデフォルトのファシリティをLOG_USERとする.*/
  openlog("User Program log2",LOG_PID | LOG_ODELAY , LOG_USER);

  /* openlogのチェック */
  syslog(LOG_INFO,"message1\n");

  /* LOG_MASK(LOG_INFO)でLOG_INFOのログマスクを得る. 
     setlogmaskでログをマスキング. */
  setlogmask(LOG_MASK(LOG_INFO));
  /* LOG_INFOではないので出力されない */
  syslog(LOG_NOTICE,"message2 LOG_NOTICE\n");
  /* LOG_INFOなので出力される */
  syslog(LOG_INFO,"message2 LOG_INFO\n");
  /* LOG_INFOではないので出力されない */
  syslog(LOG_DEBUG,"message2 LOG_DEBUG\n");

  /* LOG_UPTO(LOG_INFO)でLOG_INFO以上のログマスクを得る.
     setlogmaskでログをマスキング. */
  setlogmask(LOG_UPTO(LOG_INFO));
  /* LOG_INFO以上なので出力される */
  syslog(LOG_NOTICE,"message3 LOG_NOTICE\n");
  /* LOG_INFO以上なので出力される */
  syslog(LOG_INFO,"message3 LOG_INFO\n");
  /* LOG_INFO以上ではないので出力されない */
  syslog(LOG_DEBUG,"message3 LOG_DEBUG\n");

  exit(0);
}
以下/etc/log/message.hogeはホスト名.
Nov 12 18:13:02 hoge User Program log2[896]: message1 
Nov 12 18:13:02 hoge User Program log2[896]: message2 LOG_INFO 
Nov 12 18:13:02 hoge User Program log2[896]: message3 LOG_NOTICE 
Nov 12 18:13:02 hoge User Program log2[896]: message3 LOG_INFO 
matsu(C)
Since 2002
Mail to matsu