是否可以为ElasticBeanstalk Docker应用程序进行集中日志记录?

时间:2014-12-05 20:59:02

标签: docker logstash elastic-beanstalk amazon-cloudwatch

我们在Elastic Beanstalk Docker容器环境中运行自定义Docker Web应用程序。 想要在外面查看应用程序日志。无需通过实例或AWS控制台下载。

到目前为止,这两种解决方案都不可接受。也许有人为Elastic Benastalk Dockerized应用程序实现了集中式日志记录?

解决方案1:AWS Console日志下载

不可接受 - 需要下载日志,每次都提取。非实时。

解决方案2:S3 + Elasticsearch + Fluentd

fluentd没有从S3检索日志的插件 这是一款优秀的S3插件,但它仅适用于S3的日志输出。不适用于S3的输入日志。

解决方案3:S3 + Elasticsearch + Logstash

缺点:只能从整个存储桶中提取所有日志。

问题在于Elastic Beanstalk S3 Log存储结构。您无法指定文件名模式。它既可以是所有日志,也可以不是。 ElasticBeanstalk在包含随机实例和环境ID的路径中将日志保存在S3上:

s3.bucket/resources/environments/logs/publish/e-<random environment id>/i-<random instance id>/my.log@

Logstash s3插件只能指向resources / environments / logs / publish /。当您尝试将其指向environment / logs / publish / * / my.log时,它不起作用。 这意味着你无法拉出特定的日志并标记/输入它以便能够在Elasticsearch中找到它。由于AWS将所有环境和实例中的日志保存在相同的文件夹结构中,因此您甚至无法选择实例。

解决方案4:AWS CloudWatch控制台日志查看器

可以将自定义日志转发到CloudWatch控制台。实现这一点,将配置文件放在应用程序包的.ebextensions路径中: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/AWSHowTo.cloudwatchlogs.html

有一个名为cwl-webrequest-metrics.config的文件,它允许您指定日志文件以及警报等。 大!?除了配置文件格式既不是yaml,xml或json,也没有记录。在AWS文档网站或网络上的任何地方,都无法提及该文件的格式。 要在CloudWatch中显示一个日志文件,不仅仅是添加配置行。 实现这项工作的唯一可行方法似乎是反复试验。大!?除了您需要重新部署环境的每次尝试。

对于如何使用自定义日志进行此操作只有一个参考:http://qiita.com/kozayupapa/items/2bb7a6b1f17f4e799a22我不知道该人如何反向设计文件格式。

缺点:

  • Cloudwatch在显示时似乎无法将日志拆分为列,因此您无法轻松按优先级等进行过滤。
  • AWS Console日志查看器没有自动刷新功能以跟踪日志。
  • Nightmare未记录的配置文件格式,无法测试。试验和错误需要重新部署整个实例。

5 个答案:

答案 0 :(得分:1)

也许AWS Lambda function适用?

写一些转储所有通知的javascript,然后看看你可以用这些做什么。

写入对象后,您可以在同一个存储桶中重命名它吗?

或者通知您自己的日志管理服务有关创建新对象的信息?

那里有很多可能性......

答案 1 :(得分:0)

我现在开始使用Sumologic了。有免费试用,然后免费试用(500mb /天,7天保留)。我还没有退出试用期,我的EB应用程序确实没有任何东西(这只是Nginx在docker容器中提供的几个HTML页面。看起来一旦你击中任何大量的日志就会变得昂贵。

到目前为止一切正常。您需要创建一个可以访问要读取的S3存储桶的IAM用户,然后将日志吸收到Sumologic服务器上,然后执行所有处理和搜索。设置起来有点繁琐,但我并没有真正看到它如何变得更简单,而且记录得相当充分。

它允许您使用通配符提供不同的路径表达式,然后为这些不同的路径分配“sourceCategory”。然后,您可以使用这些sourceCategories将日志搜索过滤到特定类型的日志记录。

我的长期计划是使用像你的解决方案3这样的东西,但这让我的订单很短,所以我可以继续其他事情。

答案 2 :(得分:0)

您可以使用Multicontainer环境,使用您喜欢的工具将日志文件夹共享到另一个docker容器以集中日志,在我们的示例中,我们连接了Apache Flume以将文件移动到HDFS。希望这可以帮助你。

答案 3 :(得分:0)

我发现这样做的最简单的方法是通过rsyslog和.ebextensions使用papertrail,但是记录所有内容非常昂贵。

很好的部分是使用rsyslog,你基本上可以将你的日志发送到任何地方而且你不会受到papertrail的束缚。

example ebextension

答案 4 :(得分:0)

我发现loggly是最方便的 它是托管服务,可能不是您想要的。但是,如果您查看他们的setup page,您可以看到支持您的情况的多种方式(docker specific solutions,以及10种亚马逊特定选项)。即使loggly不符合您的口味,您也可以查看这些解决方案,并轻松了解其中的一些解决方案如何应用于您可能使用或编写的大多数集中式日志记录解决方案。