アプリケーションがログを保存しておきたい場合、syslog APIというのが用意されており、これを使えばsyslogd経由でログを保存することができる。syslog APIにはopenlog(), syslog(), closelog()などがある。syslog()関数で送られたメッセージはsyslogdの設定に従ってファイルなどに書き込まれる。
syslogdの設定は/etc/syslog.confに記述する。1行が1エントリになり1エントリはセレクターとアクションで構成される。セレクターとアクションはスペースかタブで区切られる。セレクターはファシリティとプライオリティで構成され、ピリオドで区切られる。セレクターに適合したメッセージはそのアクションに従ってファイルなどに出力される。
ファシリティ
syslogを使ってログを残したいアプリケーションはopenlog()を使う際に、ファシリティを指定する。ファシリティの種類はあらかじめ決められており、以下のようなものがある。
- authpriv : セキュリティや認証
- cron : cronとat
- daemon : ここに挙げられたファシリティ以外のデーモン用
- ftp : ftp関係
- kern : カーネルメッセージ用。klogdから来る。
- lpr : ラインプリンタ用
- mail : メール関係
- mark : syslogで内部的に使われるもの
- news : USENET news用
- syslog : syslogが内部的に生成するためのもの
- user : 一般的なユーザレベルのもの
- uucp : uucp用
- local0 から local7 : ローカルで使うために予約されている
プライオリティ
アプリケーションはsyslog()を使う際に指定する。いかのようなものがあり、下に行くほどプライオリティが高くなる。つまりより重要なメッセージになる。
- debug
- info
- notice
- warning, warn
- err, error
- crit
- alert
- emerg, panic
プライオリティ指定はそのプライオリティ以上のものすべてが対象になるが、= をつけるとそのプライオリティのみに限定することができる。
ファシリティは , で区切り複数指定することができる。またすべてを意味する * を指定することもできる。セレクタ自体は ; で区切り複数指定することができる。
アクション
アクションにはセレクタで指定したログをどうやって保存や出力するかを指定する。以下のようなものがある。
- 普通のファイル : フルパスを指定する。ログはこのファイルに書き込まれる。フルパスの前に – を置くことができ、これを置くとファイルの同期をしないようになりパフォーマンスが向上するがデータを失う可能性も生じる。よってあまり重要でないものにはこれを使うといいのかもしれない。
- 名前つきパイプ : 省略
- ターミナルまたはコンソール : 省略
- リモートマシン : ログを他のマシンに送ることができる。これにより複数マシンのログを1つのマシンで一括管理できるようになる。リモートマシンを指定するにはフルパスの前に hostname@ を置く。
- ユーザ : ユーザ名を , で区切って指定すると、それらのユーザがログインしている場合に送られる。
- ログインしているすべてのユーザ : * を指定すると、ログインしているすべてのユーザに送られる。
サンプルプログラム
以下のプログラムを作ってコンパイルする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <syslog.h> #include <stdio.h> int main(int argc, char** argv) { if ( argc < 3 ) { fprintf(stderr, "logthrow <level> <message>\n"); return -1; } openlog("logtester", 0, LOG_USER); syslog(atoi(argv[1]), argv[2]); closelog(); return 0; } |
$ gcc logthrow.c -o logthrow
logthrow.c: In function ‘main’:
logthrow.c:13: warning: format not a string literal and no format arguments
$ ./logthrow 5 mylog
$
最初の引数は以下の定義を参考に指定する。
1 2 3 4 5 6 7 8 |
#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 significant condition */ #define LOG_INFO 6 /* informational */ #define LOG_DEBUG 7 /* debug-level messages */ |
このプログラムを実行すると実際にログが書き込まれるので、/etc/syslog.confの設定を見ながら、tail -f などでファイルを監視して、ログの出力を調べることができる。