SYSLOG

Section: Linux Programmer's Manual (2)
Updated: 2008-06-20
Index JM Home Page roff page
 

名前

syslog, klogctl - カーネルのメッセージ・リング・バッファを読んだり消去したりする; console_loglevel の設定を行う  

書式

int syslog(int type, char *bufp, int len);
                /* glibc ではラッパー関数は提供されていない */

/* glibc のインタフェース */

#include <sys/klog.h> int klogctl(int type, char *bufp, int len);
 

説明

(syslogd(8) と話す) C ライブラリ関数の syslog() が必要な場合は、 syslog(3) を見ること。 この名前のシステム・コールはカーネルの printk() バッファを制御するものであり、glibc では klogctl() と呼ばれている。

type 引き数はこの関数の動作を決定する。

kernel/printk.c からの引用 :

/*
 * Commands to sys_syslog:
 *
 *      0 -- ログを閉じる。現在の実装では何もしない (NOP) 。
 *      1 -- ログを開く。現在の実装では何もしない (NOP) 。
 *      2 -- ログから読み出す。
 *      3 -- リング・バッファに残っているメッセージをすべて読み出す。
 *      4 -- リング・バッファに残っているメッセージをすべて読み出し、消去する。
 *      5 -- リングバッファを消去する。
 *      6 -- コンソールへの printk を無効にする。
 *      7 -- コンソールへの printk を有効にする。
 *      8 -- コンソールに表示されるメッセージのレベルを設定する。
 *      9 -- ログバッファの未読の文字数を返す。
 *      10 -- ログバッファのサイズを返す。
 */

非特権プロセスにはコマンド 3 と 10 のみが許可されている (コマンド 9 は Linux 2.4.10 で、コマンド 10 は Linux 2.6.6 で追加された)。  

カーネル・ログ・バッファ (kernel log buffer)

カーネルは長さ LOG_BUF_LEN の巡回式のバッファを持っており、 それにはカーネル関数の printk() の引き数として与えられた メッセージが (そのログレベルにかかわらず) 格納される。 初期のカーネルでは LOG_BUF_LEN の値は 4096 であった。 カーネル 1.3.54 からは 8192、 カーネル 2.1.113 からは 16384 になり、 カーネル 2.4.23 以降および 2.6 以降ではカーネルのコンパイル時に 値を設定できるようになっている。 最近のカーネルでは、コマンド 10 でバッファのサイズを問い合わせできる。

syslog(2,buf,len) の呼び出しはカーネル・ログ・バッファが空でなくなるまで待って、 最大 len バイトまで buf へと読み出し、読み込んだ バイト数を返す。ログから読まれたバイトはログ・バッファから消える: 情報は一度しか読むことができない。 これはユーザーのプログラムが /proc/kmsg を読んだ時にカーネルによって実行される関数でもある。

syslog(3,buf,len) の呼び出しはログ・バッファの最後の len バイトを (非破壊的に)読み出す、しかし、直近の「リング・バッファ消去」命令 (この命令はバッファを消去するわけではない) 以降にバッファに書き込まれた情報しか読み出せない。 返り値は読み込んだバイト数である。

syslog(4,buf,len) 呼び出しは「リング・バッファ消去」命令も実行する以外は 機能 3 と完全に同じである。

syslog(5,dummy,dummy) 呼び出しは「リング・バッファ消去」命令のみを実行する (呼び出しの書式で、 buflen が "dummy" と記載されている場合、その引き数の値が無視されることを表す)。

syslog(6,dummy,dummy) 呼び出しはコンソールのログレベルを最小に設定し、 コンソールにメッセージが表示されないようにする。

syslog(7,dummy,dummy) 呼び出しはコンソールのログレベルをデフォルトに設定し、 コンソールにメッセージが表示されるようにする。

syslog(8,dummy,level) 呼び出しはコンソールのログレベルを level に設定する。 level は 1 以上 8 以下の整数でなければならない。 詳細は ログレベル (loglevel) の節を参照のこと。

syslog(9,dummy,dummy) 呼び出しはカーネル・ログバッファにある現在読み出し可能なバイト数を返す。

syslog(10,dummy,dummy) 呼び出しはカーネル・ログバッファの総量を返す。  

ログレベル (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,dummy) 呼び出しで 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>"  /* デバッグレベルの情報        */
 

返り値

type が 2, 3, 4 の場合、成功すると syslog() は読み出したバイト数を返す。 type が 9 の場合、 カーネル・ログバッファにある現在読み出し可能なバイト数を返す。 type が 10 の場合、 カーネル・ログバッファの総量を返す。 type がそれ以外の値の場合、成功すると 0 が返される。

エラーの場合は、-1 が返り、 errno にエラーを示す値が設定される。  

エラー

EINVAL
不正な引き数 (具体的には、 type が正しくない、もしくは type が 2, 3, 4 の場合に buf が NULL か len が 0 未満である、もしくは type が 8 の場合に level が 1 以上 8 以下の範囲に入っていない)。
EPERM
十分な権限を持たないプロセス (正確には CAP_SYS_ADMIN ケーパビリティを持たないプロセス) が console_loglevelを変更しようとしたか、 カーネル・メッセージ・リングを消去しようとした。
ERESTARTSYS
システム・コールがシグナルによって割り込まれ、何も読み出せなかった。 (トレース中にしか発生することはない)
ENOSYS
カーネルの設定オプション CONFIG_PRINTK を無効にしてカーネルがコンパイルされているため、 syslog() システムコールが利用できない。
 

準拠

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

注意

かなり初期の頃から、同じ名前を持つシステム・コールと ライブラリ・ルーチンが全く異なる代物であるのは不幸なことだと 気付かれていた。 libc4 と libc5 ではこのコールの番号は SYS_klog と定義されていた。 glibc2.0 でこのシステムコールは klogctl() という名前に改められた。  

関連項目

syslog(3)


 

Index

名前
書式
説明
カーネル・ログ・バッファ (kernel log buffer)
ログレベル (loglevel)
返り値
エラー
準拠
注意
関連項目

This document was created by man2html, using the manual pages.
Time: 03:26:57 GMT, April 25, 2010