![使用 systemd Arch Linux 接收 Syslog 消息](https://linux22.com/image/45109/%E4%BD%BF%E7%94%A8%20systemd%20Arch%20Linux%20%E6%8E%A5%E6%94%B6%20Syslog%20%E6%B6%88%E6%81%AF.png)
我感觉我忽略了显而易见的事情,但我不知道如何获取我的 Arch Linux 服务器,它使用systemd
, 来接收和记录syslog
来自远程系统的消息。
我有一个 Cisco 678 DSL 调制解调器和一个 DD-WRT WAP,两者都可以配置为向其他计算机发送系统日志格式的消息。我希望那台机器成为我的 Arch Linux 服务器。
我用谷歌搜索了一下,我发现的是“systemd 取代了 syslog”,或者我不再需要运行syslog
或者与我的问题同样无关的东西。
更新
我已经询问过拱门论坛并没有得到相关答复。我安装了 syslog-ng 只是为了监听 UDP 端口 514。syslog-ng 从我的 Cisco 678 和我拥有的 DD-WRT WAP 写入消息。不幸的是,这些消息最终不会出现在 systemd 的日志中,而是出现在平面文件中。因此,没有确切的解决方案,而是一种解决方法。我宁愿将系统日志消息放在日志中,而不是放在平面文件中。
答案1
你可以写一个穷人的系统日志服务器很容易与索卡特。您只需要一个这样的服务单元:
[Service]
Restart=on-success
ExecStart=/usr/bin/socat -u UDP-RECV:514 STDOUT
它会盲目地将 syslog 服务端口上收到的任何内容发送到 systemd 日志。将上面的内容另存为,/etc/systemd/system/syslog.service
然后
# systemctl daemon-reload
# systemctl start syslog
然后,您只需要源将消息发送到侦听服务器上的 UDP 端口 514。
您可能想要增强此功能以实际解析接收到的数据并对其进行格式化,但如果您只想记录接收到的数据,则没有必要。
(索卡特在 Arch Linux 中额外的存储库pacman -S socat
:)
答案2
所以这里有一点差距。
Systemd 确实支持通过 systemd-journal-gateway 组件进行远程消息传递。也就是说,这些消息不是系统日志格式。 Syslog(作为一种格式)是 RFC 5424 中记录的 IETF 批准的规范(已弃用以前的版本 RFC 3164)。
这里记录了使这些完美地结合在一起的更多复杂性:
http://www.freedesktop.org/wiki/Software/systemd/syslog/
和这里(man systemd-journald.service)
systemd-journald is a system service that collects and stores logging data.
It creates and maintains structured, indexed journals based on logging
information that is received from the kernel, from user processes via the
libc syslog(3) call, from STDOUT/STDERR of system services or via its native
API. It will implicitly collect numerous meta data fields for each log
messages in a secure and unfakeable way. See systemd.journal-fields(7) for
more information about the collected meta data.
总之,确保消息从 syslog-ng 发送到 STDOUT,并且内容应该最终记录在日志中。
在进一步跟进这一点时,我也发现了这一点:
https://github.com/intgr/pg_journal/blob/master/doc/pg_journal.md
有人正在编写从 PostgreSQL 到 systemd 的绑定以进行日志记录。他们在本文中指出,目前(截至该文件发布时间,2013/06)systemd 不支持多行消息,因此也要注意这一点。
答案3
我不知道 Arch 分布。我有 Fedora 20(包括 systemd),并将其配置为接受远程系统日志消息。
恕我直言,此功能与 systemd 无关。 systemd-journald.service 将自身插入到内核/用户空间程序和 syslog 子系统之间。它仅捕获(我认为)来自这些来源的本地消息到其日志数据库中,然后将它们转发到系统日志。例如,请参见“man systemd-journald.service”(至少在 Fedora 上)。
就我而言,我通过在 /etc/rsyslog.conf 中配置可选的“TCP syslog 接收器模块”来启用此功能,即
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
还提供 UDP 模块。
还需要添加 (r)syslog 规则以将输出定向到所需的文件。有关完整文档,请参阅:http://www.rsyslog.com/doc/
HTH。
答案4
syslog-ng 和 systemd 日志
从系统日志
从 syslog-ng 版本 3.6.1 开始,system()
使用 systemd 的 Linux 系统上的默认源使用 Journald 作为其标准system()
源。
如果您希望同时使用 Journald 和 syslog-ng 文件,请确保以下设置有效。对于 systemd-journald,在 /etc/systemd/journald.conf 文件中,Storage= 设置为 auto 或 unset(默认为 auto),ForwardToSyslog= 设置为 no 或 unset(默认为 no)。对于 /etc/syslog-ng/syslog-ng.conf,您需要以下源节:
source src {
system();
internal();
};
另一方面,如果您不希望保留日志日志,而只保留 syslog-ng 的文本日志,请设置Storage=volatile
和ForwardToSyslog=yes
in /etc/systemd/journald.conf
。这会将日志存储在内存中。从 syslog-ng 3.6.3 开始,syslog-ng 使用journald 作为源system()
,因此如果设置 Storage=none,systemd 日志将删除所有消息并且不会将它们转发到 syslog-ng。
更改后重新启动systemd-journald.service
和syslog-ng.service
守护进程。