`
kongweile
  • 浏览: 517405 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

printk与syslog(至少在Redhat中是这样的)+Ubuntu下用最简单的读到/proc/kmsg

 
阅读更多

在头文件 <linux/kernel.h> 中定义了 【8种可用的日志级别字符串】
KERN_EMERG    用于紧急事件消息,它们一般是系统崩溃之前提示的消息。
KERN_ALERT    用于需要立即采取动作的情况。
KERN_CRIT     临界状态,通常涉及严重的硬件或软件操作失败。
KERN_ERR      用于报告错误状态;设备驱动程序会经常使用KERN_ERR来报告来自硬件的问题。
KERN_WARNING  对可能出现问题的情况进行警告,这类情况通常不会对系统造成严重问题。
KERN_NOTICE   有必要进行提示的正常情形。许多与安全相关的状况用这个级别进行汇报。
KERN_INFO     提示性信息。很多驱动程序在启动的时候,以这个级别打印出它们找到的硬件信息。
KERN_DEBUG    用于调试信息。 

dmesg是从kernel的ring buffer(环缓冲区)中读取信息的.

那什么是ring buffer呢?
    在LINUX中,所有的系统信息(包内核信息)都会传送到ring buffer中.而内核产生的信息由printk()打印出来。系统启动时所看到的信息都是由该函数打印到屏幕中。 printk()打出的信息往往以 <0>...<2>... 这的数字表明消息的重要级别。高于一定的优先级别会打印到屏幕上,否则只会保留在系统的缓冲区中(ring buffer)。
    至于dmesg具体是如何从ring buffer中读取的,大家可以看dmesg.c源代码.很短,比较容易读懂.

     是syslogd这个守护进程根据/etc/syslog.conf,将不同的服务产生的Log记录到不同的文件中.
    LINUX系统启动后,由/etc/init.d/sysklogd先后启动klogd,syslogd两个守护进程。
    其中klogd会通过syslog()系统调用或者读取proc文件系统来从系统缓冲区(ring buffer)中得到由内核printk()发出的信息.而syslogd是通过klogd来读取系统内核信息(klogd将读到的东西发给syslogd).

 

Klogd和syslogd都是用户空间进程。
    1> 所有系统信息是输出到ring buffer中去的.dmesg所显示的内容也是从ring buffer中读取的.
    2> LINUX系统中/etc/init.d/sysklogd会启动2个守护进程:Klogd, Syslogd
    3> klogd是负责读取内核信息的,有2种方式:
       syslog()系统调用(这个函数用法比较全,大家去MAN一下看看)直接的对/proc/kmsg进行读取(再这提一下,/proc/kmsg是专门输出内核信息的地方)
    4> Klogd的输出结果会传送给syslogd进行处理,syslogd会根据/etc/syslog.conf的配置把log信息输出到/var/log/下的不同文件中.

注意将printk与syslog接合使用, 用在内核开发方面很不错.
将/etc/syslog.conf
kern.*     /tmp/my_kernel_debug.txt

在输出的文件中查看结果很不错.

 

--------------------------------------------------------------------------------------

在Ubuntu下因为做的配置文件和Redhat有些许不同,这样会比较不爽。等真正想在Ubuntu下工作了再详细查看他的日志服务器的类型吧,一般的都用Redhat下作开发。

那就不用Ubuntu提供的机制,自己直接单独开一个窗口,并用窗口去cat /proc/kmsg来查看信息,它会block住,然后随着我的调试不断打印。当有printk打印出信息的时候,自然会在窗口中打印出来的。

分享到:
评论

相关推荐

    一个台湾人写的ppt,关于proc部分的解释挺清楚的

    `printk()` 将消息写入一个循环队列,然后唤醒等待的进程,通常是通过`syslog()`系统调用进入休眠状态的进程或者读取`/proc/kmsg`的进程。`syslogd`和`klogd`是日志记录引擎,它们可以等价地处理内核消息,但直接...

    高通平台printk输出log到串口

    1、查看当前打印级别 ... # echo 8 &gt; /proc/sys/kernel/printk //这样串口才能打印数据 3、内核函数printk的打印级别宏定义:Include/linux/kernel.h #define KERN_EMERG /* system is unusable */ #define KERN_ALERT

    Linux:printk与printf的区别

    在内核层是调用不了文件系统中C库的printf只能用printk。  两者之间的一个显著区别在于printk允许通过指定一个标志来设置优先级(在include/linux/kern_levels.h中定义),不写则默认为级别4(MESSAGE_LOGLEVEL_...

    Kernel-Debug-Series-Part3-printk

    开发者可以通过`/proc/kmsg`接口读取这些消息。 2. 日志级别控制:通过`syslog`系统调用或者`/etc/sysctl.conf`配置文件,可以改变内核日志级别,以控制哪些级别的信息被记录。 3. 输出重定向:默认情况下,printk...

    Linux驱动程序调试的常用方法.pdf

    printk 的功能与我们经常在应用程序中使用的 printf 是一样的,不同之处在于 printk 可以在打印字符串前面加上内核定义的宏,例如 KERN_ALERT、KERN_CRIT 等。这些宏是用来定义需要打印的字符串的级别。值越小,级别...

    printk调试技术

    为了在特定条件下控制`printk`的输出,可以使用`__init`和`__exit`宏,这些宏会在模块加载或卸载时自动清理`printk`语句,避免在系统正常运行时产生不必要的日志。此外,还可以使用`pr_debug`宏来实现条件编译,仅在...

    printk_linux_

    在早期的Linux内核版本中,printk是系统内核与外部世界沟通的主要途径之一,负责将内核运行过程中的信息传递到控制台或者日志文件中。 printk函数的设计允许开发者通过不同的日志级别来控制输出信息的重要性。这些...

    Linux 设备分配清单

    - /dev/kmsg:内核消息设备,向此设备写入的内容将显示为printk消息。 7. RAM磁盘 - /dev/ram0到/dev/ram250:RAM磁盘设备,其中/dev/initrd通常用于存储启动时加载的初始RAM磁盘。 8. 虚拟终端(PTY) - /dev/...

    linux console printk 代码实现分析

    在Linux内核的启动过程中,printk函数通过将消息写入到全局变量__log_buf中,该缓冲区的大小定义为__LOG_BUF_LEN。这意味着在console初始化完成之前,内核已经能够记录消息了,但这些消息暂时不能显示在控制台上。...

    linux 内核死锁检测

    例如,在 `/proc/lockdep` 中可以看到锁的依赖关系图,而在 `/proc/lockdep_stats` 中则可以找到关于锁使用频率和冲突的统计数据。 此外,通过内核的日志输出,我们也能够获得有关死锁发生的上下文信息。结合这些...

    Android 实现自己的LOG信息

    开发者可以通过在Ubuntu环境下运行模拟器,并使用`adb shell`命令进入Android系统的shell,然后通过`cat /proc/kmsg`查看这些日志信息。 接下来,我们转向用户空间的程序开发。Android为用户空间的C/C++和Java代码...

    Ubuntu下内核编程之第一个模块helloworld(附源码)

    在Ubuntu下进行内核模块开发,首先需要安装必要的工具,如`build-essential`和`linux-header-$(uname -r)`。`build-essential`包含了许多基础的编译工具,如GCC编译器,而`linux-header-$(uname -r)`则提供了当前...

    linux proc PDF

    `proc` 文件系统常常与内核模块一起使用,允许模块在加载时创建相应的 `proc` 条目,在卸载时删除它们。 ##### 权限和所有者 每个 `proc` 文件都有其权限设置,可以通过设置文件操作结构中的 `.open` 方法来控制...

    Linux系统驱动开发调试技术指南.docx

    这样,在开发阶段可以轻松插入和移除调试语句,而在发布产品时只需简单地取消对`LED_DEBUG`的定义即可。 此外,当驱动程序出现异常时,内核可能会通过OOP消息(实际上是指`Oops`,意为“哎呀”或“出错了”)来报告...

    linux Kernel module简单模拟ps指令输出

    在Linux操作系统中,内核模块(Kernel module)是可加载到内核中的代码段,用于扩展内核功能。本文将探讨如何通过编写一个简单的Linux内核模块来模拟`ps`命令,该命令用于显示系统中当前运行的进程状态。首先,我们...

    printk-formats打印格式1

    在Linux内核编程中,`printk`是一个用于打印调试信息的重要函数,类似于C语言中的`printf`。本文将深入探讨`printk`格式化字符串的使用,特别是针对不同类型的变量选择正确的格式指定符,这对于理解和编写可靠的内核...

    linux内核驱动调试方法1

    在 printk 调用路径中,vprintk 函数将输出信息输入到临时 buffer 中,然后释放控制台信号量,然后将输出信息输出到串口中。 printk 的打印级别 printk 的打印级别有八个级别,分别是: * KERN_EMERG:系统不可用...

    Linux1210-PPT

    - **健壮性**:`printk`可以在不同的上下文中使用,比如在中断处理程序、进程上下文或者持有锁的情况下。 - **脆弱性**:在某些特定情况下,比如系统尚未完全初始化之前,`printk`可能无法正常工作。 2. **记录...

    ubuntu12.04编译内核模块

    Ubuntu 12.04 编译内核...本文详细介绍了在 Ubuntu 12.04 下编译内核模块的步骤,从前期准备到编写 hello.c 文件和 Makefile 文件,再到编译、加载和卸载内核模块。通过这些步骤,可以轻松地编译和加载自己的内核模块。

Global site tag (gtag.js) - Google Analytics