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)
呼び出しは「リング・バッファ消去」命令のみを実行する
(呼び出しの書式で、
buf や
len が "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_ADMIN も CAP_SYSLOG
も持たないプロセス)
が console_loglevel
を変更しようとしたか、
カーネル・メッセージ・リングを消去しようとした。
- ERESTARTSYS
- システム・コールがシグナルによって割り込まれ、何も読み出せなかった。
(トレース中にしか発生することはない)
このシステム・コールは
Linux
特有であり、移植を意図したプログラムでは
使用してはいけない。
かなり初期の頃から、同じ名前を持つシステムコールとライブラリルーチンが
全く異なる別物であるのは不幸なことだと指摘されてきた。
関連項目¶
syslog(3),
capabilities(7)
この文書について¶
この man ページは Linux
man-pages
プロジェクトのリリース
3.41 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man-pages/
に書かれている。