SYSLOG(2)

名前
syslog - カーネル(kernel)のメッセージ・リング・バッファーを読んだり 消去(clear)したりする; console_loglevel を設定する。

書式
#include <unistd.h>

#include <linux/unistd.h>

_syscall3(int, syslog, int, type, char *, bufp, int, len);

int syslog(int type, char *bufp, int len);

説明
これはたぶんあなたが興味を持っている関数ではないだろう。 C のライブラリ関数である syslog(3) を見ること。このページは裸のシステム・コール関数についてのみ 記述している。 type 引き数は syslogの動作を決定する。 kernel/printk.c からの引用 :
/*
 * Commands to sys_syslog:
 *
 *      0 -- Close the log.  Currently a NOP.
 *      1 -- Open the log. Currently a NOP.
 *      2 -- Read from the log.
 *      3 -- Read up to the last 4k of messages in the ring buffer.
 *      4 -- Read and clear last 4k of messages in the ring buffer
 *      5 -- Clear ring buffer.
 *      6 -- Disable printk's to console
 *      7 -- Enable printk's to console
 *      8 -- Set level of messages printed to console
 */
root でないプロセスには機能 3 のみが許可されている。 カーネル・ログ・バッファー(kernel log buffer)
カーネルは長さ LOG_BUF_LEN (4096, 1.3.54 からは 8192, 2.1.113 からは 16384) の巡回式のバッファーを持っており、 それにはカーネル関数の printk() の引き数として与えられた メッセージが(そのログレベル(loglevel)にかかわらず)格納される。 syslog (2,buf,len) の呼び出しはカーネル・ログ・バッファーが空でなくなるまで待って、 最大len バイトまで buf へと読み出し、読み込んだ バイト数を返す。ログから読まれたバイトはログ・バッファーから消える: 情報は一度しか読むことができない。 これはユーザーのプログラムが /proc/kmsg を読んだ時にカーネルによって実行される関数でもある。 syslog (3,buf,len) の呼び出しはログ・バッファーの最後の len バイトを (非破壊的に)読み出す、しかし最後の「リング・バッファー消去」命令 (これはバッファーを消去するわけでわない。) 以降にバッファーに書き込まれた以上に読み込むことはできない。 読み込んだバイト数を返す。 syslog (4,buf,len) 呼び出しは「リング・バッファー消去」命令も実行する以外は 完全に同じである。 syslog (5,dummy,idummy) 呼び出しは「リング・バッファー消去」命令のみを実行する。 ログレベル(loglevel)
カーネル・ルーチンの printk() はもしそれが console_loglevel 変数以下の loglevel を持つならば、コンソールにのみメッセージを 表示する。( console_loglevel は最初 DEFAULT_CONSOLE_LOGLEVEL (7)に設定されるが、起動時にカーネルの コマンド・ライン・オプションで debug が指定されたなら 10 に設定される、 カーネル・フォールトが発生した場合には 15に設定される。- 10 や 15 は 無意味で、8 に等しい。) この変数は syslog (8,dummy,value) 呼び出しによって(1-8 の範囲の値に)設定する。 type が 6 か 7 での syslog (type,dummy,idummy) 呼び出しは、console_loglevel をそれぞれ 1(カーネル・パニックのみ)か 7(デバッグ・メッセージ以外の全て)に設定する。 メッセージの各行は独立のログレベル(loglevel)を持つ。このログレベルは DEFAULT_MESSAGE_LOGLEVEL - 1 (6) を持つが、 行が 1-7 の範囲の数字 d で始まるならば、ログレベル d を持つ。 ログレベルの伝統的な意味は <linux/kernel.h> に以下のように定義されている:
#define KERN_EMERG    "<0>"  /* system is unusable               */
#define KERN_ALERT    "<1>"  /* action must be taken immediately */
#define KERN_CRIT     "<2>"  /* critical conditions              */
#define KERN_ERR      "<3>"  /* error conditions                 */
#define KERN_WARNING  "<4>"  /* warning conditions               */
#define KERN_NOTICE   "<5>"  /* normal but significant condition */
#define KERN_INFO     "<6>"  /* informational                    */
#define KERN_DEBUG    "<7>"  /* debug-level messages             */

返り値
エラーの場合は -1 が返され、errno が設定される。その他の場合、 type が 2, 3, 4 ならば読み込んだバイト数を、そうでなれば 0 を返す。

エラー

EPERM
    root の権利を持たないプロセスが console_loglevelを変更しようとしたか、 カーネル・メッセージ・リングを消去しようとした。

EINVAL
    パラメータの間違い。

ERESTARTSYS
    何も読まないうちにシグナルによってシステム・コールが割り込まれた。

準拠
このシステム・コールは Linux 特有であり、移植を意図したプログラムでは 使用してはいけない。

関連項目
syslog(3)