集中日志记录 - 首先写入本地文件?

时间:2017-02-23 04:31:18

标签: logging elasticsearch logstash logrotate

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

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

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

我很好奇人们在集中式日志记录方案中最有效的做法。我应该首先写入每台服务器上的本地文件吗?或者是让每个盒子成为有状态的#34;相反,我应该直接从Logstash或SQS发送数据,以便由中央服务器进行处理吗?

1 个答案:

答案 0 :(得分:2)

在集中式日志记录方案中,将日志生成器与logstash紧密耦合并松散地执行操作之间存在实现差异。对于非常大的规模,应避免在中间进行紧耦合。紧耦合是在你的制作人和接收者之间创建一个套接字以传输事件,如果接收器很慢,这会在制作者端产生延迟。

松散耦合可以有多种方法:

  • 通过SQS,Redis,Kafka,AQMP等进行队列调解
  • 文件中介,通过文件。

我所知道的非常大的集中式日志记录系统都在集中层中使用某种形式的队列中介。

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

使用logstash进行集中式日志记录可以采用多种形式。如果您可以在生成日志的节点上安装logstash,那么这是一个非常有效的架构:

  • 生产节点上安装的Logstash。
    • 该实例配置为侦听应用程序日志记录的TCP端口,以及一些用于系统日志记录的文件。
  • Instance-logstash将事件发送到SQS。
  • 一组解析器 - logstash实例从SQS中取出作业并处理它们,输出到任何地方。

在这个架构中,所有过滤逻辑都存放在解析器 - logstashes中,而instance-logstash只是托运人。最好的部分是解析器 - logstash层可以在负载保证时按比例放大和缩小。这使实例-logstash保持最小的内存占用,因此它不会与应用程序竞争资源。

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

文件与直接连接

最好通过回答几个问题来确定这两者之间的关系:

  • 如果我通过TCP套接字直接连接,如果日志接收器在5分钟内无法使用,我的应用程序会发生什么变化?
  • 我的实例对存储I / O有多敏感?

文件是一种在实例上松散耦合的方法。如果您对第一个问题的回答是,应用程序暂停,直到日志接收器返回,您可能不希望这种紧密耦合。在这种情况下,日志文件是一种提供缓冲区的方法。如果这对您来说非常重要,那么缓存将在实例重启后继续存在。

它在实例上保持状态。但是,它应该是非常短暂的状态。日志发送器应该以足够快的速度将状态转储到中央队列系统,以防止超过几秒钟。

如果您对存储I / O非常敏感,并且对TCP状态也非常敏感,您仍然可以排队调解到某个点。安装一个本地redis实例,让你的应用程序发送到该实例,并从那里拉出logstash并发送到中央队列。这允许应用程序集中缓存队列事件。但是,在某些情况下,如果应用程序可以配置为直接运送到中央队列,那么更好。