我們在使用printk()函數中使用日志級別為的是使編程人員在編程過程中自定義地進行信息的輸出,更加容易地掌握系統當前的狀況。

對程序的調試起到了很重要的作用。

(下文中的日志級別和控制台日志控制級別是一個意思)

printk(日志級別 "消息文本");這里的日志級別通俗的說指的是對文本信息的一種輸出范圍上的指定。

日志級別一共有8個級別,printk的日志級別定義如下(在linux26/includelinux/kernel.h中):

#defineKERN_EMERG"<0>"/*緊急事件消息,系統崩潰之前提示,表示系統不可用*/

#defineKERN_ALERT"<1>"/*報告消息,表示必須立即采取措施*/

#defineKERN_CRIT"<2>"/*臨界條件,通常涉及嚴重的硬件或軟件操作失敗*/

#defineKERN_ERR"<3>"/*錯誤條件,驅動程序常用KERN_ERR來報告硬件的錯誤*/

#defineKERN_WARNING"<4>"/*警告條件,對可能出現問題的情況進行警告*/

#defineKERN_NOTICE"<5>"/*正常但又重要的條件,用於提醒。常用於與安全相關的消息*/

#defineKERN_INFO"<6>"/*提示信息,如驅動程序啟動時,打印硬件信息*/

#defineKERN_DEBUG"<7>"/*調試級別的消息*/

沒有指定日志級別的printk語句默認采用的級別是 DEFAULT_ MESSAGE_LOGLEVEL(這個默認級別一般為<4>,即與KERN_WARNING在一個級別上),其定義在linux26/kernel/printk.c中可以找到。

下面是一個比較簡單的使用

printk(KERN_INFO "INFO\n");  //這里可以使用數字代替 KERN_INFO,即可以寫成printk(<6> "INFO\n");

在這個格式的定義中,日志級別和信息文本之間不能夠使用逗號隔開,因為系統在進行編譯的時候,將日志級別轉換成字符串於后面的文本信息進行連接。

在對系統輸出進行控制時,主要是討論控制台和偽終端的輸情況,以及系統日志等。

下面是控制台日志級別的一些簡要的介紹

控制台相應的日志級別定義如下:

#define MINIMUM_CONSOLE_LOGLEVEL  1   /*可以使用的最小日志級別*/

#define DEFAULT_CONSOLE_LOGLEVEL  7 /*比KERN_DEBUG 更重要的消息都被打印*/

int console_printk[4] = {

DEFAULT_CONSOLE_LOGLEVEL,/*控制台日志級別,優先級高於該值的消息將在控制台顯示*/

/*默認消息日志級別,printk沒定義優先級時,打印這個優先級以上的消息*/

DEFAULT_MESSAGE_LOGLEVEL,

/*最小控制台日志級別,控制台日志級別可被設置的最小值(最高優先級)*/

MINIMUM_CONSOLE_LOGLEVEL,

DEFAULT_CONSOLE_LOGLEVEL,/* 默認的控制台日志級別*/

};

在進行查看的時候,可以使用命令 cat /proc/sys/kernel/printk來查看這四個值

可以通過修改文件/proc/sys/kernel/printk中的第一個值來更改當前的控制台日志級別。

(聲明:在下面的模塊函數中控制台所使用的日志級別均為KERN_WARNING級別)當日志級別高於console_loglevel(控制台日志級別)時,消息才能在控制台顯示出來。

假如我們寫了一個如下的模塊函數:

1 #include

2 #include

3 MODULE_LICENSE("Dual BSD/GPL");

4 static int book_init(void)

