![如何将 rsyslog 消息从特定的 unix 套接字重定向到不同的日志文件而不重复?](https://linux22.com/image/212003/%E5%A6%82%E4%BD%95%E5%B0%86%20rsyslog%20%E6%B6%88%E6%81%AF%E4%BB%8E%E7%89%B9%E5%AE%9A%E7%9A%84%20unix%20%E5%A5%97%E6%8E%A5%E5%AD%97%E9%87%8D%E5%AE%9A%E5%90%91%E5%88%B0%E4%B8%8D%E5%90%8C%E7%9A%84%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6%E8%80%8C%E4%B8%8D%E9%87%8D%E5%A4%8D%EF%BC%9F.png)
我一直在尝试为 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 等进行过滤,因为无论如何您都应该只获取这些行。