结合 Logstash 和 Graylog 进行日志管理

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

在传统 IT 基础架构中工作时,您经常会遇到这样的问题,即开发人员只能访问测试或开发环境,而不能访问生产环境。为了修复错误或查看生产中运行的系统,需要访问日志文件。由于安全要求,这通常是不可能的。这种情况的结果是运营人员需要将这些文件提供给开发人员,这会花费一定的时间。

这些问题的解决方案是提供日志管理服务器并通过 UI 向开发人员授予访问权限。尽管有一些商业工具,如 Splunk ,它是该领域事实上的市场领导者,但也有一些非常有前途的开源解决方案,它们确实可以很好地扩展,并且可以提供足够的功能来完成工作。

使用开源技术的优势在于您可以——但不必——购买订阅。此外,像 Splunk Log Analysis 这样的软件有定价计划,这取决于您每天发送的日志量。问题是,如果日志量增加,您必须支付更多费用,这可能是由于提高了日志级别以帮助分析生产中的某些错误,或者只是因为部署了更多服务。

最后但同样重要的是,当然还有像 Loggly 这样的云解决方案。您基本上可以将日志事件发送到云服务,然后由云服务处理其余的事情。您不必自己提供任何基础设施。这是一个非常好的解决方案,除非您的组织的安全策略禁止将数据传送到云端。

当然,这个概述是不完整的。我只是挑选了一些工具来简单介绍一下。如果您认为缺少某些内容,请随时发表博客或发表评论。

开源日志管理

著名的 ELK-Stack

目前,最著名的开源日志管理解决方案可能是 ELK-Stack。之所以称为堆栈,是因为它不是一个软件包,而是一些知名开源工具的组合。这些组件是:

  • Elasticsearch 是一个针对搜索优化的面向文档的数据库。它易于扩展,可以管理大量数据。
  • Logstash 是一个具有许多特性的日志转发器。有许多类型的输入、过滤器和输出。此外,logstash 可以处理一堆编解码器,例如 JSON。
  • 最后, Kibana 是一个 UI,您可以在其中查看日志条目并创建非常复杂和丰富多彩的仪表板。

尽管 ELK-Stack 有很多优点,但也有一些缺点,这使得它在某些情况下不是最佳选择。

Kibana 没有用户管理。如果你想要用户管理,你必须从 Elastic 购买商业支持以获得 Shield 的许可。

其次,Elasticsearch 数据库没有内务管理。 Logstash 为每一天创建一个索引。如果您不再需要它,则必须手动将其删除。

灰日志

Graylog 是一个替代的日志管理平台,它解决了 ELK 堆栈的缺点并且非常成熟。它提供了一个 UI 和一个服务器部分。此外,Graylog 使用 Elasticsearch 作为日志消息的数据库,并使用 MongoDB 作为应用程序数据。

UI 基本上完成了 UI 的工作。它使数据可以在 Web 浏览器中访问。

服务器部分提供了对日志文件的一致管理。 Graylog 服务器具有以下特点:

  • 多个输入:HTTP、TCP、SYSLOG、AMQP、……
  • 日志消息分类(流)
  • 定义流的用户管理和访问控制
  • 从流创建的简单仪表板
  • Elasticsearch 中的管理
  • 输出以转发特定流的消息

而且,Graylog可以很容易地部署在集群环境中,让你获得高可用性和负载分布。

为了创建一个完整的解决方案,将 Graylog 与 Logstash 结合起来是合适的,只需对 Logstash 进行一些修补和自定义 Graylog 插件。

作为日志事件的标准,Graylog 提倡使用 Graylog 扩展日志格式 (GELF) 。这基本上是一种包含以下信息的 JSON 格式:

  • 时间戳(Unix):日志事件的时间
  • Host:事件发起的主机
  • 短消息:消息

GELF 消息可以包含许多其他可选字段以及用户定义的字段。时间戳对于查看按日志消息创建时间排序的日志消息非常重要,而不是按进入系统的时间排序。

把它们放在一起

不幸的是,让 Logstash 与 Graylog 对话有点困难,反之亦然。主要问题是 Graylog 希望消息的结尾带有 NULL 定界符,而 Logstash 创建 \n 。 Logstash 在接收日志消息时也期望 \n 以及 Graylog 发送带有 NULL 分隔符的日志消息。

将消息从 Logstash 发送到 Graylog

1. 使用像 RabbitMQ 这样的消息代理。 Logstash 可以写入 RabbitMQ,Graylog 可以读取。该解决方案将两个应用程序解耦,因此可以在 Logstash 仍在生成日志消息时关闭 Graylog 服务器。

2. 使用 Graylog 中的 HTTP 输入接收来自 Logstash 的消息。该解决方案有一些缺点。最大的可能是如果 Graylog 关闭,Logstash 在发送尝试失败后丢弃消息。

3. 使用 GELF TCP 输入并修补 Logstash。不幸的是,无法更改 Logstash“json_lines”编解码器中的行分隔符。这可以在当前作为 拉取请求 打开的补丁中完成。希望它会很快合并。使用 Logstash TCP 输出的一大优势是 Logstash 对无法发送的消息进行排队并重试发送它们。

从 Graylog 向 Logstash 发送消息

从一开始,将消息从 Graylog 发送到 Logstash 可能没有意义。但是,如果您考虑在 NAS 或 AWS S3 中创建基于文件的日志文件存档,这可能是有意义的。

上面说了连行尾都有问题。幸运的是,Graylog 提供了一个插件 API。所以我创建了一个插件,可以将日志消息转发到 Logstash 实例。然后该实例可以写入日志文件。

该插件托管在 Github 上,并根据 APL 2.0 获得许可。

结论

如本文所述,您可以毫不费力地将 Logstash 和 Graylog 结合起来,以构建企业就绪的灵活、可扩展和访问受控的日志管理系统。作为核心组件的 Graylog 和 Elasticsearch 能够横向扩展所描述的设置并且可以处理大量数据。

Graylog、Logstash 和 Elasticsearch 都是三款优质的开源工具,拥有强大的社区和众多的用户。所有这些产品也得到了背后公司的商业支持。

最后,对于所有 Kibana 爱好者来说,有一个重要提示。当然,也可以将 Kibana 与 Graylog 并行部署。然后,您可以使用 Kibana 构建漂亮的仪表板,并在 Graylog 中拥有用户管理和 Elasticsearch Housekeeping 等功能。