
这些宏是 Linux 内核中printk函数使用的日志级别Log Levels。它们定义在内核源码的include/linux/kern_levels.h中。内核通过这些级别来判断这条信息有多重要是否应该直接显示在终端屏幕上还是仅仅记录在日志文件中日志级别共分为8 个等级0-7数值越小优先级越高。详解各级别含义宏名称级别名称含义与使用场景形象比喻KERN_EMERG0紧急 (Emergency)系统已经不可用通常紧接着就是系统崩溃Panic。地震了快跑KERN_ALERT1警报 (Alert)必须立即采取措施。例如严重的数据库损坏或硬件故障。火警响了KERN_CRIT2临界 (Critical)关键情况。严重的硬件或软件失效但系统还能勉强撑一会。刹车失灵了KERN_ERR3错误 (Error)内核驱动程序经常使用。用于报告硬件错误、设备探测失败等。爆胎了。KERN_WARNING4警告 (Warning)并非错误但可能会导致问题。例如使用了过时的接口、磁盘空间快满了。油箱快空了。KERN_NOTICE5注意 (Notice)正常情况但具有安全意义或重要性。常用于网络事件或安全提示。前方路滑减速。KERN_INFO6信息 (Informational)最常用。记录内核启动信息、驱动加载成功的信息、硬件检测结果等。广播现在时刻 12 点。KERN_DEBUG7调试 (Debug)仅用于开发调试。输出大量的运行细节生产环境下通常会被屏蔽。行车电脑每秒心跳记录。核心机制为什么要有这些级别1. 控制“刷屏” (Console Log Level)内核有一个变量叫console_loglevel当前控制台日志级别。如果printk的级别小于即优先级高于这个变量消息就会直接打印到屏幕上如串口、VGA控制台。如果级别大于或等于这个变量消息就不会显示在屏幕上但依然会记录在内存缓冲区里。你可以通过以下命令查看当前的设置cat/proc/sys/kernel/printk# 输出通常是: 4 4 1 7# 第一个数字 4 表示当前控制台级别只有 0-3 (EMERG 到 ERR) 会打印到屏幕。2. 日志查看无论级别是多少所有的printk消息都会被记录。你可以通过以下方式查看dmesg命令查看内核环形缓冲区Ring Buffer。/var/log/kern.log被系统日志守护进程syslogd/rsyslogd持久化后的文件。在代码中如何使用在编写内核模块时你只需要在字符串前面加上这些宏即可printk(KERN_EMERGSystem is going down NOW!\n);printk(KERN_ERRFailed to initialize the hardware, error code: %d\n,ret);printk(KERN_INFOModule loaded successfully!\n);printk(KERN_DEBUGDebug: current value of x is %d\n,x);小贴士如果你写printk(Hello world\n);而不加任何宏内核会使用默认级别通常是KERN_WARNING或KERN_NOTICE取决于内核配置。在现代内核开发中更推荐使用封装好的宏如pr_info(),pr_err(),pr_debug()它们会自动带上对应的级别更简洁。例如pr_err(Error occurred!\n);等同于printk(KERN_ERR Error occurred!\n);