dmesgとprintkコマンド


カーネルリングバッファの検出と制御に使用します.プログラムは、システムの起動情報をユーザーに理解させるために使用されます.
Linuxコマンドdmesgは起動情報を表示するために使用され、kernelは起動情報をring bufferに格納します.
起動情報は/var/logディレクトリのdmesgというファイルに保存されます
dmesg [ -c ] [ -n    ] [ -s       ]

1
-cクリアリングバッファ内の内容
-sバッファサイズ
「バッファサイズ」サイズのバッファを定義して、カーネルリングバッファをクエリーします.デフォルトサイズは8196です(このサイズは2.0.33および2.1.103カーネルのデフォルトsyslogバッファサイズと一致します).デフォルト値より大きいループバッファを設定すると、このオプションで相当なバッファを定義して完全なループバッファの内容を表示できます.
-nレベル設定レベルは、コンソール起動情報を記録するレベルです.例えば、−n 1とは、このレベルを最下位に設定し、カーネルパニック情報以外にコンソールに情報を表示しないことを意味する.すべてのレベルの起動情報は、/proc/kmsg、ファイルにも記録されるので、syslogd(8)も同様に情報の出力を制御するために使用することができる.-nオプションを使用すると、dmesgはカーネルリングバッファの内容をクリアしません.上記の2つのオプションを同時に使用すると、最後のオプションのみが効果を生み出します.
linuxカーネルのレベル制御付きprintkコンテンツを印刷するには、コマンドラインにdmesg-n 8を入力すると、すべてのレベルの情報が印刷されます.
printk()使用説明
カーネルはprintk()によって出力された情報にログレベルを有し、ログレベルはprintk()によって出力された文字列の前に括弧付きの整数を加えることによって制御され、例えばprintk("<6>Hello,world!/n");カーネルにはlinux/kernelで8つの異なるログレベルが用意されています.hには対応するマクロが対応する.
#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 */   #define KERN_INFO       "<6>"   /* informational */   #define KERN_DEBUG      "<7>"   /* debug-level messages */  #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 */#define KERN_INFO       "<6>"   /* informational */#define KERN_DEBUG      "<7>"   /* debug-level messages */
だからprintk()はprintk(KERN_INFO"Hello,world!/n");.
ログ・レベルが指定されていないprintk()のデフォルト・レベルはDEFAULT_です.MESSAGE_LOGLEVEL、このマクロはkernel/printk.cでは整数4、すなわち対応するKERN_と定義されるWARNING.
/proc/sys/kernel/printkには、現在のコンソール・ログ・レベル、ログ・レベルが明示的に指定されていないデフォルト・メッセージ・ログ・レベル、最小(最高)設定可能なコンソール・ログ・レベル、起動時のデフォルトのログ・レベル別の4つの数値が表示されます.printk()のメッセージ・ログ・レベルが現在のコンソール・ログ・レベルより小さい場合、printkの情報(必要に応じて/n文字)はコンソールに表示されます.ただし、現在のコンソールログレベルがどの値であるかにかかわらず、/proc/kmsg(またはdmesgを使用)で常に表示されます.またsyslogdまたはklogdが構成されて実行されている場合、コンソールに表示されていないprintkのメッセージも/var/log/messages.logに追加されます.
コンソールのログ・レベルを読み取り/書き込み/proc/sys/kernel/printkファイルで変更できます.このファイルを表示する方法は次のとおりです.
#cat /proc/sys/kernel/printk
6   4  1   7

上記の4つのデータは、コンソール・ログ・レベル、デフォルトのメッセージ・ログ・レベル、最下位のコンソール・ログ・レベル、およびデフォルトのコンソール・ログ・レベルに対応します.
次のコマンドを使用して、現在のログ・レベルを設定できます.
# echo 8 > /proc/sys/kernel/printk

またprintk()が瞬時に呼び出される回数が多すぎることを防止するためにprintk_ratelimit()は速度を制御します.printk_ratelimit()は、コンソールに送信されたメッセージの数を追跡することによって動作し、出力速度が臨界値を超えるとゼロを返します.printk_は、/proc/sys/kernel/{printk_ratelimit,printk_ratelimit_burst}を変更して調整できます.ratelimit()の計算.
printk_ratelimit()の典型的な使い方は、if(printk_ratelimit()printk(KERN_INFO"Hello,world!/n");
参照:
http://blog.csdn.net/zhenwenxian/article/details/4336211
http://blog.csdn.net/zhangxuechao_/article/details/50783298