linux - 是否可以将内核消息从特定进程传输到文件

标签 linux logging linux-kernel pipe

因为这是一个 Linux 问题,我会注意我使用的是 OpenSUSE 12.1

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

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

有没有办法将来自一个特定进程的“printk”消息通过管道传输到一个文件?

编辑 我现在看到如果我将特定标记添加到我的调试消息中有可能,还有其他方法吗?

最佳答案

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

更新

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

Syslog-ng 将从/proc/kmsg 读取数据,然后通过过滤器(过滤器只是一种特殊模式)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-1.ko

在/var/log/messages 中你可以找到:

Sep 20 17:46:20 ns1 kernel: [96643.968650] [hello]Hello world 1.

好的,让我们配置 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); };

关于linux - 是否可以将内核消息从特定进程传输到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12500273/

相关文章:

使用 Qemu 进行 Linux 内核开发?

linux - 根据 sacct 数据选择 slurm 作业

python - 从 systemd 运行持久性 python 脚本?

linux - 循环 Linux Shell 的空主体

database-design - 审计日志的数据库设计

linux - 想要一个2.6.38以上内核版本使用aes加密方式的例子

linux - 如何使用 linux 命令删除新行

python 日志记录 - 如何将路径名截断为最后几个字符或文件名?

git - 如何从 git log 输出中获取特定的 SHA

linux-kernel - 4.8 内核中的 sys_call_table 读保护吗?