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)
呼び出しは「リング・バッファ消去」命令のみを実行する
(呼び出しの書式で、
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 以下の範囲に入っていない)。
- 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