syslog に関するインストールメモ(2003/03/06) 
 

syslogとは

UNIXシステムでは、OSや各種アプリケーションで不具合/メッセージ等を一元管理して出力する仕組みです。

syslogに出力される代表的な種類としては、以下の物が考えられます。

  ・OSの動作についてのメッセージ

  ・ネットワーク系の動作についてのメッセージ

  ・sendmail, cron 等による各種アプリケーションの動作についてのメッセージ

  ・自前のアプリケーションの動作についてのメッセージ

また syslog の機能には、他のホストから出力される syslog メッセージを集中管理する機能もあり、ネットワーク内で一元管理する・ルーターのログを syslog に出力させる等の使用方法が考えられます。

「syslog の設定」について、@IT : syslogdの設定をマスターしよう を参照をこと

「syslog を理解する」については、hirp-island を参照のこと

syslogの仕組み

1.syslog は、/etc/syslog.conf に書かれた内容で、ログを各ディレクトリ・ファイルにそのメッセージを出力します。/etc/syslog.conf の設定内容は、以下の通り。

ファシリティ.監視レベル[;...]   アクションフィールド

2.各ファシリティには、それぞれの意味があります。ちなみに一般ユーザが syslog を使用する場合のファシリティは、通常「local0...local7」を使用します。それ以外のファシリティの意味は以下の通りです。

kern       カーネルのメッセージ 
user      ユーザープロセスのメッセージ 
mail       メールシステムのメッセージ(sendmail) 
lpr         ラインプリンタシステムのメッセージ 
auth      認証システムのメッセージ(login, su, getty 等) 
daemon  デーモンのメッセージ(ftpd, routed, popd, named等) 
news     ニュースサブシステムのメッセージ 
cron      cron/at システムのメッセージ 
uucp     UUCPサブシステムのメッセージ 
mark     20秒ごとにメッセージを送りだすタイムスタンプ機能 
*          mark を除く全てのファシリティ 

3.監視レベルの意味は以下の通りです。

emerg   システムクラッシュ寸前などの緊急事態で、通常すべてのユーザーへ通知する
alert     システム・データベースの破壊のように、緊急に修正しなければならない状態 
crit       ハードウエアのデバイス・エラーのような致命的な状態
err       通常のエラー 
warning 警告メッセージ 
notice   エラーではないが、特別な方法で対処する必要のある状態
info      情報メッセージ 
debug    プログラムをデバッグする時に使用されるメッセージ
none     メッセージを送信しない 

4.アクションフィールド

/dev/condole            コンソールに出力
/var/adm/messages   ファイルに記録 
root,admin                 ユーザー root および admin に送信
                                しかし、これらのユーザーがログインしていない場合、メッセージは破棄される
@loghost.foobar.co.jp  コンピュータ loghost.foobar.co.jp の syslog デーモンに送信
*                              ログインしている全てのユーザーの端末に表示
|logfilter                    logfilter というプログラムに送信

ログサーバによるログの一元管理

ここまでで、syslog を使用しログを残すことを行ってきましたが、これが1台のマシンであれば管理は簡単に済むのですが、大抵のネットワークは、複数/数十台単位のサーバを対象とすることになり、これが管理者の頭の痛くなるところです。(1台1台を面倒見ないといけないので・・・)
 で前述の通り、syslog.conf の設定で actionに@ホスト名(あるいはIPアドレス)を入力すると、そのホストにログを転送することができます。ただし、ログを受け取るホスト側でも設定が必要です。ログサーバとしてホストを設定するには、syslogdに-rオプションを指定して起動します。

# /usr/sbin/syslogd -r

C言語から syslog を操作する

1.syslog 操作関数は、以下の通り。※ man から引用

#include <syslog.h>

void openlog(const char *ident, int logopt, int facility);
void syslog(int priority, const char *message, .../* argu-ments */);
void closelog(void);
int setlogmask(int maskpri);

2.実際の書き方(例です)でっす。

#include <syslog.h>

(void)openlog("アプリケーション名", LOG_PID, LOG_LOCAL7);
(void)setlogmask(LOG_UPTO(LOG_WARNING));
(void)syslog(LOG_WARNING, "メッセージ");
closelog();

3.例の内容を少し説明します。

アプリケーション名:
    syslogに出力するラベルを指定します

LOG_PID
    syslogのプロセス番号を指定します

LOG_LOCAL7
    一般ユーザのファシリティを指定する

LOG_WARNING
    監視レベル warning を指定します。

実際に出力されるメッセージ(例)
    Feb 25 06:04:36 hoge sendmail[11606]: warning:forward /home/hage/.forward: Group writable directory

4.ファシリティ/監視レベルの定義は /usr/include/sys/syslog.h に下記の様に書かれています。

/* Facility codes */
#define LOG_LOCAL0 (16<<3) /* reserved for local use */
#define LOG_LOCAL1 (17<<3) /* reserved for local use */
#define LOG_LOCAL2 (18<<3) /* reserved for local use */
#define LOG_LOCAL3 (19<<3) /* reserved for local use */
#define LOG_LOCAL4 (20<<3) /* reserved for local use */
#define LOG_LOCAL5 (21<<3) /* reserved for local use */
#define LOG_LOCAL6 (22<<3) /* reserved for local use */
#define LOG_LOCAL7 (23<<3) /* reserved for local use */

/* Priorities (these are ordered) */
#define LOG_EMERG 0 /* system is unusable */
#define LOG_ALERT 1 /* action must be taken immediately */
#define LOG_CRIT 2 /* critical conditions */
#define LOG_ERR 3 /* error conditions */
#define LOG_WARNING 4 /* warning conditions */
#define LOG_NOTICE 5 /* normal but signification condition */
#define LOG_INFO 6 /* informational */
#define LOG_DEBUG 7 /* debug-level messages */