直接登录 elasticsearch 与使用 logstash 和 filebeat

direct logging on elasticsearch vs using logstash and filebeat

我正在使用 Spring 引导后端来提供一些 restful API 并且需要将我所有的请求-响应日志记录到 ElasticSearch 中。

以下两种方式,哪种性能更好?

  1. 使用 Spring 引导 ResponseBodyAdvice 将发送到客户端的每个请求和响应直接记录到 ElasticSearch。

  2. 将每个请求和响应记录到日志文件中,并使用 filebeat and/or logstash 将它们发送到 ElasticSearch。

不确定您是否能得到明确的答复。这实际上取决于您的基础架构和使用的硬件。

你所说的性能是指 spring boot backend 应用程序的性能还是日志到达 ElasticSearch 所需的时间?

我假设第一个。

当直接将日志发送到 ElasticSearch 时,瓶颈将是使用的网络,而当首先将请求和响应记录到日志文件中时,瓶颈可能是使用的 harddisk 和可能的最大值I/O 次操作。

通常我会说,当您在 company/network 中操作时,通过网络将日志直接发送到 ElasticSearch 应该是更快的选择,因为相比之下写入磁盘总是很慢。但是如果你使用 fast SSDs 效果应该可以忽略不计。如果您需要将您的网络包发送到不同的 location/country 这也可以快速改变。

总而言之:

如果您的 ElasticSearchHDDs/速度较慢 SSDs 的网络连接速度较快,则使用网络时性能可能会更好。

如果您的 ElasticSearch 不在您所在的位置并且您可以使用快速 SSD,首先将日志写入文件可能是更快的选择。

但最后您可能必须尝试这两种方法,实施一些计时器并自行检查。

我们正在使用这两种解决方案。第一种方法的复杂性较低。 当我们不想触摸代码并且有太多应用程序实例时,我们选择第二种方法。

关于性能。直接在 elasticsearch 上写你有更好的性能,因为你不占用磁盘 I/O。但假设当您的应用程序和 elasticsearch 服务器之间的连接断开时。重试几次后你会丢失日志。

使用 rsysloglogstash 对于大集群更可靠。

首先,我假设您有一个分布式应用程序,否则只需将您的内容写入日志文件即可

我还假设您有相当多的日志要管理,否则,如果您计划在一个小时内记录几条消息,那么您走哪条路并不重要 - 两者会做的。

从技术上讲,这两种方式都可以实现,尽管对于第一种方式我建议采用不同的方式,至少我在 5 年前在我的一个项目中做过类似的事情:

创建一个自定义日志附加器,将所有内容放入某个队列(用于异步处理),并从中获取一个 Apache Flume 项目,该项目可以通过批处理支持以事务方式将内容写入您选择的数据库、“全有或全无”语义等

此方法解决了您提出的“第一个”选项中可能出现的问题,而其他一些问题将无法解决。

如果我比较你提供的第一个和第二个选项, 我认为你最好使用 filebeat / logstash 或者两者都写入 ES,原因如下:

当你登录advice时——你会“吃掉”你的JVM资源——内存,CPU维护ES连接池,线程池做实际日志(否则业务流程可能会变慢由于将请求记录到 ES)。

此外,如果没有自定义代码,您将无法“批量”写入 elasticsearch,而是必须为每条日志消息创建一个“插入”,这可能很浪费。

另一个“技术性”- 如果应用程序由于某种原因重新启动会发生什么,如果所有内容都记录在建议中,您是否能够在重新启动之前写入所有日志?

还有一个问题——如果您想在 ES 中“轮换”索引,即使用 TTL 创建索引并每天生成一个新索引,会发生什么情况。

filebeat/logstash 可能可以解决所有这些问题,但是它们可能需要更复杂的设置。 此外,显然您将有更多服务需要部署和维护:

  • 从资源消耗的角度来看,logstash 比 filebeat 重得多,通常您应该在 logstash 中解析日志消息(通常使用 grok 过滤器)。
  • filebeat 在资源消耗方面要“谦虚”得多,如果你有很多实例要记录(真正的分布式日志记录,我假设你有)考虑放置一个 filebeat 服务( deamon set if you have k8s) 在你将从中收集日志的每个节点上,以便单个 filebeat 进程可以处理不同的实例,然后在单独的机器上部署一个 logstash 实例集群,这样他们就会做一个heavy log-c运行一直在更新并将数据流式传输到 ES。

logstash/filebeat 有什么帮助? 出乎我的意料:

  • 它会运行自己的节奏,所以即使进程挂了,这个进程产生的消息终究会写到ES中
  • 我认为它甚至可以在 ES 本身的短暂中断中幸存下来(应该检查一下)
  • 它可以处理用不同技术编写的不同进程,如果明天你想从数据库服务器收集日志怎么办,例如,没有 spring/not 写在 java全部
  • 它可以处理索引轮换,在内部批量写入,因此您最终将获得有效的 ES 管理,否则您必须自己编写。 logstash/filebeat 方法的缺点是什么? 再说一遍,我的脑子里没有完整的列表什么的:
  • 好吧,更多的数据将全部通过网络
  • 如果您使用“LogEvent”,则不需要解析字符串,因此这种转换是多余的。

至于对性能的影响——这基本上取决于你用什么来衡量你的应用程序到底是什么样子的,你有什么硬件,所以恐怕我不能给你一个明确的答案那 - 你应该根据你的具体情况进行衡量,并想出一种更适合你的方法。