如何将 rsyslog 消息从特定的 unix 套接字重定向到不同的日志文件而不重复?

如何将 rsyslog 消息从特定的 unix 套接字重定向到不同的日志文件而不重复?

我一直在尝试为 haproxy 实现单独的日志记录。但我最终得到了重复的日志记录,并且无法仅根据输入套接字或设施来分离日志。

我在 haproxy 中的示例配置:

全局配置:

log                           /dev/log len 1024 format local local0 debug

前端-1配置(用于Web请求):

log                           /dev/request-log len 1024 format local local1 debug

Frontend-2 配置(用于数据库请求):

log                           /dev/db-log len 1024 format local local2 debug

所以在这里我基本上试图将日志重定向到不同的套接字,此外我还为每个套接字使用了不同的设施,因为我不知道如何根据输入套接字重定向消息。

在 rsyslog 配置中,我添加了以下内容:

$AddUnixListenSocket /var/lib/haproxy/dev/log
local0.* /var/log/haproxy/haproxy.log
$AddUnixListenSocket /var/lib/haproxy/dev/request-log
local2.* /var/log/haproxy/requests.log
$AddUnixListenSocket /var/lib/haproxy/dev/db-log
local3.* /var/log/haproxy/db.log

但上述所有日志文件都具有相同的日志记录,即 Web 请求日志记录、数据库日志记录和其他 haproxy 日志记录都在这三个文件中重复。并且包括默认的 /var/log/messages。

完成 rsyslog.conf:

$ModLoad imuxsock
$ModLoad imjournal
$WorkDirectory /var/lib/rsyslog
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$SystemLogSocketName /run/systemd/journal/syslog
$OmitLocalLogging on
$IMJournalStateFile imjournal.state
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
authpriv.*                                              /var/log/secure
mail.*                                                  -/var/log/maillog
cron.*                                                  /var/log/cron
*.emerg                                                 :omusrmsg:*
uucp,news.crit                                          /var/log/spooler
local7.*                                                /var/log/boot.log
local1.* /var/log/keepalived.log
$AddUnixListenSocket /var/lib/haproxy/dev/log
local0.* /var/log/haproxy/haproxy.log
$AddUnixListenSocket /var/lib/haproxy/dev/request-log
local2.* /var/log/haproxy/requests.log
$AddUnixListenSocket /var/lib/haproxy/dev/db-log
local3.* /var/log/haproxy/db.log

注意:上述配置中提到的 keepalived.log 也存在同样的问题。

如果我使用类似的东西而不是使用工具,我会发现日志记录工作正常,没有任何重复:

:programname, startswith, "haproxy" {
  /var/log/haproxy/haproxy.log
  stop
}

但是,当可以很容易地根据输入套接字或设施名称过滤掉消息时,这是不需要的额外处理。任何人都可以帮助我理解为什么会发生重复,但对于其他默认部分(如 cron、mail、authpriv 等没有重复的情况)则不然。或者如何根据套接字输入重定向消息?

答案1

限制处理是通过规则集。这些允许您将一组过滤器分组在一起并仅将它们应用于给定的输入。规则集之外的过滤器仅像往常一样接收其他输入。虽然您可以使用规则集的旧语法,但使用 RainerScript 风格会更容易一些,例如:

ruleset(name="rule1"){
  *.* action(type="omfile" file="output1")
}
ruleset(name="rule2"){
  *.* action(type="omfile" file="output2")
}
input(type="imuxsock" socket="/tmp/sock1" Ruleset="rule1")
input(type="imuxsock" socket="/tmp/sock2" Ruleset="rule2")
*.* -./output3

此配置将读取套接字/tmp/sock1并应用rule1 匹配所有行的规则集并将它们放入 file 中output1。类似地,sock2 数据被放入output2,普通输入被放入output3

因此,将最后 6 行替换为

ruleset(name="rule1"){
  *.* action(type="omfile" file="/var/log/haproxy/haproxy.log")
}
input(type="imuxsock" socket="/var/lib/haproxy/dev/log" Ruleset="rule1")

等等。您不需要对 local0 等进行过滤,因为无论如何您都应该只获取这些行。

相关内容