我创建了一条规则来重定向文件 /etc/rsyslog.d/40-filter.conf 中包含 {FILTER} 的消息
:msg,contains,"{FILTER}" /var/log/filter.log
& ~
我已经编辑了文件 /etc/rsyslog.conf,因此它通过取消注释行来接受远程 UDP 消息
$ModLoad imudp
$UDPServerRun 514
我的系统日志消息的来源是以下简单的 python 脚本
#! /usr/bin/python
import logging
import logging.handlers
logger = logging.getLogger('LoggingTest')
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('{FILTER} %(message)s')
handler = logging.handlers.SysLogHandler()
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.info("Test Message")
我使用重新启动 rsyslog
sudo service rsyslog restart
当我运行脚本时,以下行出现在 /var/log/messages、/var/log/syslog 和 /var/log/user.log 中,但它不会出现在 /var/log/filter.log 中,该日志存在但仍然存在空的。
Jun 23 17:18:29 {FILTER} Test Message
如果我使用命令行工具“记录器”(下面给出的命令行示例),则规则将正确应用
$ logger "{FILTER} Test Message 2"
$ cat /var/log/filter.log
Jun 23 17:21:28 NDU1010 nick: {FILTER} Test Message 2
为什么该规则没有应用于来自我的 python 脚本的消息?我无法解释这一点。
答案1
从您给出的输出来看,python 脚本似乎没有发送 rsyslog 期望的所有 syslog 消息片段。看起来好像“{FILTER}”部分是主机和应用程序名称应该在的位置。您可以通过使用 -d 标志运行 rsyslogd 然后从 python 发送消息,然后从记录器发送消息来很容易地证明这一点。您将看到来自套接字的原始消息,我打赌您会看到记录器在“{FILTER}”部分前面发送更多字段。