阡陌 发表于 2024-2-18 14:43:03

Linux 内核打印 printk


内核中没有 C 库,所以不能使用 printf 打印。但它提供了类似的 printk 函数,printk 函数输出的字符串前加一个带尖括号的整数来控制打印级别,如 `printk("<6>Hello, world!\n")`。级别数值越小,优先级越高,其紧急和严重程度就越高。然而,需要注意的是,并不是所有级别的消息都会进行输出,而是根据 printk 的打印级别进行过滤。

**printk 打印级别宏定义:**

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

#define KERN_DEFAULT        KERN_SOH "d"        /* the default kernel loglevel */
```



**内核日志打印级别查看:**

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

该文件包含四个数字值,分别表示:

1. 控制台日志级别(Console log level):只有级别高于设定值的日志消息才会被显示在控制台上(值要小于该值)。
2. 默认的消息日志级别(Default message log level):用于打印没有优先级的消息,即当 printk 没有指定消息级别时,将使用该默认级别。
3. 最低的控制台日志级别(Minimum console log level):控制台日志级别可被设置的最小值,也就是最高的优先级。
4. 默认的控制台日志级别(Default console log level):控制台日志级别的缺省值。



**修改内核日志打印级别:**

```
echo "6 4 1 7" | sudo tee /proc/sys/kernel/printk
```

修改后的值重启后会恢复,如果要保持,可以将它添加到启动脚本中,以便在系统启动时重新设置。



printk 打印的是控制台,也就是 /dev/console。而图形界面中的终端,其实是把 stdin,stdout,stderr 三个文件重定向了一下。所以 printk 是不能在图形界面中的终端中显示的,当然可以在 /var/log/syslog 或者用 dmesg 查看。

不够打印级别的信息会被写到日志中可通过 dmesg 命令来查看。



**dmesg 命令:**

实时监控 dmesg 的日志输出:

```
watch "dmesg | tail -20"
```


页: [1]
查看完整版本: Linux 内核打印 printk