簡體   English   中英

如何在控制台中顯示 printk() 消息?

[英]How can I show printk() message in console?

printk() 打印的信息只能在Alt + Ctrl + F1 ~ F7控制台下看到。 這些控制台無法回滾,調試非常不方便。 我正在使用 KDE 桌面環境和控制台終端,如何將 printk() 消息重定向到控制台?

printk的語法是

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

內核在文件 printk.h 中定義了 8 個日志級別

#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

輸出中的第一個數字是控制台日志級別,第二個是默認日志級別,第三個是最小日志級別,第四個是最大日志級別。

日志級別 4 對應於 KERN_WARNING。 因此,所有日志級別為 3、2、1 和 0 的消息都將顯示在屏幕上並被記錄,而日志級別為 4、5、6、7 的消息只會被記錄下來,並且可以使用“dmesg”查看。

可以通過寫入 proc 條目來更改控制台日志級別

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

現在控制台日志級別設置為 6,即 KERN_INFO。

在這里您想打印出每條消息,因此您應該將控制台級別設置為最高數字“8”

echo "8" > /proc/sys/kernel/printk 
tail -f /var/log/kern.log & 

或者

cat /proc/kmsg & (Android Environment)

dmesg -wH &

強制打印到 dmesg 的所有內核消息(以及 Ctrl+Alt+F1 等虛擬終端,取決於您的 /proc/sys/kernel/printk 日志級別和消息級別) ,也出現在您的 SSH 或 GUI 控制台:Konsole、終端或您正在使用的任何東西! 而且,如果您只需要監視特定消息:

dmesg -wH | grep ERR &

我正在使用它來監視“錯誤”消息,例如

printk(KERN_EMERG "ERROR!\n");

我從我的驅動程序打印

printk()是 Linux 內核提供的用於打印調試/信息/錯誤消息的函數。 在內部,內核維護一個__LOG_BUF_LEN字節長的循環緩沖區(根據配置,它的范圍可以從 4KB 到 1MB)。

有 8 個可能的日志級別與消息關聯並在linux/kernel.h 中定義

  • KERN_EMERG : 緊急(系統不可用)
  • KERN_ALERT : 嚴重問題(即必須立即采取行動)
  • KERN_CRIT : 臨界狀態,通常與硬件或軟件故障有關
  • KERN_ERR :用於錯誤情況,通常與硬件問題有關
  • KERN_WARNING :用於警告不嚴重的問題情況
  • KERN_NOTICE : 需要通知的正常情況
  • KERN_INFO :信息性消息; 許多驅動程序打印有關找到的硬件的信息
  • KERN_DEBUG : 僅用於調試

每個字符串代表一個范圍從 0 到 7 的數字,較小的值代表較高的優先級。 默認日志級別等於在kernel/printk/printk.c 中指定的DEFAULT_MESSAGE_LOGLEVEL變量。

如何從用戶級讀取消息取決於一些用戶級守護程序(例如, klogdsyslogd )的配置和默認日志級別。 要回答您的問題,根據您的具體配置,以下一個或多個命令將允許您讀取 printk 的輸出:

  • dmesg控制台命令(通常是一次性手動檢查的首選方式)
  • tail -f /var/log/kern.log命令
  • 通過/proc/kmsg (不鼓勵)

根據您的配置,您可能還想更改控制台中顯示的默認日志級別。 從 klogd 2.1.31 開始,可以通過回顯到/proc/sys/kernel/printk來更改默認日志級別。 例子:

  • echo 5 > /proc/sys/kernel/printk將僅在控制台上顯示日志級別為 0 到 4 的消息
  • echo 8 > /proc/sys/kernel/printk將顯示在具有任何日志級別的控制台消息上

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM