1. 首页

生产环境下的 Node.js 日志记录方案

使用 ElasticSearch,Fluentd和Kibana 设置 Node.js 日志记录基础结构。

作者:Abhinav Dhasmana

翻译:疯狂的技术宅

原文:blog.bitsrc.io/setting-up-…

未经允许严禁转载

Photo by Ugne Vasyliute on Unsplash

设置正确的日志记录基础结构可帮助我们查找发生的问题、调试和监视应用程序。从最基本的角度来看,我们应该从基础架构中得到以下内容:

  • 能够在我们的日志中自由搜索文本
  • 能够搜索特定的 api 日志
  • 能够根据所有 API 的 statusCode 进行搜索
  • 随着我们向日志中添加更多的数据,系统应该是可扩展的

架构

使用ElasticSearch,Fluentd 和 Kibana 的架构图

提示:复用 JavaScript 组件

使用BitGithub)在不同项目之间共享和重用 JavaScript 组件。团队协作共享组件可以更快地构建应用程序。让 Bit 承担繁重的工作,可以使你可以轻松地发布、安装和更新各个组件,而不会产生任何开销。 在此处了解更多信息

带有 Bit 的 Loader 组件:轻松地在项目之间共享和同步

本地设置

我们将用 Docker 来管理服务。

弹性搜寻

使用以下命令启动并运行 ElasticSearch


docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --name myES docker.elastic.co/elasticsearch/elasticsearch:7.4.1

可以通过以下命令检查你的容器是否已启动并运行


curl -X GET "localhost:9200/_cat/nodes?v&pretty"

Kibana

可以用另一个 docker run 命令启动 Kibana 并使其运行。


docker run —-link myES:elasticsearch -p 5601:5601 kibana:7.4.1

请注意,我们正在使用 --link 命令链接 kibana 和弹性搜索服务器

如果转到 http://localhost:5601/app/kibana,将会看到我们的 kibana 仪表板。

现在,可以使用 kibana 对我们的弹性搜索集群运行所有查询。我们可以导航到


http://localhost:5601/app/kibana#/dev_tools/console?_g=()

并运行我们之前运行的查询(稍微冗长一些)

使用 kibana 查询弹性簇节点

Fluentd

Fluentd 是对所有数据进行格式化的地方。

让我们首先构建我们的 Dockerfile。它有两件事:

  • 安装必要的软件包
  • 将配置文件复制到 docker 文件中

适用于 fluentd 的 Dockerfile:


FROM fluent/fluentd:latest MAINTAINER Abhinav Dhasmana <Abhinav.dhasmana@live.com> USER root RUN apk add --no-cache --update --virtual .build-deps \ sudo build-base ruby-dev \ && sudo gem install fluent-plugin-elasticsearch \ && sudo gem install fluent-plugin-record-modifier \ && sudo gem install fluent-plugin-concat \ && sudo gem install fluent-plugin-multi-format-parser \ && sudo gem sources --clear-all \ && apk del .build-deps \ && rm -rf /home/fluent/.gem/ruby/2.5.0/cache/*.gem COPY fluent.conf /fluentd/etc/ //码农进阶题库,每天一道面试题 or Js小知识 https://www.javascriptc.com/interview-tips/

Js中文网 – 前端进阶资源教程 www.javascriptC.com,typescript 中文文档
一个帮助开发者成长的社区,你想要的,在这里都能找到

fluent 的配置文件:


# Recieve events over http from port 9880 <source> @type http port 9880 bind 0.0.0.0 </source> # Recieve events from 24224/tcp <source> @type forward port 24224 bind 0.0.0.0 </source> # We need to massage the data before if goes into the ES <filter **> # We parse the input with key "log" (https://docs.fluentd.org/filter/parser) @type parser key_name log # Keep the original key value pair in the result reserve_data true <parse> # Use apache2 parser plugin to parse the data @type multi_format <pattern> format apache2 </pattern> <pattern> format json time_key timestamp </pattern> <pattern> format none </pattern> </parse> </filter> # Fluentd will decide what to do here if the event is matched # In our case, we want all the data to be matched hence ** <match **> # We want all the data to be copied to elasticsearch using inbuilt # copy output plugin https://docs.fluentd.org/output/copy @type copy <store> # We want to store our data to elastic search using out_elasticsearch plugin # https://docs.fluentd.org/output/elasticsearch. See Dockerfile for installation @type elasticsearch time_key timestamp_ms host 0.0.0.0 port 9200 # Use conventional index name format (logstash-%Y.%m.%d) logstash_format true # We will use this when kibana reads logs from ES logstash_prefix fluentd logstash_dateformat %Y-%m-%d flush_interval 1s reload_connections false reconnect_on_error true reload_on_failure true </store> //码农进阶题库,每天一道面试题 or Js小知识 https://www.javascriptc.com/interview-tips/ </match>

让我们使这台 Docker 机器跑起来


docker build -t abhinavdhasmana/fluentd .docker run -p 9880:9880 --network host abhinavdhasmana/fluentd

Node.js 应用

我已经创建了一个用于演示的小型 Node.js 程序,你可以在 github.com/abhinavdhas… 中找到。这是一个用 Express Generator 创建的小型 Express 应用。它用 morgan 生成 apache 格式的日志。你也可以用自己的应用。只要输出保持不变,我们的基础架构就不会在意。让我们构建并运行 docker 映像。


docker build -t abhinavdhasmana/logging .

当然,我们可以通过下面给出的单个 docker compose 文件来获取所有 docker 容器。

为 EFK 设置撰写的 docker compose文件:


version: "3" services: fluentd: build: "./fluentd" ports: - "9880:9880" - "24224:24224" network_mode: "host" web: build: . ports: - "3000:3000" links: - fluentd logging: driver: "fluentd" options: fluentd-address: localhost:24224 elasticsearch: image: elasticsearch:7.4.1 ports: - "9200:9200" - "9300:9300" environment: - discovery.type=single-node kibana: image: kibana:7.4.1 links: - "elasticsearch" ports: - "5601:5601"

就是这样而已。我们的基础架构已准备就绪。现在可以通过访问 http://localhost:3000 来生成一些日志。

现在,我们再次转到 kibana 仪表板,并定义要使用的索引:

设置在 kibana 中使用的索引

注意,在我们的 fluent.conf 中提到了 logstash_prefix fluentd,因此我们在这里使用相同的字符串。接下来是一些基本的 kibana 设置。

设置 kibana 配置

弹性搜索使用动态映射来猜测其索引字段的 type。下面的截图显示了这些:

弹性搜索的截图示例

让我们检查一下如何满足开始时提到的要求:

  • 能够在日志中自由文本搜索: 在 ES 和 kibana 的帮助下,我们可以在任何字段上进行搜索以获得结果。
  • 能够搜索特定的api日志: 在 kibana 左侧的 “Available fields” 部分中,我们可以看到字段 path。对其应用过滤器可以查找我们感兴趣的 API。
  • 能够根据所有API的 statusCode 进行搜索: 与上述相同。使用 code 字段并应用过滤器。
  • 随着向日志中添加更多的数据,系统应该是可扩展的: 我们使用以下环境变量 discovery.type = single-node 在单节点模式下开始了弹性搜索。可以从集群模式开始,添加更多节点,或者在我们选择的任何云提供商上使用托管解决方案。我已经尝试过了 AWS,并且易于设置。 AWS 还免费提供 Elasticsearch 的托管 kibana 实例。

作者:前端先锋
链接:https://juejin.im/post/5df9e3435188251284218e09

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「画漫画的程序员」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

本文著作权归作者所有,如若转载,请注明出处

转载请注明:文章转载自「 Js中文网 · 前端进阶资源教程 」https://www.javascriptc.com

标题:生产环境下的 Node.js 日志记录方案

链接:https://www.javascriptc.com/3188.html

« 前端面试从准备到谈薪完全指南(看完跳槽少说涨 5 K)
每个开发人员都应该掌握的 11 个控制台命令»
Flutter 中文教程资源

相关推荐

QR code