int syslog(int type, char *bufp, int len); /* glibc ではラッパー関数は提供されていない */ /* glibc のインタフェース */
#include <sys/klog.h> int klogctl(int type, char *bufp, int len);
type 引き数はこの関数の動作を決定する。
kernel/printk.c からの引用 :
/* * Commands to sys_syslog: * * 0 -- ログを閉じる。現在の実装では何もしない (NOP) 。 * 1 -- ログを開く。現在の実装では何もしない (NOP) 。 * 2 -- ログから読み出す。 * 3 -- リング・バッファに残っているメッセージをすべて読み出す。 * 4 -- リング・バッファに残っているメッセージをすべて読み出し、消去する。 * 5 -- リングバッファを消去する。 * 6 -- コンソールへの printk 群を無効にする。 * 7 -- コンソールへの printk 群を有効にする。 * 8 -- コンソールに表示されるメッセージのレベルを設定する。 * 9 -- ログバッファの未読の文字数を返す。 */
root 権限のないプロセスには機能 3 のみが許可されている。 (機能 9 は Linux 2.4.10 で追加された)
カーネル・ログ・バッファ (kernel log buffer)
カーネルは長さ LOG_BUF_LEN (4096, 1.3.54 からは 8192, 2.1.113 からは 16384,
最近のカーネルではコンパイル時に長さを設定可能) の巡回式のバッファを持っており、
それにはカーネル関数の
printk()
の引き数として与えられた
メッセージが (そのログレベルにかかわらず) 格納される。
syslog() (2,buf,len) の呼び出しはカーネル・ログ・バッファが空でなくなるまで待って、 最大 len バイトまで buf へと読み出し、読み込んだ バイト数を返す。ログから読まれたバイトはログ・バッファから消える: 情報は一度しか読むことができない。 これはユーザーのプログラムが /proc/kmsg を読んだ時にカーネルによって実行される関数でもある。
syslog() (3,buf,len) の呼び出しはログ・バッファの最後の len バイトを (非破壊的に)読み出す、しかし、直近の「リング・バッファ消去」命令 (この命令はバッファを消去するわけではない) 以降にバッファに書き込まれた情報しか読み出せない。 返り値は読み込んだバイト数である。
syslog() (4,buf,len) 呼び出しは「リング・バッファ消去」命令も実行する以外は 機能 3 と完全に同じである。
syslog() (5,dummy,idummy) 呼び出しは「リング・バッファ消去」命令のみを実行する。
ログレベル (loglevel)
カーネル・ルーチンの
printk()
は、ログレベルが
console_loglevel
変数より小さいときにのみ、コンソールにメッセージを表示する。
(console_loglevel
は最初 DEFAULT_CONSOLE_LOGLEVEL (7)に設定されるが、起動時にカーネルの
コマンド・ライン・オプションで debug が指定されている場合は 10 に
設定される、カーネル・フォールトが発生した場合には 15 に設定される。
但し、10 や 15 という数字に意味はなく、8 と同等である。)
この変数は
syslog()
(8,dummy,value)
呼び出しによって設定され、値の範囲は 1-8 である。
syslog()
(type,dummy,idummy)
呼び出しで type が 6 もしくは 7 の場合、
console_loglevel は 1 (カーネル・パニックのみ)、
7 (デバッグ・メッセージ以外の全て) にそれぞれ設定される。
メッセージの各行はそれぞれにログレベルを持つ。このログレベルは DEFAULT_MESSAGE_LOGLEVEL - 1 (6) であるが、 <d> (d は 1-7 の範囲の数字) で始まる行のログレベルは d である。 ログレベルの慣習的な意味は <linux/kernel.h> に以下のように定義されている:
#define KERN_EMERG "<0>" /* システムが使用不能 */ #define KERN_ALERT "<1>" /* 直ちに対処が必要 */ #define KERN_CRIT "<2>" /* 致命的な状態 */ #define KERN_ERR "<3>" /* エラー状態 */ #define KERN_WARNING "<4>" /* 警告状態 */ #define KERN_NOTICE "<5>" /* 通常状態だが大事な情報 */ #define KERN_INFO "<6>" /* 通知 */ #define KERN_DEBUG "<7>" /* デバッグレベルの情報 */