ログ管理
syslogとその周辺 応用編
back top next
■syslog について  ・・・C言語によるログの出力方法・・・

syslog は C 言語のインタフェースが用意されており、アプリケーションから簡単にログを出力することができます。なにかサービスをおこなうようなアプリケーションを作成したときには、できるだけ syslog にログを出すようにしましょう。

FreeBSD では、リスト5 に挙げる関数が用意されています。

  リスト5     syslogのための関数
#include 
#include 

void syslog(int priority, const char *message, ...);
void vsyslog(int priority, const char *message, va_list args);
void openlog(const char *ident, int logopt, int facility);
void closelog(void);
int setlogmask(int maskpri);

基本的な使い方としては、次のようになります。
  • openlog() でログを開く
  • syslog() でログを書き込む
  • closelog() で閉じる
vsyslog() は syslog() の引数が少々異なるものですが、printf() と同じように使うのなら syslog() で良いでしょう。

setlogmask() は出力するログレベルを制限するものです。デバッグ用のメッセージを出さないようにするくらいにしておいて、普段はログの振り分けは syslogd に任せるのが良いかと思います。

引数については facility や priority については 表2 に挙げていますので、他のものを紹介します。

● openlog()

  • ident
    syslog の TAG を指定します。アプリケーション名を入れるのが普通でしょう。


  • logopt
    ログに関するオプションを指定します。詳しくは 表4 に挙げます。
  表4     logopt引数一覧
動作
LOG_CONS syslogd(8) を経由できない場合、/dev/console に書き出します。
LOG_NDELAY 通常は実際にログが来るまで syslogd(8) と接続しませんが、このオプションを指定すると直ちに接続します。
LOG_PERROR syslog と同様に、標準エラー出力にも出力する。
LOG_PID 各メッセージに PID を付加する。

● setlogmask()
  • maskpri
    制限するログレベルを記述します。
    LOG_MASK(pri) では priority が pri のものだけを制限し、LOG_UPTO(toppri) では priority が toppri 以下のものをすべて制限します。


  • 返り値
    呼ぶ前に制限されていたログレベルが返ります。

簡単にログを出力してみるプログラムを書いてみました。リスト6 です。

  リスト6     syslog()の簡単なサンプル
#include <syslog.h>

int main()
{
  /*
   * newsyslog[PID]: logfile turned over (sample)
   * というログを user.notice で書いてみる
   */

  openlog("newsyslog", LOG_CONS | LOG_PID, LOG_USER);
  syslog(LOG_NOTICE, "logfile turned over (sample)");
  closelog();

  return 0;
}

実際に実行してみますと、リスト7 のようなログが/var/log/messages に出力されるのが確認できます。

  リスト7     リスト6の実行例
Nov 11 18:37:09 kei newsyslog[68621]: logfile turned over (sample)

Perl にも同様のライブラリとして Sys::Syslog というものがあるようです。

back top next
Copyright(C) 1995-2003 Infoscience Corporation. All rights reserved. 
※このページの内容は 『FreeBSD PRESS No.14 (2003 JANUARY) 毎日コミュニケーションズ刊』 に掲載されたものです。