EN JA
SYSLOG(2)
SYSLOG(2) Linux Programmer's Manual SYSLOG(2)

名前

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 引き数はこの関数の動作を決定する。以下を指定できる。
 

0 --ログを閉じる。現在の実装では何もしない (NOP) 。
1 --ログを開く。現在の実装では何もしない (NOP) 。
2 --ログから読み出す。
3 --リング・バッファに残っているメッセージをすべて読み出す。
4 --リング・バッファに残っているメッセージをすべて読み出し、消去する。
5 --リングバッファを消去する。
6 --コンソールへの printk を無効にする。
7 --コンソールへの printk を有効にする。
8 --コンソールに表示されるメッセージのレベルを設定する。
9 --ログバッファの未読の文字数を返す。
10 --ログバッファのサイズを返す。
 
type 9 は Linux 2.4.10 で追加された。 type 10 は Linux 2.6.6 で追加された。
 
バージョン 2.6.37 より前の Linux カーネルでは、コマンド種別 3 と 10 だけが非特権プロセスに対して許可されている。 Linux 2.6.37 以降では、 /proc/sys/kernel/dmesg_restrict が値 0 の場合にコマンド種別 3 と 10 だけが非特権プロセスに対して許可される。 Linux 2.6.37 より前では、「特権を持つ (privileged)」とは呼び出し者が CAP_SYS_ADMIN ケーパビリティを持つことを意味する。 Linux 2.6.37 以降では、「特権を持つ」とは呼び出し者が CAP_SYS_ADMIN ケーパビリティか (新しい) CAP_SYSLOG ケーパビリティのいずれかを持つことを意味する (この目的で CAP_SYS_ADMIN ケーパビリティを使うのは今は非推奨である)。

カーネル・ログ・バッファ (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 以下の範囲に入っていない)。
ENOSYS
カーネルの設定オプション CONFIG_PRINTK を無効にしてカーネルがコンパイルされているため、 syslog() システムコールが利用できない。
EPERM
十分な権限を持たないプロセス (正確にはケーパビリティ CAP_SYS_ADMINCAP_SYSLOG も持たないプロセス) が console_loglevel を変更しようとしたか、カーネル・メッセージ・リングを消去しようとした。
ERESTARTSYS
システム・コールがシグナルによって割り込まれ、何も読み出せなかった。 (トレース中にしか発生することはない)

準拠

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

注意

かなり初期の頃から、同じ名前を持つシステムコールとライブラリルーチンが全く異なる別物であるのは不幸なことだと指摘されてきた。

関連項目

syslog(3), capabilities(7)

この文書について

この man ページは Linux man-pages プロジェクトのリリース 3.41 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
2012-05-05 Linux