GNU/Linux >> Linux の 問題 >  >> Linux

printk およびコンソール ログ レベル

カーネルに対する printk() は、ユーザー空間に対する printf() と同じです。 printk() で書き込んだ行は、dmesg コマンドで表示できます。出力するメッセージの重要度に応じて、include/linux/kern_levels.h で定義されている 8 つのログ レベル メッセージとその意味を選択できます。

printk の構文は次のとおりです。

printk ("log level" "message", <arguments>); 

以下は、カーネル ログ レベルのリストです。これらの各レベルは文字列内の数値に対応し、その優先度は数値の値に反比例します。たとえば、0 は優先度が高くなります:

#define KERN_EMERG "<0>" /* system is unusable*/
#define KERN_ALERT "<1>" /* action must be taken immediately*/
#define KERN_CRIT "<2>" /* critical conditions*/
#define KERN_ERR "<3>" /* error conditions*/
#define KERN_WARNING "<4>" /* warning conditions*/
#define KERN_NOTICE "<5>" /* normal but significant condition*/
#define KERN_INFO "<6>" /* informational*/
#define KERN_DEBUG "<7>" /* debug-level messages*/

各ログ レベルが数字に対応し、数字が小さいほどメッセージの重要性が高いことがわかります。レベルは、コンソールでユーザーに何を表示し、何を表示しないかを決定するのに役立ちます。

すべてのコンソールには、コンソール ログ レベルと呼ばれるログ レベルがあり、ログ レベル番号がコンソール ログ レベルより小さいメッセージはコンソールに表示され、ログ レベル番号がコンソール ログ レベル以上の他のメッセージがログに記録されます。コマンド「dmesg」を使用して調べることができるカーネルログで。

コンソールのログレベルは、ファイル /proc/sys/kernel/printk を調べることで見つけることができます。

$ cat /proc/sys/kernel/printk
4 4 1 7

出力の最初の数字はコンソール ログ レベル、2 番目はデフォルトのログ レベル、3 番目は最小ログ レベル、4 番目は最大ログ レベルです。

ログレベル 4 は KERN_WARNING に対応します。したがって、ログ レベル 3、2、1、および 0 のメッセージはすべて画面に表示され、ログに記録されます。ログ レベル 4、5、6、7 のメッセージのみがログに記録され、「dmesg」を使用して表示できます。 /P>

コンソール ログ レベルは、proc エントリに書き込むことで変更できます:

$ echo "6" > /proc/sys/kernel/printk
$ cat /proc/sys/kernel/printk
6 4 1 7

これで、コンソール ログ レベルが 6 (KERN_INFO) に設定されました。次のモジュールを使用してロギングをテストできます。

# vi hello.c:
#include<linux/kernel.h> 
#include<linux/module.h> 
#include<linux/init.h> 

static int hello_init(void) 
{
 printk(KERN_WARNING "Hello, world \n ");
 return 0; 
} 

static void hello_exit(void)
{
 printk(KERN_INFO "Goodbye, world \n"); 
}

module_init(hello_init);
module_exit(hello_exit);

init 関数で呼び出される printk は、ログ レベルである KERN_WARNING と、コンソール ログ レベルである 6 未満を使用するため、画面に表示されるはずです。

exit 関数で使用される printk は、ログ レベル 6 の KERN_INFO であり、コンソール ログ レベルと同じであるため、画面に表示されません。

注意 :GUI の端末にメッセージが表示されないため、テキスト モードにログインするだけで、コードの動作をテストできます。

メイクファイル:

ifneq ($(KERNELRELEASE),) 
   obj-m := hello.o
else 

KERNELDIR ?= /lib/modules/$(shell uname -r)/build 

PWD := $(shell pwd)

default: 
 make -C $(KERNELDIR) M=$(PWD) modules  
clean:
 $(MAKE) -C $(KERNELDIR) M=$(PWD) clean
endif

コンパイルして挿入:

$ make 
$ insmod hello.ko 
[5377.966743] Hello world

hello world が画面に表示されているのがわかります。

$ rmmmod hello
$ dmesg| tail -2 
[5424.190552] Good bye world 

good bye world メッセージはログに記録されますが、画面には出力されませんが、ログで確認できます。したがって、printk とコンソール ログ レベルを使用して、ユーザーに表示されるカーネル メッセージを制御できます。

最終的な考え

カーネルは printk 関数を使用します。これは、標準 C ライブラリからの printf 関数呼び出しに構文的に非常に似ていますが、オプションのログ レベルが追加されています。許可されている形式は、Documentation/printk-formats.txt の下のカーネル ソースに記載されています。

次の表に、printk で使用可能なログ レベルを示します。

タイプ シンボル 説明
緊急事態 KERN_EMERG システムが不安定でクラッシュしそうです
アラート KERN_ALERT 早急な対応が必要です
クリティカル KERN_CRIT 重大なソフトウェアまたはハードウェアの障害
エラー KERN_ERR エラー状態
警告 KERN_WARNING 深刻なものではありませんが、問題を示している可能性があります
お知らせ KERN_NOTICE 重大なことではありませんが、ユーザーは注意する必要があります
情報 KERN_INFO システム情報
デバッグ KERN_DEBUG デバッグ メッセージ

ログ レベルが指定されていない場合、カーネル構成で構成されているデフォルトのログ メッセージが使用されます。デフォルトでは、これは KERN_WARNING です。


Linux
  1. Linuxはコンソール出力をログファイルに追加しますか?

  2. Linuxでターミナルコンソールをズームインおよびズームアウトする方法

  3. ユーザーをログアウトしてアカウントを削除する

  1. コンソール(tty)とXの両方でX /コンソールに依存しない方法でキーボードレイアウト/マッピングを変更しますか?

  2. cronログレベルを変更する方法は?

  3. /var/log/messages、/var/log/syslog、および/var/log/kern.logの違いは?

  1. Lokiとfzfでシェルの履歴をレベルアップ

  2. SQLServerでログファイルを切り捨てて縮小する

  3. CentOS / RHEL 6 :SNMP ログ レベルを変更する方法