kazmax - Linux で自宅サーバー

syslog - システムコールの説明 - Linux コマンド集 一覧表

  1. 名前
  2. 書式
  3. 説明
  4. 返り値
  5. エラー
  6. 準拠
  7. 注意
  8. 関連項目

名前

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

書式

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

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

/* システム・コールを自分で定義する場合 */

#include <unistd.h>

#include <linux/unistd.h>

#include <errno.h>

_syscall3(int, syslog, int, type, char *, bufp, int, len)
          /* Using syscall(2) may be preferable; see intro(2) */

int syslog(int type, char *bufp, int len);

説明

もし libc 関数の syslog ()(すなわち   syslogd (8) と話す関数) が必要ならば、   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 -- ログバッファの未読の文字数を返す。
 */

root 権限のないプロセスには機能 3 のみが許可されている。 (機能 9 は Linux 2.4.10 で追加された)
カーネル・ログ・バッファ (kernel log buffer)
カーネルは長さ LOG_BUF_LEN (4096, 1.3.54 からは 8192, 2.1.113 からは 16384, 最近のカーネルではコンパイル時に長さを設定可能) の巡回式のバッファを持っており、 それにはカーネル関数の printk () の引き数として与えられた メッセージが (そのログレベルにかかわらず) 格納される。
syslog ()(2, buf , len )の呼び出しはカーネル・ログ・バッファが空でなくなるまで待って、 最大 len バイトまで buf へと読み出し、読み込んだ バイト数を返す。ログから読まれたバイトはログ・バッファから消える: 情報は一度しか読むことができない。 これはユーザーのプログラムが /proc/kmsg を読んだ時にカーネルによって実行される関数でもある。
syslog ()(3, buf , len )の呼び出しはログ・バッファの最後の len バイトを (非破壊的に)読み出す、しかし、直近の「リング・バッファ消去」命令 (この命令はバッファを消去するわけではない) 以降にバッファに書き込まれた情報しか読み出せない。 返り値は読み込んだバイト数である。
syslog ()(4, buf , len )呼び出しは「リング・バッファ消去」命令も実行する以外は 機能 3 と完全に同じである。
syslog ()(5, dummy , idummy )呼び出しは「リング・バッファ消去」命令のみを実行する。
ログレベル (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 , idummy )呼び出しで 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>"  /* デバッグレベルの情報        */

返り値

エラーの場合は -1 が返され、errno が設定される。その他の場合、 type が 2, 3, 4 ならば読み込んだバイト数を、そうでなれば 0 を返す。

エラー

EINVAL
不正なパラメータ。
EPERM
root の権利を持たないプロセスが console_loglevelを変更しようとしたか、 カーネル・メッセージ・リングを消去しようとした。
ERESTARTSYS
システム・コールがシグナルによって割り込まれ、何も読み出せなかった。 (トレース中にしか発生することはない)

準拠

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

注意

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

関連項目