内核编程七:Linux 内核日志的级别

Linux 内核日志(Kernel Log)有 8 个不同的级别(Severity Levels),用于表示消息的严重性。它们的定义在 include/linux/kern_levels.h 头文件中,并且可以用于 printk() 进行日志打印。

内核日志级别

级别数值级别名称说明
0KERN_EMERG紧急(Emergency),系统不可用,如内核崩溃
1KERN_ALERT警报(Alert),需要立即处理,如磁盘故障
2KERN_CRIT严重(Critical),严重错误,如硬件故障
3KERN_ERR错误(Error),常规错误,如驱动问题
4KERN_WARNING警告(Warning),可能影响系统运行但未导致错误
5KERN_NOTICE注意(Notice),需要关注但不是错误
6KERN_INFO信息(Informational),普通运行信息
7KERN_DEBUG调试(Debug),用于开发和调试的信息

日志级别在 printk() 中的使用

printk(KERN_INFO "This is an informational message.\n"); 
printk(KERN_ERR "This is an error message.\n"); 

如果 printk() 没有指定级别,默认使用 DEFAULT_MESSAGE_LOGLEVEL,一般为 KERN_WARNING

如何查看当前日志

可以使用 dmesg 命令查看内核日志:

dmesg 

或者按级别筛选:

dmesg --level=err,warn 

level可以跟以下参数
emerg、alert 、 crit 、 err 、warn、notice、info、debug

/proc/sys/kernel/printk 文件中可以查看和修改 printk() 输出的默认级别:

cat /proc/sys/kernel/printk 

通常返回四个数字,如:

4 4 1 7 

它们的含义分别是:

  1. 当前控制台日志级别
  2. 默认日志级别
  3. 最低控制台日志级别
  4. 引导时的默认日志级别

你可以修改日志级别,比如设置默认日志级别为 KERN_INFO

echo 6 > /proc/sys/kernel/printk 

include/linux/kern_levels.h文件

源码

以下代码是 Linux 内核头文件 kern_levels.h 中的所有内容,它用于定义内核日志的级别,并且与 printk() 日志系统相关。

/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __KERN_LEVELS_H__
#define __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 */

#define KERN_DEFAULT	""		/* the default kernel loglevel */

/*
 * Annotation for a "continued" line of log printout (only done after a
 * line that had no enclosing \n). Only to be used by core/arch code
 * during early bootup (a continued line is not SMP-safe otherwise).
 */
#define KERN_CONT	KERN_SOH "c"

/* integer equivalents of KERN_<LEVEL> */
#define LOGLEVEL_SCHED		-2	/* Deferred messages from sched code
					 * are set to this special level */
#define LOGLEVEL_DEFAULT	-1	/* default (or last) loglevel */
#define LOGLEVEL_EMERG		0	/* system is unusable */
#define LOGLEVEL_ALERT		1	/* action must be taken immediately */
#define LOGLEVEL_CRIT		2	/* critical conditions */
#define LOGLEVEL_ERR		3	/* error conditions */
#define LOGLEVEL_WARNING	4	/* warning conditions */
#define LOGLEVEL_NOTICE		5	/* normal but significant condition */
#define LOGLEVEL_INFO		6	/* informational */
#define LOGLEVEL_DEBUG		7	/* debug-level messages */

#endif

解读

1. 头文件保护

#ifndef __KERN_LEVELS_H__ 
#define __KERN_LEVELS_H__ 
  • 这是 头文件防护(Include Guard),防止头文件被多次包含导致重复定义错误。
  • #ifndef 检查 __KERN_LEVELS_H__ 是否未定义,如果未定义,则 #define 它,并继续解析文件内容。

2. 定义 KERN_SOH(Start Of Header)

#define KERN_SOH "\001" /* ASCII Start Of Header */ 
#define KERN_SOH_ASCII '\001' 
  • \001 是 ASCII 码 SOH(Start of Header,开始头部),数值为 1
  • KERN_SOH 被定义为 "\001",即一个包含 ASCII SOH 字符的字符串。
  • KERN_SOH_ASCII 直接定义为字符 '\001',用于非字符串场景。

作用:
KERN_SOH 作为日志级别的前缀,便于 printk() 解析日志级别。

3. 定义日志级别

#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 */ 
  • KERN_EMERG 定义为 "\0010",表示日志级别 0(紧急)。
  • KERN_ALERT 定义为 "\0011",表示日志级别 1(警报)。
  • KERN_CRIT 定义为 "\0012",表示日志级别 2(严重)。

自动连接:
在 C 语言中,字符串常量连接时会自动去掉空格,把它们合并成一个大的字符串。因此:

