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