Scroll to navigation

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) を参照のこと。

このページはカーネルの syslog() システムコールについて説明している。 syslog() システムコールはカーネルの printk() バッファーを制御するために使用される。 このシステムコールに対する glibc ラッパー関数は klogctl() と呼ばれている。

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

カーネルは長さ LOG_BUF_LEN の巡回式のバッファーを持っており、 それにはカーネル関数の printk() の引数として与えられた メッセージが (そのログレベルにかかわらず) 格納される。 初期のカーネルでは LOG_BUF_LEN の値は 4096 であった。 カーネル 1.3.54 からは 8192、 カーネル 2.1.113 からは 16384 になり、 カーネル 2.4.23 以降および 2.6 以降ではカーネル設定オプション (CONFIG_LOG_BUF_SHIFT、 デフォルト値はアーキテクチャー依存) で値を設定できるようになっている。 Linux 2.6.6 以降では、コマンド 10 (下記参照) でバッファーのサイズを問い合わせできる。

コマンド

type 引数はこの関数が行う動作を決定する。 以下のリストに示す値を type に指定できる。 シンボル名はカーネルソースで定義されているが、ユーザー空間には公開されていない。 したがって、数字を使うか、名前を自分で定義する必要がある。

ログをクローズする。現在のところ NOP である。
ログをオープンする。現在のところ NOP である。
ログを読み出す。 この呼び出しは、 カーネルログバッファーが空でなくなるまで待って、 最大 len バイトまで bufp が指すバッファーに読み込み、 読み込んだバイト数を返す。 ログから読まれたバイトはログバッファーから消える。 つまり、情報は一度しか読むことができない。 これはユーザーのプログラムが /proc/kmsg を読んだ時にカーネルによって実行される関数でもある。
リングバッファーに残っているメッセージをすべて読み出し、 bufp が指すバッファーに格納する。 この呼び出しログバッファーの最後の len バイトを (非破壊的に) 読み出すが、 最後の「リングバッファー消去」命令 (下記のコマンド 5 参照) 以降にバッファーに書き込まれた情報しか読み出せない。 返り値は読み込んだバイト数である。
リングバッファーに残っているメッセージをすべて読み出し、クリアする。 この呼び出しは type 3 と全く同じことを行い、追加で「リングバッファー消去」 ("clear ring buffer") コマンドも実行する。
「リングバッファー消去」 ( は無視される。
このコマンドは実際にリングバッファーをクリアするわけではなく、 コマンド 3 (SYSLOG_ACTION_READ_ALL) と 4 (SYSLOG_ACTION_READ_CLEAR で返す内容を決定するカーネルの管理変数を設定する。 このコマンドはコマンド 2 (SYSLOG_ACTION_READ) と 9 (SYSLOG_ACTION_SIZE_UNREAD) には影響を与えない。
このコマンドは console_loglevel の現在の値を保存し、それから console_loglevelminimum_console_loglevel に設定する。 これにより、コンソールにメッセージが出力されなくなる。 Linux 2.6.32 より前では、 このコマンドは console_loglevelminimum_console_loglevel に設定するだけであった。 下記の /proc/sys/kernel/printk の議論を参照。
引数 bufplen は無視される。
直前に SYSLOG_ACTION_CONSOLE_OFF コマンドがされた場合、 このコマンドは console_loglevel を前のコマンドが保存した値に戻す。 Linux 2.6.32 より前では、 このコマンドは単に console_logleveldefault_console_loglevel に設定するだけであった。 下記の /proc/sys/kernel/printk の議論を参照。
引数 bufplen は無視される。
console_loglevellen で指定された値に設定する。 len は 1 以上 8 以下の整数でなければならない。 カーネルにより、暗黙のうちに lenminimum_console_loglevel で指定される最小値が適用される。 詳細は「ログレベル」の節を参照のこと。 引数 bufp は無視される。
コマンド 2 (SYSLOG_ACTION_READ) でカーネルログバッファーから読み出せるバイト数を返す。 引数 bufplen は無視される。
カーネルログバッファーの全体のサイズを返す。 引数 bufplen は無視される。

コマンド種別 3 と 10 以外のコマンドは全て特権が必要である。 バージョン 2.6.37 より前の Linux カーネルでは、 コマンド種別 3 と 10 は非特権プロセスも呼び出すことができる。 Linux 2.6.37 以降では、/proc/sys/kernel/dmesg_restrict が値 0 の場合に限り、 非特権プロセスはこれらのコマンドを呼び出すことができる。 Linux 2.6.37 より前では、「特権を持つ (privileged)」とは呼び出し者が CAP_SYS_ADMIN ケーパビリティを持つことを意味する。 Linux 2.6.37 以降では、「特権を持つ」とは呼び出し者が CAP_SYS_ADMIN ケーパビリティか (新しい) CAP_SYSLOG ケーパビリティのいずれかを持つことを意味する (この目的で CAP_SYS_ADMIN ケーパビリティを使うのは今は非推奨である)。

/proc/sys/kernel/printk

/proc/sys/kernel/printk は書き込み可能なファイルで、 エラーメッセージのログ出力を行う際にカーネルの printk() の動作に影響を持つ 4 つの整数値が入っている。 4 つの値は以下のとおりである。

メッセージのログレベルがこの値よりも小さい場合のみ、メッセージだけがコンソールに出力される。 このフィールドのデフォルト値は DEFAULT_CONSOLE_LOGLEVEL (7) だが、 カーネルのコマンドラインに "quiet" という単語が含まれている場合は 4 に設定され、 "debug" という単語が含まれている場合は 10 に設定され、 カーネルフォールトが発生した場合には 15 に設定される (但し、10 や 15 という数字に意味はなく、8 と同等である)。 console_loglevel の値は type が 8 の syslog() の呼び出しによって設定でき、 設定できる値の範囲は 1–8 である。
この値は、明示的にログレベルが指定されていない printk() メッセージのログレベルとして使用される。 Linux 2.6.38 以前では、 このフィールドのデフォルト値は 4 (KERN_WARNING) にハードコードされていた。 Linux 2.6.39 以降では、 デフォルト値はカーネルの設定オプション CONFIG_DEFAULT_MESSAGE_LOGLEVEL で定義されており、 デフォルト値は 4 である。
このフィールドの値は console_loglevel に設定できる最小値である。
console_loglevel のデフォルト値である。

ログレベル

すべての printk() メッセージにはそれぞれログレベルがある。 ログレベルがメッセージの一部として明示的に指定されなかった場合は、 ログレベルは default_message_loglevel になる。ログレベルの一般的な意味は以下のとおりである。

カーネル定数 レベル値 意味
KERN_EMERG 0 システムが使用不可
KERN_ALERT 1 直ちに対応しなければならない
KERN_CRIT 2 危険な状況
KERN_ERR 3 エラー状況
KERN_WARNING 4 警告状況
KERN_NOTICE 5 通常だが重要な状況
KERN_INFO 6 参考情報
KERN_DEBUG 7 デバッグレベルのメッセージ

カーネルの printk() ルーチンは、メッセージのログレベルが console_loglevel よりも小さい値の場合にのみ、 メッセージをコンソールに出力する。

返り値

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

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

エラー

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

準拠

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

注意

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

関連項目


dmesg(1), syslog(3), capabilities(7)

この文書について

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

2020-08-13 Linux