rsyslog 规则应用不一致

Sup*_*rMe 5 logs rsyslog syslog

我创建了一个规则来重定向文件 /etc/rsyslog.d/40-filter.conf 中包含 {FILTER} 的消息

:msg,contains,"{FILTER}" /var/log/filter.log
& ~
Run Code Online (Sandbox Code Playgroud)

我编辑了文件 /etc/rsyslog.conf 以便它通过取消注释行来接受远程 UDP 消息

$ModLoad imudp
$UDPServerRun 514
Run Code Online (Sandbox Code Playgroud)

我的系统日志消息的来源是以下简单的 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")
Run Code Online (Sandbox Code Playgroud)

我重新启动了 rsyslog 使用

sudo service rsyslog restart
Run Code Online (Sandbox Code Playgroud)

当我运行我的脚本时,以下行出现在 /var/log/messages、/var/log/syslog 和 /var/log/user.log 中,但它没有出现在 /var/log/filter.log 中,它存在但仍然存在空的。

Jun 23 17:18:29 {FILTER} Test Message
Run Code Online (Sandbox Code Playgroud)

如果我使用命令行工具“记录器”(下面给出的命令行示例),则规则应用正确

$ logger "{FILTER} Test Message 2"
$ cat /var/log/filter.log
Jun 23 17:21:28 NDU1010 nick: {FILTER} Test Message 2
Run Code Online (Sandbox Code Playgroud)

为什么规则不适用于来自我的 python 脚本的消息?我不知道如何解释这一点。

pol*_*ial 1

从您给出的输出来看,python 脚本似乎没有发送 rsyslog 期望的所有 syslog 消息片段。看起来好像“{FILTER}”部分是主机和应用程序名称应该在的位置。您可以通过使用 -d 标志运行 rsyslogd 然后从 python 发送消息,然后从记录器发送消息来很容易地证明这一点。您将看到原始消息,因为它以这种方式来自套接字,并且我打赌您会看到记录器在“{FILTER}”部分前面发送更多字段。