KERN_SOH "0" 会展开为 "\0010"。

其中 "\001" 是一个包含控制字符 SOH 的字符串,而 "0" 是包含字符 '0' 的字符串

所以,最终的结果并不是 "\001 0"(中间有空格),而是 "\0010",即 SOH 字符和字符 '0' 连接成一个字符串。

关键点:
空格 在字符串常量之间并不直接保留,而是被忽略。如果想得到"\001 0"应该写成KERN_SOH " 0",引号中的0前面有空格

为什么前缀 KERN_SOH

  • printk() 解析日志字符串时,会识别 \001 作为日志级别标志,后面的数字决定级别。
  • 例如:
    printk(KERN_ALERT "This is an alert message.\n"); 
    等价于:
    printk("\0011This is an alert message.\n"); 
    这样,printk() 解析到 \0011,就知道这是 警报(Alert)级别 的日志。

后续定义类似,从 紧急 (0) 到 调试 (7),数值越大严重性越低。


总结

  1. #ifndef 保护防止头文件重复包含。
  2. KERN_SOH (\001) 作为日志级别标志,方便 printk() 解析日志级别。
  3. KERN_EMERGKERN_ALERT 等定义了不同日志级别,以 "\001N" 形式标识,其中 N 是级别数值。
  4. printk(KERN_ERR "Some error occurred\n"); 实际会传递 "\0013Some error occurred\n" 供内核日志系统处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/982219.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek集成到VScode工具,让编程更高效

DeepSeek与VScode的强强联合&#xff0c;为编程效率树立了新标杆。 DeepSeek&#xff0c;一款卓越的代码搜索引擎&#xff0c;以其精准的索引和高速的检索能力&#xff0c;助力开发者在浩瀚的代码海洋中迅速定位关键信息。 集成至VScode后&#xff0c;开发者无需离开熟悉的编辑…

蓝桥杯 - 每日打卡(类斐波那契循环数)

题目: 解题思路&#xff1a; 假设输入数值为number 分析题目&#xff0c;如果想要解决这个问题&#xff0c;我们需要实现两个方法&#xff0c;第一个检查number是否是类斐波那契&#xff0c;第二个是模拟1e7 - 0的过程&#xff0c;因为是求最大的&#xff0c;那么我们从1e7开始…

JavaScript实现著名的“两数之和”问题

下面是使用 JavaScript 实现“两数之和”问题的一种常见解法&#xff0c;利用哈希表&#xff08;Map&#xff09;存储遍历过的数字和它们对应的下标&#xff0c;从而在一次遍历中完成查找。以下是详细的代码和说明&#xff1a; function twoSum(nums, target) {// 创建一个 Ma…

【微信小程序】每日心情笔记

个人团队的比赛项目&#xff0c;仅供学习交流使用 一、项目基本介绍 1. 项目简介 一款基于微信小程序的轻量化笔记工具&#xff0c;旨在帮助用户通过记录每日心情和事件&#xff0c;更好地管理情绪和生活。用户可以根据日期和心情分类&#xff08;如开心、平静、难过等&#…

【数据结构】什么是栈||栈的经典应用||分治递归||斐波那契问题和归并算法||递归实现||顺序栈和链栈的区分

文章目录 &#x1f967;栈的初步理解&#xff1a;&#x1f967;易错&#xff1a;如何判断栈满&#x1f967;栈满理解&#x1f967;栈的基本运算&#x1f4da;栈操作的伪代码逻辑&#xff08;顺序和链栈&#xff09;&#x1f4d5;顺序栈运算实现&#xff1a;顺序栈的表示&#x…

利用opencv_python(pdf2image、poppler)将pdf每页转为图片

1、安装依赖pdf2image pip install pdf2image 运行.py报错&#xff0c;因为缺少了poppler支持。 2、安装pdf2image的依赖poppler 以上命令直接报错。 改为手工下载&#xff1a; github: Releases oschwartz10612/poppler-windows GitHub 百度网盘&#xff1a; 百度网盘…

IDEA + DeepSeek 实现 AI辅助编程,提升效率10倍(全网超详细的终极图文实战指南)

前言 在软件开发的世界里&#xff0c;每个开发者都经历过这样的困境——在重复的CRUD代码中机械劳动&#xff0c;为复杂的业务逻辑调试数小时&#xff0c;或是在海量文档中寻找某个API的正确用法。传统的IDE工具虽能提供基础支持&#xff0c;却难以突破效率的“玻璃天花板”。而…

青训营:简易分布式爬虫

