【问题标题】:Log shipping from tomcat cluster来自 tomcat 集群的日志传送
【发布时间】:2015-10-15 11:51:02
【问题描述】:

我正在调查日志记录系统的问题,并寻找有关该问题可能解决方案的一些意见。 我们现在拥有的:

  • 6 个 tomcat 的集群,日志记录 (log4j2) 配置为使用 SocketAppender
  • 这些监听器是将记录的事件放在 Redis 上的 logstash 代理
  • 另一个 logstash 代理从 Redis 中挑选条目并将它们推送到 elasticsearch

有时我们遇到的问题是客户端套接字(log4j 记录器)有时会无限期地等待导致应用程序无响应。建议的解决方案之一是摆脱套接字附加程序并使用本地文件(我们不需要 kibana 中的“即时”日志信息)。因此,logstash 代理将被配置为读取 6 个文件(每个实例一个)并将这些文件直接推送到弹性搜索中。除了在 logstash 的输入配置中定义 6 个文件之外,您能否提出这种方法的任何缺点?你还能建议什么其他选择?提前致谢。

【问题讨论】:

    标签: elasticsearch redis logstash log4j2


    【解决方案1】:

    如果您可以选择,我绝对不会使用 SocketAppender。一个问题是您提到的问题,另一个问题是如果您使用 Logstash 1.5x 或更早版本,我觉得更麻烦的是,您的事件的确切时间戳(由 log4j2 创建)没有传达,这意味着时间戳您的日志行将是该日志行在 logstash 中的到达时间,而不是您的应用程序创建日志行的时间。如果您正在从堆栈中的不同应用程序/服务器/子系统聚合日志,那么理解事件的时间性将是一件麻烦事。虽然这是fixed in Logstash 2.0,但仍然值得一提。

    除此之外,将日志存储到文件系统上的文件中而不是直接通过 TCP 传送它们至少有三个很好的理由:

    1. 您的日志文件实际上是日志事件的备份,即您可以随时重播这些文件
    2. 您的应用程序不依赖另一个同步子系统来发送其日志行,它只是将它们接收到自己的文件系统中
    3. 您的 logstash 可能已关闭(升级、网络连接等),而您的应用仍然能够生成日志,无论链条下发生什么。

    【讨论】:

    • 这些正是从 SocketAppender 迁移的原因。谢谢!
    • 很高兴它帮助您确认您的选择。您还需要有关此主题的任何其他信息吗?
    • 很高兴听到更多的意见 - 我看过一些文章,Redis 作为多个日志文件和 logstash 索引器之间的代理,所以想确认离开 Socket 没有害处 -> Redis->Logstash->ElasticSearch 直接到 MultipleFiles->Logstash->ElasticSearch
    • 是的,在您的日志和 Elasticsearch 之间有某种“持久缓冲区”(redis、rabbitmq、kafka 等)仍然是个好主意。它允许更稳健地扩展。请参阅my answer to another similar question 关于拥有持久“缓冲区”的信息。但在你的情况下,你不需要删除你的 redis 组件,你绝对可以保留它,只是你的 logstash 代理将从文件而不是从 SocketAppender 读取,这是唯一改变的事情。
    • @Konstantin 嗨,我们也在使用文件输入而不是“直接”基于网络的方法,主要是因为 Val 已经发布了。我想向您指出文件输入的一个缺点,但它确实让我付出了代价。至少在 Windows 下,它会导致文件锁定问题。在 logstash 1.5 之前,它确实锁定了它正在处理的文件,这是固定的,但它仍然锁定文件所在的目录,当您设置脚本以旋转/移动/...应用程序的日志文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多