syslog
に関するインストールメモ(2003/03/06)
UNIXシステムでは、OSや各種アプリケーションで不具合/メッセージ等を一元管理して出力する仕組みです。
syslogに出力される代表的な種類としては、以下の物が考えられます。
・OSの動作についてのメッセージ
・ネットワーク系の動作についてのメッセージ
・sendmail, cron 等による各種アプリケーションの動作についてのメッセージ
・自前のアプリケーションの動作についてのメッセージ
また syslog の機能には、他のホストから出力される syslog メッセージを集中管理する機能もあり、ネットワーク内で一元管理する・ルーターのログを syslog に出力させる等の使用方法が考えられます。
「syslog の設定」について、@IT : syslogdの設定をマスターしよう を参照をこと
「syslog を理解する」については、hirp-island を参照のこと
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
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 directory4.ファシリティ/監視レベルの定義は /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 */