一、项目介绍 该项目是一个简易分布式爬虫系统&#xff0c;以分布式思想为基础&#xff0c;通过多节点协作的方式&#xff0c;将大规模的网页抓取任务分解&#xff0c;从而高效、快速地获取网络数据 。 项目地址&#xff1a;https://github.com/yanchengsi/distributed_crawle…

论坛系统测试报告

目录 一、项目背景二、论坛系统测试用例思维导图三、论坛系统测试3.1界面测试3.2登陆测试3.3主页测试3.4个人中心测试 四、自动化测试脚本4.1配置驱动4.2创建浏览器类4.3功能测试4.3.1登陆测试4.3.2注册测试4.3.3主页测试4.3.4帖子编辑4.3.5运行主代码 五、BUG分析六、测试总结…

C++ std::vector 超详细指南:基础实践(手搓vector)

目录 一.基本概念 二.类的常用接口说明 1.类对象的常见构造 2. vector类空间变化 1&#xff09;.size()&#xff08;获取数据个数&#xff09; 2&#xff09;.capacity()&#xff08;获取容量大小&#xff09; 3&#xff09;.empty()&#xff08;判断是否为空&#xff0…

文件上传漏洞:upload-labs靶场11-20

目录 pass-11 pass-12 pass-13 pass-14 pass-15 pass-16 pass-17 pass-18 pass-19 pass-20 pass-11 分析源代码 &#xff0c;发现上传文件的存放路径可控 if(isset($_POST[submit])){$ext_arr array(jpg,png,gif);$file_ext substr($_FILES[upload_file][name],st…

AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型(LLM)应用开发平台

AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型&#xff08;LLM&#xff09;应用开发平台 目录 AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型&#xff08;LLM&#xff09;应用开发平台 一、简单介绍 二、Docker 下载安…

Redis的持久化-RDBAOF

文章目录 一、 RDB1. 触发机制2. 流程说明3. RDB 文件的处理4. RDB 的优缺点 二、AOF1. 使用 AOF2. 命令写⼊3. 文件同步4. 重写机制5 启动时数据恢复 一、 RDB RDB 持久化是把当前进程数据生成快照保存到硬盘的过程&#xff0c;触发 RDB 持久化过程分为手动触发和自动触发。 …

常见网络协议考察知识点

说说http,https协议&#xff1b; HTTPS&#xff08;Secure Hypertext Transfer Protocol&#xff09;安全超文本传输协议&#xff1a; 它是一个安全通信通道&#xff0c;它基于HTTP开发&#xff0c;用于在客户计算机和服务器之间交换信息&#xff0c;它使用安全套接字层(SSL)…

上海市闵行区数据局调研云轴科技ZStack,共探数智化转型新路径

为进一步深化人工智能、大模型技术的应用&#xff0c;推动区域数字经济高质量发展&#xff0c;2025年2月27日&#xff0c;上海市闵行区数据局局长吴畯率队赴上海云轴科技股份有限公司&#xff08;以下简称“云轴科技ZStack”&#xff09;开展专题调研。此次调研旨在深入了解企业…

数据结构秘籍(四) 堆 (详细包含用途、分类、存储、操作等)

1 引言 什么是堆&#xff1f; 堆是一种满足以下条件的树&#xff1a;&#xff08;树这一篇可以参考我的文章数据结构秘籍&#xff08;三&#xff09;树 &#xff08;含二叉树的分类、存储和定义&#xff09;-CSDN博客&#xff09; 堆中的每一个结点值都大于等于&#xff08…

MySQL增量更新数据:高效同步策略与PanguSync实战指南

Mysql增量更新数据软件下载https://pan.baidu.com/s/1WesHaKGO7uQMhPNE-BTDmg?pwdabcd#list/path%2F 在数据驱动的商业环境中&#xff0c;实时数据同步已成为企业数字化转型的关键。本文将深入探讨MySQL增量更新的核心技术&#xff0c;并详细解析如何通过PanguSync工具实现高…

【Wireshark 02】抓包过滤方法

一、官方教程 Wireshark 官网文档 &#xff1a; Wireshark User’s Guide 二、显示过滤器 2.1、 “数据包列表”窗格的弹出过滤菜单 例如&#xff0c;源ip地址作为过滤选项&#xff0c;右击源ip->prepare as filter-> 选中 点击选中完&#xff0c;显示过滤器&#…

run方法执行过程分析

文章目录 run方法核心流程SpringApplicationRunListener监听器监听器的配置与加载SpringApplicationRunListener源码解析实现类EventPublishingRunListener 初始化ApplicationArguments初始化ConfigurableEnvironment获取或创建环境配置环境 打印BannerSpring应用上下文的创建S…