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

标签 logging elasticsearch logstash logrotate

我有一个服务器API,其中包含一些应用程序实例和一个工作程序实例。当前,应用程序将一些数据发送到Loggly(SAAS集中式日志记录服务)。上手很好,但是我开始考虑使用一些开源软件来创 build 置。

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

我已经与LogRotate一起阅读了一些有关Logstash,Graphite,ElasticSearch等的信息,一些资料似乎建议写入每台服务器上的本地文件,然后在LogRotating时将它们发送到Logstash。

我很好奇人们在集中式日志记录方案中最有效的做法。我应该首先在每个服务器上写入本地文件吗?还是让每个盒子都变成“有状态”,而是我应该直接从Logstash或SQS发送数据,以便由集中式服务器处理?

最佳答案

当涉及集中式日志记录方案时,将日志生产者紧密耦合到logstash与松散耦合之间存在实现差异。对于非常大的规模,应避免在中间紧密耦合。紧密耦合会在生产者和接收者之间创建一个套接字来传输事件,如果接收者很慢,则会在生产者方面产生延迟。

松耦合可以通过多种方法实现:

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

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

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

    使用logstash进行集中式日志记录可以采用多种形式。如果您可以在产生日志的节点上安装logstash,则以下是一种非常有效的体系结构:
  • Logstash安装在生产节点上。
  • 该实例配置为侦听TCP端口以进行应用程序日志记录,并监听一些文件以进行系统日志记录。
  • Instance-logstash将事件发送到SQS。
  • 大量的解析器日志实例实例将作业从SQS中拉出并进行处理,然后输出到任何地方。

  • 在这种体系结构中,所有过滤逻辑都存储在解析器日志中,而实例日志则只不过是托运人。最好的部分是,parser-logstash层可以根据负载要求进行扩展和缩减。这样可以使instance-logstash的内存占用最小,因此不会与应用程序竞争资源。

    由于Logstash具有一个loggly插件,因此您仍然可以在此提供数据,同时还可以在本地保留副本。

    文件与直接连接

    最好通过回答以下几个问题来决定这两者:
  • 如果我直接通过TCP套接字之类的东西进行连接,那么如果日志接收器在5分钟内不可用,我的应用程序会怎样?
  • 我的实例对存储I / O有多敏感?

  • 文件是实例上松散耦合的一种方法。如果您对第一个问题的回答是,应用会暂停直到对数接收器返回,您可能不希望这种紧密耦合。在这种情况下,日志文件是提供缓冲区的一种方式。如果这对您很重要,则将在实例继续存在的缓冲区重新启动。

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

    如果您对存储I / O非常敏感,并且对TCP状态也非常敏感,则仍然可以在队列中进行中介。安装本地redis实例,将您的应用交付到该实例,并让logstash从那里拉出并交付到中央队列。这样可以从队列事件集中缓冲该应用程序。不过,在某些情况下,如果可以将应用程序配置为直接发送到中央队列,则还是更好。

    关于logging - 集中记录-首先写入本地文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42407089/

    相关文章:

    java - Logback 具有不同配置的多个记录器

    c++ - 我们可以为每个类对象创建每个 boost 记录器实例吗?

    python - 为什么使用多个参数来记录而不是插值?

    amazon-web-services - 未授权AWS Elasticsearch Service执行滚动

    elasticsearch - elasticsearch_http Logstash错误

    php - PHP 中解析未知字符串长度?

    elasticsearch - 如何在Elasticsearch中查找字段所属的索引?

    elasticsearch - 自定义停用词分析器无法正常运行

    elasticsearch - 如何从同一filebeat到logstash的不同日志具有不同的索引名称

    logstash - 如何在 Terraform 模板中转义 Logstash sprintf 表达式?