5 {

6   printk(KERN_EMERG "EMERG\n");

7   printk(KERN_ALERT "ALERT\n");

8   printk(KERN_CRIT " CRIT\n");

9   printk(KERN_ERR " ERR\n");

10  printk(KERN_WARNING ""WARNING\n");

11   printk(KERN_NOTICE "NOTICE\n");

12  printk(KERN_INFO "INFO\n");

13  printk(KERN_DEBUG "DEBUG\n");

14  return 0;

}

15static void book_exit(void)

16{

17  printk(KERN_ALERT "Book module exit\n");

}

18  module_init(book_init);

19  module_exit(book_exit);

在控制台(這里指的是虛擬終端  Ctrl+Alt+(F1~F6))加載模塊以后,控制台給出的信息為

6~9行中要求輸出的信息,我們在偽終端(如果對偽終端不是很清楚可以看相關的內容)上運行命令tail -n 10 /var/log/messages查看日志文件剛才得到的運行記錄

可以發現messages中的值為KERN_WARNING級別之后所要求輸出到信息值。而如果我們在文件syslog和kern-log中查看系統日志文件,一般情況下可以得到所有的輸出信息

Jul 18 11:44:19 xiyoulinux-desktop kernel: [16100.637057] INFO

Jul 18 11:44:19 xiyoulinux-desktop kernel: [16100.637063] CRIT

Jul 18 11:44:19 xiyoulinux-desktop kernel: [16100.637066] WARNING

Jul 18 11:44:19 xiyoulinux-desktop kernel: [16100.637068] ERR

Jul 18 11:44:19 xiyoulinux-desktop kernel: [16100.637069] ALERT

Jul 18 11:44:19 xiyoulinux-desktop kernel: [16100.637070] EMERG

Jul 18 11:44:19 xiyoulinux-desktop kernel: [16100.637071]  NOTICE

Jul 18 11:44:19 xiyoulinux-desktop kernel: [16100.637072] DEBUG

(不過在有些機器上運行得到的結果並不是這樣的)

即一般情況下,syslog和kern.log兩個文件中記錄的內容從編程這個角度來看是基本一致的。

在目錄/var/log/下有一下四個文件可以查看日志

syslog ,kern.log,messages ,DEBUG 。

syslog和kern.log一般情況下可以得到所有的系統輸出值,而messages得到的是比控制台日志級別低的輸出值,DEBUG得到的僅僅是DEBUG級別的

輸出值。

一般情況下,優先級高於控制台日志級別的消息將被打印到控制台。優先級低於控制台日志級別的消息將被打印到messages日志文件中,而在偽終端下不打印任何的信息。

我們在進行有關編程的時候,若使用到printk()這個函數,一般查看信息是在messages和虛擬終端下進行查看,而對於syslog和kern.log下是用來檢驗所有信息的輸出情況。

linux dprintk 日志,linux內核調試中的printk()函數詳解相关推荐

  1. linux 内核dmesg,linux內核調試kmsg,dmesg

    dmesg為我們多用,man dmesg告知dmesg用來顯示和管理kernel ring buffer,那麼後者為何物,以及dmesg顯示何類信息,是本文待闡述的內容. documentation/ ...

  2. linux dprintk 日志,linux命令备忘

    2012-09-06 07:16 1234人阅读 评论(0) links -dump your.html html2txt lynx --dump your.html html2txt ldconfi ...

  3. 安裝linux後的內核調優

    vi /etc/sysctl.conf 编辑文件,加入以下内容: net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_ ...

  4. Linux 下使用命令行查看 內核版本 | 系統版本 | cpu 位數 | 內存使用

    查看系統內核版本: # uname -a 查看系統版本: # more /etc/redhat-release 查看內核版本 GCC 版本: # more /proc/version 查看 cpu 信 ...

  5. linux 高性能日志,linux日志系统

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 常见的日志 常见的日志一般存放在 /var/log 中,我们可以根据服务对象粗略的将日志分为两类系统日志 应用日志日志名 ...

  6. linux postfix 日志,linux – 如何计算Postfix的mailq的消息?

    推荐文章 Wish me luck, I'm diving into JavaScript! As much as I want to start using JavaScript right awa ...

  7. linux蓝牙日志,linux蓝牙

    linux蓝牙 (2008-12-30 17:20:07) 标签: 杂谈 为了将手机上的图片传送到笔记本电脑上,发现手机和笔记本电脑同时支持蓝牙. linux下蓝牙工具为bluez,包括bluez-u ...

  8. linux蓝牙日志,Linux下使用蓝牙(ZT)

    使用 爱立信T68i.索爱T628 与 Billionton USB Bluetooth Adapter 在Debian Kernel-2.6.0内核下测试通过. (本人购买的台产Billionton ...

  9. linux mount 日志,Linux mount (第一部分)

    本篇将介绍一些比较实用的mount用法,包括挂载内核中的虚拟文件系统.loop device和bind mount. 下面的所有例子都在ubuntu-server-x86_64 16.04下执行通过 ...

  10. linux 僵死日志,linux 僵死进程及处理

    =========================================== defunct 进程只是在process table里还有一个记录,其他的资源没有占用,除非你的系统的proce ...

最新文章

  1. proxmox 宕机转义_Proxmox+Ceph的HCI环境搭建
  2. webpack 配置文件.conf.js 浅理解
  3. 使用face_recognition(二)目标人脸“实时”检测
  4. 使用纯 Win32 API 编程实现Winpcap 封包捕获的第一个例子
  5. React项目动态设置title标题
  6. Ubuntu 下 Git 服务器的安装和初级配置
  7. 最大连续子序列----DP动态规划
  8. 软件测试是找BUG,不是找茬
  9. 解决- SecureCRT上运行 linux vim 命令中文出现乱码
  10. 那年学过的Java笔记三核心类库一
  11. Android 之 下拉框(Spinner)的使用
  12. 使用Java 自身Timer API实现定时器的方法
  13. KY-RTI分布仿真技术:第八章 Visual C#程序设计
  14. win10设置计算机关机时间,win10怎样固定时间关机_win10怎样设置电脑关机时间设置...
  15. 组合dp hdu-4489-The King’s Ups and Downs
  16. Element UI 应用精讲
  17. Python文本文件的输入输出
  18. 洞察——风格注意力网络(SANet)在任意风格迁移中的应用
  19. Geometric multimodal representation learning
  20. Python 信号处理——时域同步平均技术(TSA)

热门文章

  1. AppUse学习笔记
  2. 190225每日一句
  3. Python 学习小记
  4. atitit 各个技术领域的top 200领域
  5. Atitit oracle新特性5 6 7 8 9 10 11 12 18 19 20 attilax总结 目录 1.1. :ora 20c 1 1.2. Oracle Database 19c 的
  6. Atitit Hadoop的MapReduce的执行过程、数据流的一点理解。 目录 1. Why 为什么使用hadoop 1 2. Hadoop的MapReduce的执行过程 1 2.1. Had
  7. Atitit pg10分区 总结 1.1. create table tmp_log (  1 1.2. -创建索引 1 1.3. 查看表 in pgadmin4 2 2. 二 分区表管理 2 2.1
  8. Atitit 基于图片图像 与文档混合文件夹的分类
  9. atitit.js 与c# java交互html5化的原理与总结.doc
  10. Atitit.并发测试解决方案(2) -----获取随机数据库记录 随机抽取数据 随机排序 原理and实现