繁体   English   中英

syslog:特定于进程的优先级

[英]syslog: process specific priority

我有两个用户进程A和B。都使用设施LOG_USER使用syslog

我想为他们设置不同的阈值级别:

  • 对于A,仅必须记录优先级为ERR或更高的消息。
  • 对于B,仅必须记录优先级CRIT和更高的消息

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

user.err    /var/log/messages

然后记录错误消息及以上,但来自A和B。

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

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

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

提供了基于配置文件的解决方案。 我认为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文档 ):

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/prog1/usr/bin/prog2都指向/usr/bin/foobar ,则上面的配置文件示例将直接来自进程的消息分别以“ prog1”和“ prog2”开头到不同的日志文件。 此示例将不做任何其他工作,因此所有这些消息仍将进入常规日志文件,除非您明确地将其过滤掉。

本教程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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM