我有两个用户进程A和B.两者都使用LOG_USER
工具使用syslog
。
我希望它们具有不同的阈值水平:
我发现如果我将/etc/syslog.conf
设置为
user.err /var/log/messages
然后记录ERR-and-above的消息,但是来自A和B.
如何为不同的流程设置不同的最低阈值水平?
注意:我正在探索是否有基于配置文件的解决方案。否则,还有另一种方法可行。在每个过程中,我们都可以使用setlogmask()
来安装特定于进程的优先级掩码。
编辑(11月18日):我想使用 syslog
和一些便携式解决方案。
答案 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