2013-11-15 83 views
0

我有兩個用戶進程A和B.兩者都使用syslog使用設施LOG_USERsyslog:進程特定的優先級

我想要有不同的閾值水平爲他們:

  • 對於A,只有優先ERR及以上必須登錄
  • 對於B,只有優先CRIT和 - 上述消息的消息必須登錄

我發現,如果我設置/etc/syslog.conf作爲

user.err /var/log/messages 

然後記錄ERR-and-above的消息,但是來自A和B.

如何針對不同進程具有不同的最低閾值級別?

注:我正在探索是否有基於配置文件的解決方案。否則,還有另一種方法可行。在每個過程中,我們可以使用setlogmask()來安裝特定於進程的優先級掩碼。

EDIT(11月18日):我想用syslog和一些便攜式解決方案。

+0

提及您正在使用的syslog的哪些實現。答案在某種程度上取決於實現特定的配置文件語法 –

+0

@Sami:我正在使用Linux CentOS。你在找什麼信息?我可以運行一些命令或查找某個文件來找出它? – Arun

回答

0

本教程http://www.freebsd.org/cgi/man.cgi?query=syslog.conf&sektion=5幫助了我。以下似乎工作:

# process A: log only error and above 
!A 
*.err    /var/log/messages 

# process B: log only critical and above 
!B 
*.critical   /var/log/messages 

# all processes other than A and B: log only info and above 
!-A,B 
*.info    /var/log/messages 
1

基於配置文件的解決方案可用。我認爲CentOS默認附帶rsyslog,即使沒有,你也可以隨yum一起安裝rsyslog。這個解決方案只適用於rsyslog,沒有別的。

雖然這是一個趕上。你不能在具有相同名稱的進程之間使用rsyslog(或幾乎所有的syslog守護進程實現)分離日誌消息。相同的可執行路徑。但是,rsyslog允許您根據程序名稱篩選消息。這裏有一個可能的解決方案:大多數程序使用argv [0]調用openlog(3),即。作爲第一個參數的可執行名稱。現在既然你沒有透露你正在運行的實際程序,我沒有辦法爲你確定,但我總是可以閱讀你自己程序的源代碼。

在大多數情況下,可執行路徑是程序名稱,雖然一些守護進程不會弄亂argv [0](着名的例子是postfix和sendmail)。另一方面,Rsyslog提供了一種過濾機制,允許用戶根據發送程序的名稱來過濾消息(現在您可能會看到如何全部連接到openlog(3)的調用方式)。因此,我們可以對程序名稱進行過濾,而不是直接過濾進程。我們可以通過創建符號鏈接來影響。

所以,這個解決方案只適用於下列條件:a)你運行的進程在開始執行之後並沒有擺弄argv [0]; b)可以爲二進制文件創建符號鏈接,從而爲同一個程序創建兩個不同的名稱; c)你的程序使用argv [0]作爲調用的第一個參數調用openlog(3)。

鑑於這些兩個條件,則可以簡單地在/etc/rsyslog.conf這樣的(直接從rsyslog documentation例如)過濾消息:

if $programname == 'prog1' then { 
    action(type="omfile" file="/var/log/prog1.log") 
} 
if $programname == 'prog2' then { 
    action(type="omfile" file="/var/log/prog2.log") 
} 

例如如果您的程序被調用/usr/bin/foobar,並且您創建了指向/usr/bin/foobar的符號鏈接/usr/bin/prog1/usr/bin/prog2,則上述配置文件示例將分別將來自作爲「prog1」和「prog2」啓動的進程的消息分別指向不同的日誌文件。這個例子不會擺弄其他任何東西,因此所有這些消息仍然會轉到常規日誌文件,除非您明確地將其過濾掉。

+0

謝謝(+1),但是,我只想使用syslog。我現在已經明確提到它。 – Arun

+0

那麼你的問題的答案根本不是。這隻能用syslog完成。 –