elasticsearch,logstash,logrotate,Logging,elasticsearch,Logstash,Logrotate" /> elasticsearch,logstash,logrotate,Logging,elasticsearch,Logstash,Logrotate" />

Logging 集中式日志记录-是否先写入本地文件?

Logging 集中式日志记录-是否先写入本地文件?,logging,elasticsearch,logstash,logrotate,Logging,elasticsearch,Logstash,Logrotate,我有一个服务器API,它有几个应用程序实例和一个工作者实例。目前,应用程序将一些数据发送到Loggly(一种SAAS集中式日志服务)。这是一个很好的开始,但我开始考虑使用一些开源软件创建一个设置 此外,目前使用Loggly my的成本,最大的担忧是:在请求结束时连接到Loggly以记录数据,这会增加请求的时间 我已经阅读了一些关于Logstash、Graphite、ElasticSearch等与LogRotate的相关内容,一些来源似乎建议在每台服务器上写入一个本地文件,然后在Logrotati

我有一个服务器API,它有几个应用程序实例和一个工作者实例。目前,应用程序将一些数据发送到Loggly(一种SAAS集中式日志服务)。这是一个很好的开始,但我开始考虑使用一些开源软件创建一个设置

此外,目前使用Loggly my的成本,最大的担忧是:在请求结束时连接到Loggly以记录数据,这会增加请求的时间

我已经阅读了一些关于Logstash、Graphite、ElasticSearch等与LogRotate的相关内容,一些来源似乎建议在每台服务器上写入一个本地文件,然后在Logrotation时,将它们发送到Logstash


我很好奇人们发现在集中式日志场景中什么做法最有效。我应该先写入每个服务器上的本地文件吗?或者是将每个框设置为“有状态”,而不是直接从日志存储(或SQS)发送数据以供集中式服务器处理吗?

在集中式日志记录场景中,将日志生成器与日志存储紧密耦合与松散耦合之间存在实现差异。对于非常大的规模,应避免向中间紧密耦合。紧密耦合是在生产者和接受者之间创建一个套接字来传输事件,如果接受者速度慢,这会在生产者端产生延迟

松耦合有多种方法:

  • 队列中介,通过SQS、Redis、Kafka、AQMP等
  • 文件中介,通过文件
我所知道的非常大的集中式日志系统都在集中层中使用某种形式的队列中介

也就是说,在边缘,用例是不同的。如果您需要避免写入文件以减少I/O,那么使用TCP或UDP套接字传输到本地安装的日志存储(然后将事件发送到中心队列)可以非常快

使用logstash的集中式日志记录可以采用多种形式。如果可以在日志生成节点上安装logstash,那么以下是一种非常有效的体系结构:

  • Logstash安装在生产节点上。
    • 该实例被配置为侦听TCP端口以进行应用程序日志记录,侦听几个文件以进行系统日志记录
  • 实例日志存储将事件发送到SQS
  • 一组解析器日志存储实例从SQS中提取作业并处理它们,输出到任何地方
在这个体系结构中,所有过滤逻辑都封装在解析器日志库中,实例日志库只剩下一个托运人。最好的部分是解析器日志存储层可以根据负载情况进行放大和缩小。这使得实例的日志存储具有最小的内存占用,因此它不会与应用程序争夺资源

由于Logstash有一个loggly插件,如果您愿意,您仍然可以在那里提供数据,同时在本地保留一个副本

文件与直接连接 最好通过回答以下几个问题来决定这两者:

  • 如果我直接通过TCP套接字连接,如果日志接收器在5分钟内不可用,我的应用程序会发生什么情况
  • 我的实例对存储I/O的敏感程度如何
文件是实例上的松耦合方法。如果您对第一个问题的回答是,应用程序会暂停,直到日志接收器返回,那么您可能不希望出现这种紧密耦合。在这种情况下,日志文件是提供缓冲区的一种方式。如果对您来说很重要的话,一个在实例重新启动后仍然存在的缓冲区

它正在实例上保持状态。然而,它应该是非常短暂的状态。日志传递程序应该以足够快的速度将状态转储到中心队列系统,以使您保持的时间不会超过几秒钟


如果您对存储I/O非常敏感,并且对TCP状态也非常敏感,那么您仍然可以将中介排队到某个点。安装一个本地redis实例,让你的应用程序发送到该实例,然后让logstash从那里提取并发送到中心队列。这使得应用程序可以从队列事件集中缓冲。不过,在某些情况下,如果应用程序可以配置为直接发送到中心队列,则最好直接发送到中心队列。

在集中式日志记录场景中,将日志生成器与日志存储紧密耦合与松散耦合之间存在实现差异。对于非常大的规模,应避免向中间紧密耦合。紧密耦合是在生产者和接受者之间创建一个套接字来传输事件,如果接受者速度慢,这会在生产者端产生延迟

松耦合有多种方法:

  • 队列中介,通过SQS、Redis、Kafka、AQMP等
  • 文件中介,通过文件
我所知道的非常大的集中式日志系统都在集中层中使用某种形式的队列中介

也就是说,在边缘,用例是不同的。如果您需要避免写入文件以减少I/O,那么使用TCP或UDP套接字传输到本地安装的日志存储(然后将事件发送到中心队列)可以非常快

使用logstash的集中式日志记录可以采用多种形式。如果可以在日志生成节点上安装logstash,那么以下是一种非常有效的体系结构:

  • Logstash安装在生产节点上。
    • 该实例被配置为侦听TCP端口以进行应用程序日志记录,侦听几个文件以进行系统日志记录
  • 实例日志存储将事件发送到SQS
  • 一组解析器日志存储实例从SQS中提取作业并处理它们,输出到任何地方
在这个体系结构中,所有过滤逻辑都封装在解析器日志库中,实例日志库只剩下一个托运人。最好的部分是解析器logst