我有机器 A,它是一个 pfsense 安装,它通过 syslog 将日志发送到 Ubuntu 机器。Ubuntu Box 将不得不重写日志,以替换例如主机名并稍微更改格式。
格式一般如下
Mar 7 00:05:32 hostname service: field1 field2 field3 field4 field5 field6 field7
我想要重写主机名、服务和字段更改顺序的可能性,并过滤掉某个字段中具有某个值的消息,因为它们并不有趣。
经过过滤和处理后,消息应该以日志文件的形式写入磁盘,并通过 syslog 发送到另一台机器。
现在,日志记录部分是微不足道的 - 只需设置 rsyslogd 以接受传入的消息,然后转发这些消息。但是,我有点卡在重写部分。我没有和 rsyslogd 结婚;任何 syslog-esque 守护进程都可以。
这个问题有点模糊,但我会尝试提出一个可能的解决方案。重写消息
rsyslog
提供了许多模块,其中之一是mmfields
. 它将某个字符(仅一个字符)的传入消息拆分为字段,然后允许访问这些字段。对于像这样的消息分隔符将为空白
,然后可以通过
$!f2
、$!f3
、$!f4
和访问字段$!f5
。不幸的是,第一个字段 ($!f1
) 始终为空,因为消息前面有一个空格,这将是第一个字段。因此,对于上述消息,我们得到$!f1==""
、$!f2=="a=1"
、$!f3=="b=two"
、$!f4=="c=3"
和$!f5=="d=four"
。rsyslog
还附带其他消息修改模块,但由于缺乏更多细节,我选择了这个。将以下文件存储为/etc/rsyslog.d/10-so.conf
. 根据所需的执行顺序更改名称,但保留.conf
扩展名。重新启动
rsyslog
(通过sudo systemctl restart rsyslog.service
)并尝试一下:第二条
logger
语句的输出将是:要更改主机名,只需替换
在模板中
要更改 syslogtag(您称之为service),请替换
和
输出将是:
有关更多消息属性,请参见此处。
请注意,我的方法(使用
mmfields
)依赖于字段始终具有相同的顺序,并且不容易允许重写消息(a=1 b=2
重新b=1 a=2
排序和更改键值对)。为此,另一个模块可能更合适。据我所知,这可以通过使用 logstash elasticsearch 和 Kibana 来实现。我正在尝试做同样的事情,并且通过设置麋鹿堆栈或多或少地取得了成功。然后在 logstash 中使用 grok 过滤器将 syslog 消息分解为不同的字段,并使用这些字段匹配模式并发送警报。看看这个指南,它可能会给你一些关于从哪里开始的答案。
这种设置已经为 mysql 日志或 apache 或 nginx 日志等内容内置了过滤器。这是对 elk 堆栈功能和架构的良好概述。我希望这有帮助。