syslog:进程特定的优先级

时间:2013-11-15 21:25:39

标签: linux unix configuration syslog bsd

我有两个用户进程A和B.两者都使用LOG_USER工具使用syslog

我希望它们具有不同的阈值水平:

  • 对于A,只有优先级为ERR-and-above的消息必须记录
  • 对于B,只有优先级为CRIT-and-above的消息必须记录

我发现如果我将/etc/syslog.conf设置为

user.err    /var/log/messages

然后记录ERR-and-above的消息,但是来自A和B.

如何为不同的流程设置不同的最低阈值水平?

注意:我正在探索是否有基于配置文件的解决方案。否则,还有另一种方法可行。在每个过程中,我们都可以使用setlogmask()来安装特定于进程的优先级掩码。

编辑(11月18日):我想使用 syslog 和一些便携式解决方案。

2 个答案:

答案 0 :(得分: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那样过滤if $programname == 'prog1' then { action(type="omfile" file="/var/log/prog1.log") } if $programname == 'prog2' then { action(type="omfile" file="/var/log/prog2.log") } 上的消息(例如直接来自rsyslog documentation):

/usr/bin/foobar

E.g。如果您的程序被调用/usr/bin/prog1,并且您创建了指向/usr/bin/prog2的符号链接/usr/bin/foobar和{{1}},则上述配置文件示例将引导来自进程的消息“prog1”和“prog2”分别为不同的日志文件。此示例不会涉及其他任何内容,因此所有这些消息仍将转到常规日志文件,除非您明确过滤它们。

答案 1 :(得分: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