我想将 rsyslog 的输出消息写入 Unix 域套接字。我想这样做,以便我可以使用我的脚本从该套接字读取消息并进一步解析日志消息。
我尝试使用omuxsock
但它没有创建任何套接字。
这可能吗?如果可能,我该如何正确配置 rsyslog 以写入套接字?
编辑:
这是我编辑的/etc/rsyslog.conf
$ModLoad omuxsock
$OMUxSockSocket /tmp/sock
*.* :omuxsock:
答案1
是的,这是可能的,并且给定的配置已经是正确的*,根据 rsyslog 文档:http://www.rsyslog.com/doc/v8-stable/configuration/modules/omuxsock.html。
但是,在“omuxsock ... 没有创建任何套接字”这句话中有一个错误的假设。omuxsock 不应创建套接字;它应传输到现有套接字。这可能是 @HBruijn 建议包括“用于尝试设置套接字”配置的原因。
以下是 Python 中此类设置的一个示例:
import socket
sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
sock.bind('/tmp/sock')
print(sock.recv(4096))
这与问题中给出的配置一起工作,并且会阻塞直到它通过套接字接收到消息。
请注意,omuxsock 仅支持 SOCK_DGRAM,而不支持 SOCK_STREAM(在上面的例子中是 Python 的默认设置),因此是无连接的(认为是 UDP 而不是 TCP)。
*当然假设已经定义了某种输入机制,并且希望将所有内容(先前未排除的)记录到给定的套接字。
答案2
使用 socket.SOCK_DGRAM 创建的套接字不可靠,接收方读取的数据可能与发送方写入的数据顺序不一致。例如,如果您使用 omuxsock 接收大型 xml 消息(Windows 事件),则无法保证收到的行的顺序,并且您无法控制实际字节数。如果有人担心数据顺序,我宁愿使用 omprog。请纠正我。