使用系统化的Arch Linux接收Syslog消息


25

我感觉自己已经忽略了显而易见的东西,但是我不知道如何获得Arch Linux服务器,该服务器使用systemd来接收和记录syslog来自远程系统的消息。

我有一个Cisco 678 DSL调制解调器和DD-WRT WAP,并且都可以配置为将syslog格式的消息发送到其他计算机。我希望那台机器成为我的Arch Linux服务器。

我到处搜寻,发现的只是“ systemd代替syslog”,或者我不再需要运行syslog或者与我的问题无关的东西。

更新

我在Arch论坛上提出了问题,但没有得到相关的答案。我安装了syslog-ng只是为了侦听UDP端口514。syslog-ng从我的Cisco 678和我所拥有的DD-WRT WAP写入消息。不幸的是,这些消息不是最终出现在systemd的日记中,而是最终出现在平面文件中。因此,没有确切的解决方案,而是一种解决方法。我宁愿在日志中存储系统日志消息,而不是在平面文件中。


systemd使用自己的日志。还有metalog,它可以在Arch的核心仓库中使用-我个人使用这三个:syslog,systemd的日志和metalog。尝试检查系统日志。如果我没记错的话,自从切换到systemd以来,syslog已配置为将其所有消息等发送到systemd的日志。
Alexej Magura

Answers:


11

您可以使用socat轻松编写一个穷人的syslog服务器。您只需要一个这样的服务单元:

[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。

您可能需要增强它以实际解析接收到的数据并将其格式化,但是如果您要做的只是记录接收到的数据,则没有必要。

socat是在Arch Linux的额外资料库:pacman -S socat


4
好答案。由于无法安装socat,我使用了快速的python脚本:import socket; sock = socket.socket(type=socket.SocketKind.SOCK_DGRAM); sock.bind(("0.0.0.0", 514)); while True: print(sock.recv(1024 * 1024))
awelkie

3

因此,这里存在一些差距。

Systemd确实支持通过systemd-journal-gateway组件进行远程消息传递。话虽如此,这些消息不是syslog格式。Syslog(作为一种格式)是在RFC 5424(不推荐使用以前的版本RFC 3164)中记录的IETF批准的规范。

更好地融合这些技巧,可以在这里找到更多的复杂信息:

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中不支持多行消息,因此也请注意这一点。


2

我不知道Arch的分布。我确实有Fedora 20(包括systemd)并将其配置为接受远程syslog消息。

恕我直言,此功能与systemd不相关。systemd-journald.service介于内核/用户空间程序和syslog子系统之间。它仅从这些来源捕获(我认为)本地消息到其日记数据库,然后将它们转发到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。


2

我安装了syslog-ng并能够接收syslog日志消息。但是我真正想要的是接收syslog日志消息,然后将所说的消息写到日志中。我找不到配置syslog-ng来将远程syslog消息写入日志的方法。

因此,我编写了一个实用程序来执行此操作。

https://github.com/advantageous/rsyslog-journald-repeater

./rsyslog-journald-repeater -h
Usage of ./rsyslog-journald-repeater:
-debug
    debug flag
-host string
    hostname to listen on (default "0.0.0.0")
-port int
    port to listen on (default 5514 on darwin, default 514 on Linux, Unix, etc.)

项目中包含构建文件和测试说明,以及示例系统单元文件。请享用!


0

syslog-ng和systemd日记

系统日志

从syslog-ng版本3.6.1开始,system()使用systemd的Linux系统上的默认源使用日记作为其标准system()源。

如果您希望同时使用日志文件和syslog-ng文件,请确保以下设置有效。对于systemd-journald,在/etc/systemd/journald.conf文件中,Storage =设置为auto或未设置(默认为auto),而ForwardToSyslog =设置为no或未设置(默认为no)。对于/etc/syslog-ng/syslog-ng.conf,您需要以下源节:

 source src {
   system();
   internal();
 };

另一方面,如果您不希望保留日记日志,而仅保留syslog-ng的文本日志,请设置Storage=volatileForwardToSyslog=yesin /etc/systemd/journald.conf。这将日记存储在ram中。从syslog-ng 3.6.3开始,syslog-ng使用日志记录作为system()源,因此,如果您设置Storage = none,则systemd日志将删除所有消息,而不将其转发给syslog-ng。

更改后,重新启动systemd-journald.servicesyslog-ng.service守护程序。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.