我是 ELK 的新手,我想建立一个解决方案,使用 ES 索引 Microsoft IIS 和应用 .NET 日志。
我知道有不同的方法:
1)[应用服务器:日志文件➔Logstash]➔[收集服务器:Redis➔Logstash]➔[ES集群:ES➔Kibana]
这种方法的缺点是必须在每个生成日志的 Windows 服务器上安装、配置和维护一个 logstash 实例
2)[应用服务器:日志文件 ➔ Filebeat] ➔ [收集服务器:Logstash ➔ Redis ➔ Logstash] ➔ [ES 集群:ES ➔ Kibana]
这种方法的缺点是,目前 filebeat 不支持多行日志条目,而我的 .NET 应用程序会产生多行异常。我不确定如何配置中间的 logstash+redis+logstash 来处理这个问题。
因此我想,也许考虑到 Logstash 能够在没有 filebeat 或任何其他转发器的情况下自行收集日志数据(如果我错了,请纠正我),我可以尝试以下操作:
[应用服务器:日志文件] ➔ [收集服务器:Samba 映射的网络驱动器 ➔ Logstash ➔ Redis ➔ Logstash] ➔ [ES 集群:ES ➔ Kibana]
在这个假设下,我不需要在每个应用服务器上安装 Logstash 实例。中央 logstash 实例(或多个实例)将获取文件(使用 Samba 映射的网络驱动器)并应用多行编解码器,然后再将日志条目推送到 Redis。
从技术上来说这可行吗?这是一个合理的架构选择吗?
答案1
虽然使用file
输入来对 CIFS 共享上的日志运行 Logstash 是可行的,但我认为效果不是很好。我还没有直接使用过这样的 Logstash,但根据我使用 Logstash-Forwarder 通过 SSHFS 安装查看日志文件的经验,它不能很好地处理文件轮换或两端的重启。
至于不确定如何使用 Filebeat 处理多行异常,我认为您无需担心。FileBeat 只会从您要发送的文件中获取行,然后通过网络发送它们。它添加了一些字段,但它们不会影响 FileBeat 作为一个非常基本的日志发送器的整体概念。
这意味着您只需在收集服务器上的 Logstash 中运行多行过滤器即可,就像直接在应用服务器上运行 Logstash 一样。
现在,根据您的日志量,您可能会发现需要增加 LS 的工作器数量才能有效地处理您的数据。
我处理这类事情的方法与您的选项 2 非常相似,但我有 3 个 LS 实例(“Broker”和“Parser”),而不是只有两个。
+-------------------+
+-------------------+|
+-------------------+||
| App Servers |||
| +----------+ ||+
| | FileBeat | |+
+----+----------+---+
/
/
/
+----------------/----------------------------------------+
| / Collecting Server |
| +----------/-+ +---------------------+ +------------+ |
| | Logstash | | Logstash | | Logstash | |
| | Broker | |Multi-line Pre-Parser| | Parser | |
| +------------+ +---^-----------------+ +-----^---V--+ |
| | | | | | |
| | | Redis | | | |
| V +---------------------V------+ | | |
| +-------> DB0 | DB1 + --->+ | |
| +----------------------------+ / |
+-------------------------------------------------/-------+
/
/
/
+-------------------+ /
+-------------------+|/
+-------------------+||
| ElasticSearch ||+
| Cluster |+
+-------------------+
实例Pre-Parser
所做的只是将多行日志条目转换为一行,以便它Parser
能够正确完成工作。即便如此,我也会检查类型和标签,看看行是否有可能是多行,因此开销很小。
我可以轻松地通过它每秒推送 1000 个事件(几乎不会占用 20% 的 CPU)。此外,该系统是一个 ELK 堆栈,因此有了 LS 和 ES 的专用节点,这应该很容易。
为什么不直接在 Parser 实例上启动呢workers
?好吧,这是因为multiline
筛选LS 不支持多名工作人员。
多行
此过滤器将把来自单一来源的多行消息折叠成一个 Logstash 事件。此过滤器的最初目标是允许将来自文件的多行消息合并到单个事件中。例如 - 将 Java 异常和堆栈跟踪消息合并到单个事件中。
笔记:此过滤器不适用于
-w 2
Logstash 命令行上的多个工作线程。