2013-11-15 49 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完成。 –