2012-09-19 38 views
3

因爲它是一個Linux的問題,我會注意到我使用的OpenSUSE 12.1是可以管內核消息從特定進程文件

我運行一個內核模塊,基本上它是一個CAN總線模擬器,並且只要在'總線'上有活動,就通過printk()打印消息。

我正在跟蹤sudo cat /proc/kmsg的消息,但是當我開始在「總線」上放置其他「設備」時,kmsg流量受到極大的影響,很難找到我的消息。

反正有沒有將「printk」消息從一個特定的進程傳輸到文件?

編輯 我看到現在有possibilties如果我添加特定的標記,以我的調試消息,還有什麼別的辦法嗎?

回答

6

是的,你可以。所有內核消息都可以保存syslog-ng守護進程。對於這個守護進程,您可以編寫自定義規則並將模塊中的所有消息放到特定文件中。採取先來看看/etc/syslog-ng/syslog-ng.conf

更新

默認情況下,所有的內核打印和printk的功能把消息發送到內核環緩衝區。用戶空間程序可以訪問這個環形緩衝區思想/ proc/kmsg文件。 (通過過濾器只是特殊模式)grep輸出並把數據放在不同的輸出中(在這個例子中它只是文本文件)。然後,Syslog-ng將從/ proc/kmsg讀取數據。如果輸出緩衝區,我們會發現從內核模塊 「你好」 輸出,syslog-ng的就會把郵件到/ var /日誌/你好,所有其它消息會去到/ 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中,你可以找到:

年09月20十七點46分20秒NS1內核:[96643.968650] [你好]世界你好1.

確定,允許配置syslog-NG捉grep的日誌消息(通過使用圖案[你好] )

$貓/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); }; 
+0

好吧,我想這不是在我的發行版中,所以我下載了它並觀看了一下。語法上的任何例子?我得到了一些...但我看不到過濾器如何映射到它正在過濾的過程。 – Mike

+0

這只是簡單的正則表達式。我更新了答案 – Maxim

+0

+1優秀的答案和例子。如果還有其他答案不涉及我標記我的所有照片,我會將問題留待一天,但我認爲這將被接受。謝謝! – Mike

2

還有另一種方式來實現這一目標:使用任何最近的內核內置的「ftrace」的支持。 a)對於非常高批量的printk流量,printk可能導致系統瓶頸甚至崩潰 - 那麼您應該切換到使用trace_printk();它的開銷幾乎是微不足道的(尤其是與printk相比) b)ftrace能夠爲特定進程過濾ftrace環形緩衝區。

PL讀到這裏的細節(任何最近的內核源代碼樹中): 文檔/跟蹤/ ftrace.txt

ADDN資源: 「調試使用Ftrace內核 - 第1部分」 http://lwn.net/Articles/365835/ (另見第2部分)。

相關問題