RK3568平台 内核printk打印级别

一.printk简介

RK3568平台 内核printk打印级别_第1张图片

RK3568平台 内核printk打印级别_第2张图片

Printk实现流程:

test[]:打印到控制台的字符串缓存区:根据控制台等级先存放于cont.buf,调用console_unlock

将cont.buf拷贝到test[],最后调用底层终端设备write函数打印。

__log_buf:内核日志缓冲区,包括等级低无法打印到控制台的日志。

二.printk消息级别

Linux 内核共提供了八种不同的消息级别,分为级别 0~7。数值越大,表示级别越低,对应的消息越不重要。相应的宏定义在 include/linux/kern_levels.h 文件中。

#define KERN_SOH   "\001"      /* ASCII Start Of Header */
#define KERN_SOH_ASCII '\001'

#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 */

说明:

KERN_EMERG 表示紧急事件,一般是系统崩溃之前提示的消息;
KERN_ALERT 表示必须立即采取行动的消息;
KERN_CRIT 表示临界状态,通常涉及严重的硬件或软件操作失败;
KERN_ERR 用于报告错误状态,设备驱动程序会经常使用该级别来报告来自硬件的问题;
KERN_WARNING 对可能出现问题的情况进行警告,这类情况通常不会对系统造成严重的问题;
KERN_NOTICE 表示有必要进行提示的正常情形,许多与安全相关的状况用这个级别进行汇报;
KERN_INFO 表示内核提示信息,很多驱动程序在启动的时候,用这个级别打印出它们找到的硬件信息;
KERN_DEBUG 用于调试信息。

三.内核 printk 文件

通过 /proc/sys/kernel/printk 文件可以调节 printk 的输出等级,该文件有 4 个数字值。

RK3568平台 内核printk打印级别_第3张图片

四个数值的含义如下:
控制台日志级别:优先级高于该值的消息将被打印至控制台;
默认的消息日志级别:将用该优先级来打印没有优先级的消息(即 printk 没有指定消息级别);
最低的控制台日志级别:控制台日志级别可被设置的最小值(最高优先级);
默认的控制台日志级别:控制台日志级别的缺省值。

调整打印级别:

调整 printk 打印级别可以使得在印 Log 时控制输出 Log 的信息量以及控制自己想要输出的信息级别,下面则介绍调整 printk 打印级别的几种方法:

1.在 menuconfig 中修改

修改 CONFIG_MESSAGE_LOGLEVEL_DEFAULT 的值,然后重新编译,更新内核。menuconfig 配置路径如下:

Kernel hacking  --->
    printk and dmesg options  --->
        (4) Default message log level (1-7)

2.在系统中修改(常用)

在系统运行期间,可以通过修改 /proc/sys/kernel/printk 中的值来改变内核打印效果。例如,屏蔽掉所有的内核 printk 打印,只需要把第一个数值调到最小值1或者0,此时可以敲如下 cmd:

echo 1       4       1      7 > /proc/sys/kernel/printk

echo 1 > /proc/sys/kernel/printk # 表示只修改第一个值

四.使用示例

在使用 printk 时我们会将消息级别放到最开始的位置,例如:

printk(KERN_EMERG   "GetIot: KERN_EMERG\n");
printk(KERN_ALERT   "GetIot: KERN_ALERT\n");
printk(KERN_CRIT    "GetIot: KERN_CRIT\n");
printk(KERN_ERR     "GetIot: KERN_ERR\n");
printk(KERN_WARNING "GetIot: KERN_WARNING\n");
printk(KERN_NOTICE  "GetIot: KERN_NOTICE\n");
printk(KERN_INFO    "GetIot: KERN_INFO\n");
printk(KERN_DEBUG   "GetIot: KERN_DEBUG\n");

如果没有设置消息的日志级别,默认使用 default_message_loglevel 级别(该值可由上述两种方式修改,即第二个数值)。

当 printk 中的消息日志级别小于当前控制台的日志级别(console_printk[0])时,printk 的信息就会在控制台上显示。但无论当前控制台日志级别是何值,即使没有在控制台打印出来,都可以通过下面两种方法查看日志:

第一种是使用 dmesg 命令打印;
第二种是通过 cat /proc/kmsg 来打印。

dmesg:

执行 dmesg | tail 将会看到如下打印:

[20120.194934] module init success
[20120.194935] GetIot: KERN_EMERG
[20120.194937] GetIot: KERN_ALERT
[20120.194938] GetIot: KERN_CRIT
[20120.194939] GetIot: KERN_ERR
[20120.194940] GetIot: KERN_WARNING
[20120.194940] GetIot: KERN_NOTICE
[20120.194940] GetIot: KERN_INFO
[20120.194941] GetIot: KERN_DEBUG

 /proc/kmsg:

也可以执行 cat /proc/kmsg 等待内核打印:

$ sudo cat /proc/kmsg 
<6>[20120.194934] module init success
<0>[20120.194935] GetIot: KERN_EMERG
<1>[20120.194937] GetIot: KERN_ALERT
<2>[20120.194938] GetIot: KERN_CRIT
<3>[20120.194939] GetIot: KERN_ERR
<4>[20120.194940] GetIot: KERN_WARNING
<5>[20120.194940] GetIot: KERN_NOTICE
<6>[20120.194940] GetIot: KERN_INFO
<7>[20120.194941] GetIot: KERN_DEBUG

你可能感兴趣的:(瑞芯微,linux,运维,服务器)