1、前言

内核是很庞大的,其中的打印信息也很多,太多的打印信息会拖慢内核的启动速度,也不利于我们查找有用的打印信息。于是内核有了打印优先级的机制,在用printk()打印信息时需要设置优先级,如果不设置优先级也会有一个默认的优先级。只有打印优先级高于控制台输出的优先级时打印信息才会被打印出来,于是我们可以通过修改控制台输出的优先级来控制打印信息的多少,根据想要查看的打印信息的优先级来修改控制台输出的优先级,这样可以确保能打印出我们想要的打印信息,又尽可能少的打印不需要的信息。

2、console_printk数组

//内核打印等级
#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     用来显示调试信息    *//* printk's without a loglevel use this.. */
#define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING *//* We show everything that is MORE important than this.. */
#define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */
#define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG */int console_printk[4] = {DEFAULT_CONSOLE_LOGLEVEL,   /* console_loglevel */DEFAULT_MESSAGE_LOGLEVEL, /* default_message_loglevel */MINIMUM_CONSOLE_LOGLEVEL, /* minimum_console_loglevel */DEFAULT_CONSOLE_LOGLEVEL, /* default_console_loglevel */
};

console_printk数组在kernel/printk.c里定义,其中4个元素是默认的优先级。
(1)DEFAULT_CONSOLE_LOGLEVEL:控制台日志级别,优先级高于该值的消息将被打印至控制台;
(2)DEFAULT_MESSAGE_LOGLEVEL:默认的消息日志级别,将用该优先级来打印没有指定优先级的消息。
(3)MINIMUM_CONSOLE_LOGLEVEL:控制台日志级别可被设置的最小值(最高优先级)。
(4)DEFAULT_CONSOLE_LOGLEVEL:默认的控制台日志级别,控制台日志级别的缺省值。

3、源代码修改控制台输出级别

将DEFAULT_CONSOLE_LOGLEVEL修改为你想要的等级,一般设置成你想要打印出的消息的等级,这样可以确保打印出你需要的信息,又尽可能少的打印无用信息。

4、动态修改控制台输出等级

4.1、查看当前的控制台输出等级

~ # cat /proc/sys/kernel/printk
7                            4                    1                  7
当前的日志级别 未明确指定日志级别的默认消息级别    最小允许的日志级别   引导时的默认日志级别

4.2、修改当前的输出等级

上面就是通过echo命令往printk文件写数据,将当前的日志级别改为4;

5、频繁打印带来的问题

(1)慢速控制台设备输出过多的消息导致系统变慢,因为控制台会频繁的占用CPU;
(2)当程序出错后会不停的打印出错信息。虽然我们设置的输出等级,但是一般都会运行printk输出出错打印,程序正常运行时不会有打印,但是当程序出错后,程序有可能会不停的打印出错信息,这样也会造成输出巨量消息;

6、限制频繁打印信息的措施

6.1、printk_ratelimit()函数

 if(printk_ratelimit()){ printk(KERN_NOTICE "The printer is still on fire\n");}

printk_ratelimit()通过跟踪发送到控制台的消息数量,如果输出的速度超过一个阈值则返回零,从而避免发送重复消息;

6.2、printk_ratelimit和printk_ratelimit_burst

~ # cat /proc/sys/kernel/printk_ratelimit
5
~ #
~ #
~ # cat /proc/sys/kernel/printk_ratelimit_burst
10

(1)printk_ratelimit文件:在重新打开消息之前应该等待的秒数;
(2)printk_ratelimit_burst文件:在进行速度限制之前可以接受的消息数;

