可以通过管道将内核消息从特定进程发送到文件



由于这是一个Linux问题,我会注意到我使用的是OpenSUSE 12.1

我正在运行一个内核模块,基本上它是一个CAN总线模拟器,只要"总线"上有活动,它就会通过printk()打印消息。

我现在正在用sudo cat /proc/kmsg跟踪消息,但当我开始将其他"设备"放在"总线"上时,kmsg流量会大大增加,很难找到我的消息。

是否存在将"printk"消息从一个特定进程管道传输到文件的方法?

EDIT我现在明白了,如果我在调试消息中添加特定的标记,还有其他方法吗?

是的,你可以。所有内核消息都可以包含syslog ng守护进程。对于这个守护进程,您可以编写自定义规则,并将模块中的所有消息放到特定文件中。首先看一下/etc/syslog ng/syslog-ng.conf

更新

默认情况下,所有内核print和printk函数都将消息放入内核环形缓冲区。用户空间程序可以访问这个环形缓冲区思想/proc/kmsg文件。

Syslog ng将从/proc/kmsg读取数据,然后通过filter(filter只是一种特殊模式)grep输出,并将数据放入不同的输出中(在本例中,它只是文本文件)。如果在输出缓冲区中,我们会发现内核模块"hello"的输出,syslog ng会将消息放入/var/log/hello,所有其他消息都会放入/var/log/messages

模块源

#include <linux/module.h>       
#include <linux/kernel.h>       
#define MODNAME "[hello]"
int init_module(void)
{
printk(KERN_WARNING MODNAME "Hello world 1.n");    
return 1;
}
void cleanup_module(void)
{
printk(KERN_ALERT "Goodbye world 1.n");
}

insmod 之后

insmod hello-1ko

在/var/log/messages中,您可以找到:

9月20日17:46:20 ns1内核:[96443.968650][hello]hello world 1。

ok,让我们配置syslog ng来捕获grep日志消息(通过使用模式[hello])

$cat/etc/syslog ng/syslog-ng.conf

@version: 3.2
# $Header: /var/cvsroot/gentoo-x86/app-admin/syslog-ng/files/syslog-ng.conf.gentoo.3.2,v 1.1 2011/01/18 17:44:14 mr_bones_ Exp $
#
# Syslog-ng default configuration file for Gentoo Linux
options {
chain_hostnames(no);    
stats_freq(43200);
mark_freq(3600);
};
source src {
unix-stream("/dev/log" max-connections(256));
internal();
file("/proc/kmsg");
};
destination messages { file("/var/log/messages"); };
# output file for ower module
destination hello_messages { file("/var/log/hello"); };   
# grep patterns for ower module
filter f_hello { match("hello" value("MESSAGE")); };
filter f_kernel { facility(kern); };
log { source(src); destination(messages); };
log { source(src); destination(console_all); };
# target for logging    
log { source(src); filter(f_hello); filter(f_kernel); destination(hello_messages); };

还有另一种方法可以实现这一点:使用任何最新内核的内置"ftrace"支持。

a) 对于非常高的printk流量,printk可能会导致系统瓶颈甚至崩溃——然后应该切换到使用trace_printk();它的开销几乎微不足道(特别是与printk相比)b) ftrace能够过滤特定进程的ftrace环形缓冲区。

Pl在此处(在任何最近的内核源代码树中)读取详细信息:文档/trace/ftrace.txt

添加资源:"使用Ftrace调试内核-第1部分"http://lwn.net/Articles/365835/(同样参见第2部分)。

最新更新