在 IBM Bluemix 中,应用程序实例可以随时消失(比如在重新启动应用程序或者将它移动到不同主机的时候),这使得程序调试变得很困难。除了应用程序的日志消息之外,通过 Bluemix 记录事件数据也有助于故障排除,这些数据总是转瞬即逝。在试图发现服务器或应用程序中的问题时,集中应用程序日志可能很有用,因为这允许您在一个地方搜索所有日志。它还允许通过在特定的时间范围内关联日志,让您识别跨多个服务器的问题。在本教程中,我们将向您展示如何使用的 ELK Stack 组件(Elasticsearch、Logstash 和 Kibana)为持久存储日志提供一个集中的存储位置,以及如何使用这些组件来分析和可视化日志数据。
“ 将日志保存在一个地方,这样您就可以搜索它们,而且可能获得对您的应用程序的前所未知的见解。这还有助于您可视化各种指标,比如谁在访问应用程序,哪些部分被用得最多。 ”
在本教程中,我们将介绍安装和配置 ELK Stack 组件的必要步骤。还将解释如何在一个单独的 Ubuntu 服务器上安装 Elasticsearch 和 Logstash,如何创建一个 Bluemix 服务,使用它充当您的 Bluemix 应用程序的日志输出(log drain)服务,以及如何使用 nginx Web 服务器 buildpack 在 Bluemix 中部署 Kibana。最后,我们将介绍一些基础知识,让您了解如何在 Kibana 中创建一个自定义仪表板来可视化您的日志数据。
sudo apt-get install openjdk-7-jre
如果您无权访问 Ubuntu 服务器,那么可以通过使用以下步骤提供一个 SoftLayer 服务器:
点击查看大图
关闭 [x]
点击查看大图
关闭 [x]
在设置您自己的 ELK 堆栈之前,了解一点关于该堆栈及其组件的知识会对您有所帮助。
ELK Stack 由三个组件组成: Logstash 、 Elasticsearch 和 Kibana 。
Logstash 是一个用来管理日志的工具。它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。它可以从许多来源接收日志,这些来源包括 syslog、消息传递(例如 rabbitmq)和 jmx,它能够以多种方式输出数据,包括电子邮件、websockets 和 Elasticsearch。
Elasticsearch 是一种全文的、实时的搜索和分析引擎,它存储通过 Logstash 索引的日志数据。它构建于 Apache Lucene 搜索引擎库之上,通过 REST 和 Java api 来公开数据。Elasticsearch 是可扩展的,构建它是为了供分布式系统使用它。
Kibana 是一个基于 Web 的图形界面,用于搜索、分析和可视化存储在 Elasticsearch 指标中的日志数据。它利用 Elasticsearch 的 REST 接口来检索数据,不仅允许用户创建他们自己的数据的定制仪表板视图,还允许他们以特殊的方式查询和过滤数据。
下图说明了如何使用 ELK Stack 组件从 IBM Bluemix 收集日志数据。
点击查看大图
关闭 [x]
mkdir ~/logstash
)。 tar -xvfz logstash-1.4.2.tar.gz
。 mkdir ~/elasticsearch
)。 tar -xvfz elasticsearch-1.3.4.tar.gz
。 bin/elasticsearch
-d
。 curl -X GET http://localhost:9200/
。
如果安装成功,则会看到类似下面的内容:
{ "status" : 200, "name" : "Thundra", "version" : { "number" : "1.3.4", "build_hash" : "a70f3ccb52200f8f2c87e9c370c6597448eb3e45", "build_timestamp" : "2014-09-30T09:07:17Z", "build_snapshot" : false, "lucene_version" : "4.9" }, "tagline" : "You Know, for Search" }
要配置 Logstash,必须创建一个包含以下三个部分的配置文件:输入、过滤器和输出。
配置文件的第一部分定义了您的输入。输入是负责吸收数据的 Logstash 模块。 产品文档 中描述了有关输入的许多选项。在本教程中,我们将配置一个 TCP 输入,因为 Bluemix 使用了 TCP 协议来传输 syslog 数据。
下一节将定义过滤器。过滤器是解析原始数据并将它们转换成具有更多结构的某种格式的模块。Logstash 有许多用来过滤数据的插件,其中最有用的插件之一是 grok 。通过向常用模式分配标签,Grok 使得使用正则表达式来解析日志变得很容易。grok 模式的语法如下所示:
%{PATTERN:IDENTIFIER}
Logstash 过滤器包含一系列的 grok 模式,可以将各种日志消息匹配和分配给各种标识符,这就是为日志分配结构的方式。Logstash 提供了标准模式来匹配通用组件的日志格式,这些组件包括 Apache、syslog、mysql 和 redis。但是,也可以创建新的模式来匹配任何日志文件格式。在本教程中,我们将向您展示如何创建一个名为 custom 的新文件,并将它放在 Logstash 安装目录的 patterns 目录中。这个新文件将包含用来匹配 Bluemix 日志消息的 grok 模式。通过将此模式放在一个单独的文件中,您可以在 Logstash 过滤器中使用它。
阅读: 了解有关针对 Logstash 的 grok 插件的更多信息
配置文件的最后一部分定义了输出。输出是将已解析的数据传递给前提组件的模块。在本教程中,我们将向您展示如何配置输出,将日志数据发送到 Elasticsearch,以及如何将它们发送到控制台。
点击查看代码清单
关闭 [x]
input { tcp { port => 5000 type => syslog } } filter { grok { match => { "message" => "%{SYSLOG5424PRI}%{NONNEGINT:syslog5424_ver} +(?:%{TIMESTAMP_ISO8601:syslog5424_ts}|-) +(?:%{HOSTNAME:syslog5424_host}|-) +(?:%{NOTSPACE:app_id}|-) +(?:%{NOTSPACE:syslog5424_proc}|-) +(?:%{WORD:syslog5424_msgid}|-) +(?:%{SYSLOG5424SD:syslog5424_sd}|-|) +%{CLOUDFOUNDRYAPP:syslog5424_msg}" } add_field => { "format" => "cf" } } } output { elasticsearch { host => localhost protocol => http } stdout { codec => rubydebug } }
点击查看代码清单
关闭 [x]
CLOUDFOUNDRYAPP %{NOTSPACE:domain} - /[%{NOTSPACE:timex} %{NOTSPACE:milis}/] "%{HTTPMETHOD:httpmethod} %{PATH:path} %{NOTSPACE:protocol}" %{INT:response_code} %{INT:not_sure_todo} HTTPMETHOD (GET|PUT|POST|DELETE)
bin/logstash agent -f log.conf
cf create-user-provided-service SERVICENAME -l syslog://HOST:PORT
SERVICENAME
是您想要对您的服务使用的名称。 HOST
是 Logstash 服务器的 IP 地址。 PORT
应该是 5000,如 Logstash 配置文件的输入部分中所配置的那样。 cf bind-service APPNAMESERVICENAME
APPNAME
是您想要附加日志服务的应用程序的名称。 SERVICENAME
是从前面的命令中获得的名称。 cf restage
命令立即执行此操作。
现在,不但应该将 stdout 和 stderr 日志消息发送到 Logstash,还应该将有关您的应用程序的其他 Bluemix 事件发送到 Logstash。
阅读: 使用第三方日志管理服务:了解有关在 Cloud Foundry 中创建日志输出的更多信息
阅读: 用户提供服务实例:了解有关 Cloud Foundry 中用户提供的服务的更多信息
要验证您刚才创建的日志输出服务能够正常工作,需要确保日志消息已被记录到 Logstash 控制台。通过重启 Bluemix 应用程序生成一些日志消息,然后查看 Logstash 控制台。如果一切工作正常,那么您应该会在控制台中看到如下所示的消息:
点击查看大图
关闭 [x]
elasticsearch: "http://IP_ADDRESS:9200"
。 name
和 host
属性。 applications: - name: kibana-in-bluemix memory: 128M host: kibana-in-bluemix buildpack: https://github.com/cloudfoundry-community/nginx-buildpack.git
cf push
命令将 Kibana 部署到 Bluemix。 如果正确安装了 Kibana,则会看到类似下面的内容出现在您的浏览器中。
点击查看大图
关闭 [x]
要创建一个新的仪表板,请执行以下操作:
点击查看大图
关闭 [x]
点击查看大图
关闭 [x]
让我们为它分配一个标题(例如,Log records),并将跨度更改为 12,但保持其他选项的默认值。然后单击 Save 。现在,向下滚动现有的直方图,您应该能够看到所有日志记录。
点击查看大图
关闭 [x]
[App/0]
的日志记录是将通过我们的 Bluemix 应用程序记录的消息,但其他记录拥有其他的标识符,比如 [RTR]
。RTR 记录实际上是通过 Bluemix 路由器进行记录的。 点击查看大图
关闭 [x]
cf
的记录。 cf
的应用程序。查询某个特定字段,按照模式 "field_name:value" 进行查询。找到带有绿点和类型为 format:cf
的查询框,如下所示: cf
的记录。 cf
的记录。通过执行此操作,可以有效地将数据分隔成相反的类别。首先单击 format:cf
查询右边的加号图标,创建另一个查询。此查询的颜色将是橙色的。接下来,将 NOT format:cf
输入到新查询中。 阅读: Kibana 简介:了解关于 Kibana 的更多信息
阅读: Kibana 3 文档:访问 Kibana 3 上的 Elasticsearch 官方文档
阅读: Kibana 3: milestone 4:从关于 3.4 版本的 Elasticsearch 博客中了解关于 Kibana 3 特性的更多信息
我们目前为止介绍的所有内容都很有用,在开始使用 ELK Stack 为您的 IBM Bluemix 应用程序 汇集日志时,需要掌握这些知识。不过,当您在生产环境中使用此解决方案时,仍有一些问题需要解决,这些问题的详细介绍已超出了本文的讨论范围。这些问题可以确保您数据的安全和删除过时的日志。
如果您在生产环境中使用 ELK Stack,则应该采用适当的凭证,使用最佳实践来运行 Logstash Elasticsearch 作为守护进程服务。
要保护 Kibana,可以配置您的 Web 服务器来限制用户访问,或者可以探索第三方产品,比如 https://github.com/christian-marie/kibana3_auth 。此外,可以参考以下两个参考资料,获得关于安全性的更多信息。
阅读: 生成部署:了解关于保障 Elasticsearch 安全的更多信息。
阅读: Logstash 的官方文档包含有关安全性的其他信息和各种配置选项。
现在,您已经将所有日志通过 Logstash 集中到了 Elasticsearch 中,如何删除已经不再有用、只会占用索引中的空间和内存的旧记录呢?处理这个问题的一个方法是使用一个名为 Curator 的 Elasticsearch 工具,它有助于您使用简单的命令来管理时间序列指数,这些命令包括 delete
、 optimize
、 close
、 snapshot
和 alias
。
下面的指令可以帮助您开始了解 Curator,创建一个将处理清除工作的 cron 作业。
sudo apt-get install python-pip
。 sudo pip install elasticsearch-curator
。 crontab -e
。 20 0 * * * /usr/local/bin/curator --host 127.0.0.1 delete --older-than 120
另一个作业用于关闭超过 90 天的指数:
20 0 * * * /usr/local/bin/curator --host 127.0.0.1 close --older-than 90
IBM Bluemix 使开发人员能够快速构建、部署和管理云应用程序,并搭建一个由可用服务和运行时框架组成的不断成长的生态系统。与此同时,Bluemix 要求开发人员重新思考他们开发应用程序的方式,包括如何处理日志文件。通过利用 Bluemix 的日志输出功能,ELK Stack 使得开发人员能够捕获、转换、分析和可视化应用程序的日志,最终使他们能够从应用程序中获得新的洞察。此外,ELK Stack 并不局限于 Bluemix 应用程序;它可以接收来自各种来源的日志数据,支持开发一个堆栈,集成来自整个企业的应用程序产品组合的数据。