修改内核printk函数打印等级相关推荐

  1. kernel printk的打印等级

    kernel的打印等级 前言 驱动 编写一个简单的驱动 makefile 测试 重点分析 疑问 前言 在程序开发中最常用的调试手段就是打印,同时也可向我们输出提示消息.在应用层采用printf用于打印 ...

  2. 限制内核printk的打印频率

    在很多时候我们需要限制printk的打印频率,避免调试信息刷屏.有如下方法可以使用. 1.使用printk_ratelimited() 用法举例: if(printk_ratelimited())pr ...

  3. linux设置printk打印级别,内核printk打印等级

    为了确认内核打印等级以及prink 参数对打印的分级,在led驱动初始化代码[以及exit出口]加入如下代码. 每次insmod .rmmod led模块时,根据打印等级的设置,得到不同的打印结果: ...

  4. 永久linux修改内核打印级别,终端下更改printk打印级别

    如何去更改printk的打印级别? 1.查看当前控制台的打印级别 # cat /proc/sys/kernel/printk 该文件有4个数字值,它们根据日志记录消息的重要性,定义将其发送到何处,上面 ...

  5. Debug log及printk的log打印等级设置

    $cat /proc/sys/kernel/printk Printk 共有4个参数 Cat /proc/sys/kernel/printk 7 4 1 7 (1)第一个参数 7表示小于7优先级消息才 ...

  6. 如何将linux内核的带级别控制的printk内容打印出来

    要将linux内核的带级别控制的printk内容打印出来,在命令行 输入 dmesg -n 8 就将所有级别的信息都打印出来 Linux命令:dmesg 功能说明:显示开机信息. 语 法:dmesg ...

  7. linux红外遥控进程,46.Linux-分析rc红外遥控平台驱动框架,修改内核的NEC解码函数BUG(1)...

    内核版本         :  Linux 3.10.14 rc红外接收类型:  GPIO 类型的NEC红外编码 本章内容 1)rc体系结构分析 2) 分析红外platform_driver平台驱动框 ...

  8. Linux 内核 printk打印

    调整内核打印信息级别: cat  /proc/sys/kernel/printk 7       7       1       7          其中第一个"7"表示内核打印 ...

  9. linux设置printk打印级别,printk打印等级

    cat /proc/sys/kernel/printk可以查询当前系统printk打印信息. zynq> cat printk 7       4       1       7 这四个数字分别 ...

最新文章

  1. 人工智能帮助预测混合用药的副作用
  2. linux 查看磁盘空间 文件 文件夹 大小
  3. 子网划分为什么全0全1子网号不能使用?CIDR为什么能使用全0全1子网号?
  4. 美团Android资源混淆保护实践
  5. php 云技术,什么叫云技术?
  6. JS高效关键字搜索---转
  7. linux apache 跨域,解决nginx/apache静态资源跨域访问问题详解
  8. 论文公式编号右对齐_论文不会写?最详细的论文排版技巧
  9. citrix web Interface5.3 访问WEB网站时,下载本地客户端
  10. docker容器启动几分钟之后自动退出
  11. Hive查询各自区组的money排名前十的账号
  12. Windows 2008 Core 常用命令
  13. 不同用户登陆模块的实现
  14. docker 代理_Docker点滴:如何配置docker代理
  15. 2021 CSDN查看自己关注的人
  16. android长截图工具下载,一键长截屏下载-一键长截屏 安卓版v1.0.0-PC6安卓网
  17. tp6多表联合查询的几种方式(模糊搜索+分页+字段限制)
  18. MT9255无法使用mm指令编译某个模块的问题
  19. caj转word免费转换怎么操作?
  20. 2018FME博客大赛-基于FME的不同比例尺线面要素 一致性检测关键技术研究

热门文章

  1. 时序分析:异步复位的removal time和recovery time
  2. 正在升级android s7,喜欢!升级Android 8.0后,三星S7可以获取新的UI和Bixby: 功能太多...
  3. 做毕业设计,前端部分你需要掌握的6个核心技能
  4. 利用python爬取豆瓣音乐_Python爬虫小白入门(七)爬取豆瓣音乐top250
  5. 家园防线 | 全栈物联网灌溉系统技术指南
  6. CAPP系统工艺设计功能浅析
  7. 解决Form表单提交文件后台获取为null的情况
  8. Bigdata_内存数据库
  9. gitlab设置邮箱服务器
  10. 行业分析-全球与中国药用琥珀色玻璃小瓶市场现状及未来发展趋势