作者:AbhinavDhasmana结构帮助我们发现问题,调试和监控应用程序。在最基本的层面上,我们应该期望我们的基础架构具有以下功能:能够在我们的日志中自由搜索文本能够搜索特定的api日志能够通过所有API的状态代码进行搜索随着我们向数据日志添加更多内容,系统应该是可扩展的架构提示:重用JavaScript组件使用Bit(Github)在不同项目之间共享和重用JavaScript组件。团队协作并共享组件以更快地构建应用程序。让Bit完成繁重的工作,您可以轻松发布、安装和更新各个组件,而无需任何开销。在这里了解更多。本地设置我们将使用Docker来管理服务。ElasticSearch使用以下命令启动并运行ElasticSearchdockerrun-p9200:9200-p9300:9300-e"discovery.type=single-node"--namemyESdocker.elastic.co/elasticsearch/elasticsearch:7.4.1通过以下命令检查您的容器是否启动并运行curl-XGET"localhost:9200/_cat/nodes?v&pretty"Kibana可以使用另一个dockerrun命令启动并运行。dockerrun---linkmyES:elasticsearch-p5601:5601kibana:7.4.1请注意,我们正在使用--link命令链接kibana和elasticsearch服务器如果你去http://localhost:5601/app/kibana,你会看到我们的kibana仪表板。现在可以使用kibana针对我们的Elasticsearch集群运行所有查询。我们可以导航到http://localhost:5601/app/kibana#/dev_tools/console?_g=()并运行我们之前运行的查询(稍微更冗长)FluentdFluentd是所有数据格式化的地方。让我们先构建我们的Dockerfile。它做了两件事:安装必要的包将配置文件复制到docker文件中fluentd的Dockerfile:FROMfluent/fluentd:latestMAINTAINERAbhinavDhasmanaUSERrootRUNapkadd--no-cache--update--virtual.build-deps\sudobuild-baseruby??-dev\&&sudogeminstallfluent-plugin-elasticsearch\&&sudogeminstallfluent-plugin-record-modifier\&&sudogeminstallfluent-plugin-concat\&&sudogeminstallfluent-plugin-multi-format-parser\&&sudogemsources--clear-all\&&apkdel.build-deps\&&rm-rf/home/fluent/.gem/ruby/2.5。0/cache/*.gemCOPYfluent.conf/fluentd/etc/fluent配置文件:#从端口9880通过http接收事件@typehttpport9880bind0.0.0.0#从24224/tcp接收事件@typeforwardport24224bind0.0.0.0#在进入ES之前我们需要处理数据#我们解析输入withkey"log"(https://docs.fluentd.org/filter/parser)@typeparserkey_namelog#保留结果中的原始键值对reserve_datatrue#使用apache2解析器插件解析数据@typemulti_formatformatapache2formatjsontime_keytimestampformatnone#如果事件发生,Fluentd将决定在这里做什么是匹配的#在我们的例子中,我们希望所有数据都匹配因此**#我们希望使用内置的#复制输出插件将所有数据复制到elasticsearchhttps://docs.fluentd.org/output/copy@typecopy#我们想使用out_elasticsearch插件将数据存储到弹性搜索#https://docs.fluentd.org/output/elasticsearch。安装见Dockerfile@typeelasticsearchtime_keytimestamp_mshost0.0.0.0port9200#使用常规的索引名称格式(logstash-%Y.%m.%d)logstash_formattrue#我们将在kibana从ES读取日志时使用这个logstash_prefixfluentdlogstash_dateformat%Y-%m-%dflush_interval1sreload_connectionsfalsereconnect_on_errortruereload_on_failuretrue让我们启动并运行这台Docker机器dockerbuild-tabhinavdhasmana/fluentd.dockerrun-p9880:9880--networkhostabhinavdhasmana/fluentdNode.js创建了一个小节点用于演示的.js应用程序,您可以在https://github.com/abhinavdha找到它……这是一个使用ExpressGenerator创建的小型Express应用程序。它使用morgan生成apache格式的日志。您也可以使用自己的应用程序。只要输出保持不变,我们的基础设施就不会在意。让我们构建并运行docker镜像。dockerbuild-tabhinavdhasmana/日志记录。当然,我们可以通过下面给出的单个dockercompose文件获取所有docker容器。为EFK设置撰写docker撰写文件:版本:“3”服务:流利的:构??建:“./fluentd”端口:-“9880:9880”-“24224:24224”网络模式:“主机”网络:构建:.ports:-“3000:3000”链接:-流畅的日志记录:驱动程序:“流畅的”选项:流畅的地址:本地主机:24224弹性搜索:图像:弹性搜索:7.4.1端口:-“9200:9200”-“9300:9300”环境:-discovery.type=single-nodekibana:image:kibana:7.4.1links:-"elasticsearch"ports:-"5601:5601"就是这样。我们的基础设施已经准备就绪。您现在可以通过访问http://localhost:3000生成一些日志。现在,我们再次转到kibana仪表板,并定义我们要使用的索引:请注意,在我们的fluent.conf中提到了logstash_prefixfluentd,因此我们在这里使用相同的字符串。接下来是一些基本的kibana设置。Elasticsearch使用动态映射来猜测其索引字段的类型。下面的截图展示了这些:让我们检查一下开头提到的需求是如何实现的:能够在日志中自由文本搜索:在ES和kibana的帮助下,我们可以在任何字段上搜索以获得结果。能够搜索特定的api日志:在kibana左侧的“Availablefields”部分,我们可以看到字段路径。对其应用过滤器可以找到我们感兴趣的API。能够按所有API的statusCode进行搜索:同上。使用代码字段并应用过滤器。随着更多数据被添加到日志中,系统应该是可扩展的:我们使用以下环境变量discovery.type=single-node以单节点模式启动Elasticsearch。您可以从集群模式开始,添加更多节点,或在我们选择的任何云提供商上使用托管解决方案。我试过AWS,它很容易设置。AWS还免费提供Elasticsearch的托管kibana实例。