Hi all:
我想在我的嵌入式系統中弄個syslog的機制,
我使用busybox提供的syslogd和klogd,
關於這方面目前我所認知的是:
(1)使用syslog()函數可以讓一般的Application將message紀錄到
/var/log/messages中, 但是syslogd必須要啟動, 否則訊息不會被寫入/var/log/messages中.
(2)使用printk()函數可以讓Kernel Module把訊息紀錄到/var/log/messages中,
但是syslogd和klogd都必須先啟動, 否則訊息不會被寫入/var/log/messages中.
---
但是因為我又不想紀錄太多的訊息, 所以我想詢問的是要怎麼對訊息做過濾,
關於這方面目前我所認知的是:
(1)使用syslog()函數時可以設定level, 關於level的定義如下:
0: LOG_EMERG
1: LOG_ALERT
2: LOG_CRIT
3: LOG_ERR
4: LOG_WARNING
5: LOG_NOTICE
6: LOG_INFO
7: LOG_DEBUG
例如, 如果我在Application中寫了這樣的程式碼:
syslog(LOG_NOTICE, "System Message - Notice");
syslog(LOG_INFO, "System Message - Info");
syslogd啟動後執行, 會在/var/log/messages中看到下面兩項訊息:
Jan 1 00:00:50 Hostname syslog.notice System log daemon exiting.
Jan 1 00:00:50 Hostname syslog.info System log daemon exiting.
(2)使用printk()函數也可以設定level, 定義如下:
0: KERN_EMERG, 系統無法使用
1: KERN_ALERT, 必須立即執行
2: KERN_CRIT, 緊急狀態
3: KERN_ERR, 錯誤狀態
4: KERN_WARNING, 警告狀態
5: KERN_NOTICE, 正常狀態且十分重要
6: KERN_INFO, 報告
7: KERN_DEBUG, debug-level訊息
例如, 我寫了一個簡單的kernel module,
再insmod時會 printk("<4>Hello, World\n");
若klogd和syslogd"同時啟動"(我測試的結果似乎兩個都要啟動?)
insmod之後會在/var/log/messages中看到:
Jan 1 00:39:38 Hostname user.warn kernel: Hello, World
---
我想做的事情就是做過濾, 比如說我只想讓syslogd 紀錄
LOG_ERR以上的層級(就是只顯示0~3的層級) <== 對一般Application而言
KERN_ERR以上的層級(就是只顯示0~3的層級) <== 對kernel事件而言
要如何做到呢?
---
另外, 我還發現一件詭異的事情, 測試這兩個case時,
如果使用remote logging (指令: syslogd -R <ip>)
我發現application的訊息可以被傳到遠端,
但是kernel module所紀錄的訊息只能被紀錄在target端, 無法傳送到遠端!
不知道是什麼原因, 有人試過嗎?
---
OK~以上是我目前的測試和認知, 如果各位也有開發過syslog的話,
請給我一點建議和觀念上的指證, 謝謝!