在Amazon EC2上logging/捕获STDERR / STDOUT

我正在寻找一个解决scheme,可以让我自动捕获在Amazon EC2上运行的进程的STDOUT / STDERR,并将其发送(远程)到另一台服务器。

听起来很简单,除了:

  1. 我将使用spot-instances,这意味着我不准确地控制它们何时启动,并且可以在任何时候终止(没有正确closures)
  2. 因为没有关机,所以当进程完成时,我无法写入本地文件并将其传输(例如传输到s3)。
  3. 输出结构不完善(例如,日志文件中没有列表字段),所以“标准”云日志logging解决scheme不是微不足道的,使用其中一个云数据库并不理想。

我考虑过的几个想法,但每个都有一个问题:

  1. 追加到“s3”上的文件是不可能的,并且重写文件对于logging来说太慢。
  2. 分享EBS卷(作为驱动器)是不可能的,据我所知。
  3. 使用“simple_db”听起来太慢了(而且“simple_db”已经在testing版中使用了很多年了,所以我不确定它是否可用)。
  4. 使用SQS(例如每行输出一个消息?)非常慢。
  5. redirect到networking套接字将失败,如果连接一秒钟(例如“myprogram 2>&1 | nc my.log.server 7070”

也许有远程日志logging的“系统日志”解决scheme? 但是这需要一个单独的“按需”实例来收集信息?

任何提示和想法,将不胜感激。

谢谢,-g

我希望有一些“追加只”或“大部分追加”服务亚马逊是专为logging。

像亚马逊Kinesis,也许?

借助Amazon Kinesis,您可以让生产者直接将数据推送到Amazon Kinesisstream中。 例如,系统和应用程序日志可以提交给Amazon Kinesis,并可在几秒内处理。 这样可以防止在前端或应用程序服务器出现故障时日志数据丢失。 Amazon Kinesis提供加速的数据采集,因为在提交服务器之前,您并没有在服务器上存储数据。“

http://aws.amazon.com/kinesis

我还没有尝试过,因为我有一个使用S3和SQS的自制程序监督过程…在stream的开始处,它为临时文件(在实例上)创build唯一名称,以捕获日志并发送通过SQS的消息导致有关进程及其日志文件位置的信息被存储在数据库中; 当进程停止(这些是预定的或事件驱动的,而不是连续运行的作业)时,发送另一个SQS消息,其中包含关于临时文件的位置的冗余信息,并给出了进程的退出状态; 那么这两个日志(out和error)都被压缩并上传到S3,每个进程都会生成额外的SQS消息来报告S3的上传状态。

如您所见,SQS消息在很大程度上是多余的,但是这样做的目的是为了消除我不知道过程存在的可能性,因为所有4条消息(start,stop,stdout-upload-info ,stderr-upload-info)在S3中包含足够的信息来标识主机,进程,参数以及日志文件将去或者已经去除的位置。 当然,所有这些冗余几乎是完全没有必要的,因为这个过程和SQS / S3是非常稳定的,但是如果需要,冗余也是存在的。

我不需要实时logging这些工作,但是如果我这样做,另一个select是修改日志采集器,以便不保存日志,然后将它们整体发送到S3,我可以为每个“ x“收集的日志运行时间的每”y“秒 – 以先发生者为准 – 将”累计“数据”刷新“为SQS消息……不需要为每条线路发送SQS消息。

首先,关于你在EC2上运行的事实,没有什么特别的。 使用任何集中式日志logging基础架构,您都希望尽可能减less日志丢失的可能性,因此需要尽快获取日志。

其次,不要指望魔术在这里。 您需要将日志消息保存在某处 ,因此您可能需要运行一个长时间运行的实例(在EC2或其他地方)来收集和存储消息。

以下是我的build议:

  1. 使用supervisord运行你的应用程序。 这不仅会给你一些基本的进程监控/重启能力,更重要的是,supervisord将处理你的输出stream的收集和写入日志文件。
  2. 在每个应用程序服务器上,使用logstash转发器来读取supervisord写入的日志文件并将它们传送到…
  3. logstash / elasticsearch服务器,其中logstash从节点接收日志,将其组织(如果需要),并将其提交给elasticsearch以进行长期存储和search。

一些额外的评论:

  • Logstash转发器能够使用logstashencryption其通信,因此您可以根据需要在公共networking上发送日志,而不用担心信息泄露。
  • Elasticsearch实现起来相当简单,并且为您的消息编制索引的工作非常出色
  • Elasticsearch提供了一个REST接口,您可以使用它来发出查询,但是如果您想要一个Web GUI, Kibana3是一个很好的select。
  • 如果您需要监视日志并以特定模式进行警报/通知,则可以configurationlogstash来执行此操作