加载中

使用 Filebeat 从 Node.js Web 应用程序摄取日志

本指南演示了如何从 Node.js Web 应用中摄取日志,并将其安全地传输到 Elastic Cloud Hosted 或 Elastic Cloud Enterprise 部署中。你将使用 Filebeat 和 Filestream 输入来完成此操作。你将运行一个简单的 Node.js 服务器,该服务器会发出 ECS 格式的 JSON 日志,并将其安全地转发到 Elastic Cloud,然后在 Kibana 中进行探索。

虽然此示例使用的是 Node.js,但这种监控日志输出的方法适用于多种客户端类型。请查看可用 ECS 日志插件列表。

所需时间:1.5 小时

要完成这些步骤,你的系统需要安装以下应用程序

  • Node.js(LTS 或更高版本)- 你将设置一个简单的 Node.js Web 服务器和客户端应用程序。请查看 Node.js 下载页面获取安装说明。
  • Filebeat
提示

对于以下三个包,你可以创建一个工作目录,使用 Node 包管理器 (NPM) 安装这些包。然后,你可以从同一个目录运行 Node.js Web 服务器和客户端,以便使用这些包。或者,你也可以通过使用 -g 选项运行 Node 包安装命令来全局安装 Node 包。有关详细信息,请参阅 NPM 包安装说明

  • winston:Node.js 的一个常用日志记录包。创建一个新的本地目录,并运行以下命令在其中安装 winston

    npm install winston
    		
  • Node.js winston 记录器的 Elastic Common Schema (ECS) 格式化程序:此插件将你的 Node.js logs 格式化为非常适合摄取到 Elasticsearch 的 ECS 结构化 JSON 格式。要安装 ECS winston 记录器,请在你的工作目录中运行以下命令,以便将该包安装在与 winston 包相同的位置

    npm install @elastic/ecs-winston-format
    		
  • Got:Got 是一个“为 Node.js 设计的、人性化且功能强大的 HTTP 请求库”——此插件可用于查询本教程中使用的示例 Web 服务器。要安装 Got 包,请在你的工作目录中运行以下命令

    npm install got
    		

确保你可以访问 Elastic Cloud 部署。稍后连接 Filebeat 时,你需要用到 Cloud ID 和凭据。

要查找你的 Cloud ID,请打开 Elastic Cloud 控制台,找到你的部署,然后选择 Manage(管理)。在 Deployment overview(部署概览)页面上,复制显示的 Cloud ID 值。你将在 filebeat.yml 配置文件中使用它。

连接、向其流式传输数据以及发出查询需要身份验证。支持两种身份验证机制

  • 基本身份验证:本教程从基本身份验证开始,因为它更容易快速上手。
  • API 密钥:API 密钥更安全,是生产环境的首选。要生成和使用 API 密钥,请参阅可选:使用 API 密钥进行身份验证

首先,创建一个运行 Web 服务器并记录 HTTP 请求的基本 Node.js 脚本。

  1. 安装依赖项

    npm init -y
    npm install winston @elastic/ecs-winston-format got
    		
  2. 创建 webserver.js

    const http = require('http')
    const winston = require('winston')
    const ecsFormat = require('@elastic/ecs-winston-format')
    
    const logger = winston.createLogger({
      level: 'info',
      format: ecsFormat({ convertReqRes: true }),
      transports: [
        new winston.transports.File({
          filename: 'logs/log.json',
          level: 'info'
        })
      ]
    })
    
    const server = http.createServer((req, res) => {
      res.setHeader('Foo', 'Bar')
      res.end('ok')
      logger.info('handled request', { req, res })
    })
    
    server.listen(3000, () => {
      logger.info('listening at https://:3000')
    })
    		
  3. 运行服务器

    node webserver.js
    		
  4. 测试应用程序

    脚本运行后,打开 Web 浏览器访问 https://:3000,应该会看到一条简单的 ok 消息。

在你创建 webserver.js 的目录中,现在应该能找到一个新建的 logs/log.json 文件。打开该文件并检查其内容。应该会有一条日志条目指示 Node.js 正在监听 localhost 端口,还有一条日志条目记录了你在浏览器中打开 localhost 时的 HTTP 请求。

暂时让 webserver.js 保持运行,我们将向它发送一些 HTTP 请求。

在此步骤中,你将创建一个 Node.js 应用程序,向你的 Web 服务器发送 HTTP 请求。

  1. 创建流量生成器

    创建 webrequests.js 以发送随机 HTTP 请求

    const got = require('got')
    
    const addresses = ['aardvark@zoo', 'emu@zoo', 'otter@zoo']
    const methods = ['get', 'post', 'put']
    
    async function sleep(ms) {
      return new Promise(r => setTimeout(r, ms))
    }
    
    ;(async () => {
      while (true) {
        const method = methods[Math.floor(Math.random() * methods.length)]
        const from = addresses[Math.floor(Math.random() * addresses.length)]
        try {
          await got['got'][method]('https://:3000', { headers: { from } })
        } catch (err) {
          console.log("cannot execute request:", err)
        }
        await sleep(Math.random() * 5000 + 2000)
      }
    })()
    		

    此 Node.js 应用程序生成具有随机方法(类型为 GETPOSTPUT)的 HTTP 请求,以及使用各种伪造电子邮件地址的随机 from 请求头。请求以 2 到 7 秒之间的随机间隔发送。

    Got 包用于发送请求,请求指向你的 Web 服务器 https://:3000。要了解有关发送自定义头(例如本例中使用的 from 字段)的信息,请查看 Got 文档中的 headers(头信息)。

  2. 运行流量生成器

    在新的终端窗口中,试运行该 Node.js 脚本

    node webrequests.js
    		
  3. 验证日志生成

    脚本运行约 30 秒后,输入 CTRL + C 停止它。查看你的 Node.js logs/log.json 文件。它应该包含如下条目

    {"@timestamp":"2025-10-14T16:11:36.402Z","client":{"address":"::1","ip":"::1","port":42836},"ecs.version":"8.10.0","http":{"request":{"body":{"bytes":0},"headers":{"accept-encoding":"gzip, deflate, br","connection":"keep-alive","content-length":"0","from":"emu@zoo","host":"localhost:3000","user-agent":"got (https://github.com/sindresorhus/got)"},"method":"PUT"},"response":{"headers":{"foo":"Bar"},"status_code":200},"version":"1.1"},"log.level":"info","message":"handled request","url":{"full":"https://:3000/","path":"/"},"user_agent":{"original":"got (https://github.com/sindresorhus/got)"}}
    		

    每个日志条目都包含 HTTP 请求的详细信息。具体来说,在此示例中,你可以找到请求的时间戳、PUT 类型的请求方法,以及带有电子邮件地址 emu@zoofrom 请求头。由于请求类型和电子邮件地址是随机生成的,你的示例可能会有所不同。

  4. 停止 Node.js 脚本

    在确认 webserver.jswebrequests.js 均按预期运行后,输入 CTRL + C 停止 Node.js 脚本。

要收集并将 Node.js 应用程序日志转发到 Elastic Cloud,你需要将 Filebeat 设置为日志采集器。

  1. 下载并安装 Filebeat

    下载 Filebeat 并将其解压到你要从中收集数据的本地服务器上。

  2. 配置 Filebeat 以访问 Elastic Cloud Hosted 或 Elastic Cloud Enterprise

    <localpath>/filebeat-<version>/ 中(其中 <localpath> 是 Filebeat 的安装目录,<version> 是 Filebeat 版本号),打开 filebeat.yml 配置文件进行编辑。

    cloud.id: "my-deployment:xxxxxxxxxxxx"
    cloud.auth: "elastic:your_password"
    		

Filebeat 提供了一种简单直观、易于配置的方法来监控你的 Node.js 日志文件,并将日志数据导入到你的部署中。

  1. 确保云凭据正确

    打开 Filebeat 安装目录中的 filebeat.yml 文件,并检查你的 Elastic Cloud 凭据。它们看起来应该类似于以下内容

    cloud.id: my-deployment:yTMtd5VzdKEuP2NwPbNsb3VkLtKzLmldJDcyMzUyNjBhZGP7MjQ4OTZiNTIxZTQyOPY2C2NeOGQwJGQ2YWQ4M5FhNjIyYjQ9ODZhYWNjKDdlX2Yz4ELhRYJ7
    cloud.auth: elastic:591KhtuAgTP46by9C4EmhGuk
    		
  2. 定义 Filestream 输入

    配置 Filebeat 以监控你的 Node.js 日志文件

    filebeat.inputs:
    - type: filestream
      id: nodejs-logs
      paths:
        - /full/path/to/logs/log.json
      parsers:
        - ndjson:
            overwrite_keys: true
            add_error_key: true
            expand_keys: true
    		
    重要提示

    旧的 log 输入已被弃用。请将 filestreamndjson 解析器结合使用来处理 JSON 日志文件。

  3. 可选:配置 API 密钥身份验证

    你可以用 API 密钥替换 cloud.auth 以增强安全性

    output.elasticsearch:
      api_key: "id:api_key"
    		

Filebeat 附带预定义的资产,用于解析、索引和可视化你的数据。按照以下步骤启动 Filebeat 并开始将你的 Node.js 日志传输到 Elasticsearch。

  1. 设置 Filebeat 资产

    通过在 Filebeat 安装目录中运行以下命令来加载预定义的资产

    ./filebeat setup -e
    ./filebeat -e
    		
    重要提示

    根据安装位置、环境和本地权限等变量,你可能需要 更改 filebeat.yml 的所有权,或者你可以通过使用 --strict.perms=false 选项运行命令来禁用严格权限检查。

  2. 处理权限问题(如果需要)

    如果在读取 filebeat.yml 时遇到权限错误,请尝试禁用配置文件的权限检查

    ./filebeat -e --strict.perms=false
    		
  3. 验证数据摄取

    Filebeat 应该开始跟踪 logs/log.json 并将事件传输到 Elasticsearch。要验证设置,请执行以下操作

    1. 登录 Kibana.
    2. 打开 Kibana 主菜单,在 Observability(可观测性)下选择 Discover(发现)。
    3. Data view(数据视图)下拉菜单中,选择 filebeat-*

    你应该能看到已摄取的事件。

为了提高安全性,你可以通过 Elastic Cloud Hosted 或 Elastic Cloud Enterprise 控制台生成 Elasticsearch API 密钥,而不是使用基本身份验证,然后配置 Filebeat 使用新密钥安全地连接到你的部署。

  1. 打开开发工具

    从 Kibana 主菜单中,打开 Developer tools(开发工具)。

  2. 生成 API 密钥

    输入以下请求

    POST /_security/api_key
    {
      "name": "filebeat-api-key",
      "role_descriptors": {
        "filebeat_role": {
          "cluster": ["manage_index_templates", "monitor", "read_ilm"],
          "index": [
            {
              "names": ["filebeat-*"],
              "privileges": ["create_index", "write", "read", "manage"]
            }
          ]
        }
      }
    }
    		
  3. 执行并复制 API 密钥

    输出应该类似于以下内容

    {
      "id": "yC9C5JkBk-xuk5nSlGlK",
      "name": "filebeat-api-key",
      "api_key": "hGDpbhHEeAUbvNaQlStNlg",
      "encoded": "eUM5QzVKa0JrLXh1azVuU2xHbEs6aEdEcGJoSEVlQVVidk5hUWxTdE5sZw=="
    }
    		
  4. 配置 Filebeat 使用 API 密钥

    将你的 API 密钥信息添加到 filebeat.ymlElasticsearch Output(Elasticsearch 输出)部分,就在 output.elasticsearch: 下方。使用 <id>:<api_key> 格式。

    cloud.id: my-deployment:yTMtd5VzdKEuP2NwPbNsb3VkLtKzLmldJDcyMzUyNjBhZGP7MjQ4OTZiNTIxZTQyOPY2C2NeOGQwJGQ2YWQ4M5FhNjIyYjQ9ODZhYWNjKDdlX2Yz4ELhRYJ7
    #cloud.auth: elastic:591KhtuAgTP46by9C4EmhGuk
    output.elasticsearch:
      api_key: "yC9C5JkBk-xuk5nSlGlK:hGDpbhHEeAUbvNaQlStNlg"
    		

现在是将一些日志数据发送到 Elasticsearch 的时候了。按照以下步骤启动数据管道,并验证你的日志已成功被摄取。

  1. 启动 Filebeat

    通过在 Filebeat 安装目录中运行以下命令来启动 Filebeat

    ./filebeat -e
    		

    在此命令中,-e 标志将输出发送到标准错误,而不是配置的日志输出。

    注意

    如果命令未按预期工作,请查看 Filebeat 快速入门了解特定于操作系统的语法。

  2. 启动 Node.js Web 服务器

    Filebeat 现在应该正在运行并监控 logs/log.json 的内容。让我们向其中追加数据。打开一个新的终端实例并运行 webserver.js Node.js 脚本

    node webserver.js
    		
  3. 生成日志流量

    运行 Node.js webrequests.js 脚本以向 Node.js Web 服务器发送随机请求

    node webrequests.js
    		

    让脚本运行几分钟。之后,确保 logs/log.json 文件按预期生成并填充了多个日志条目。

  4. 在 Kibana 中验证日志摄取

    下一步是确认日志数据已成功进入 Elastic Cloud Hosted 或 Elastic Cloud Enterprise

    1. 登录 Kibana.
    2. 打开 Kibana 主菜单,在 Observability(可观测性)下选择 Discover(发现)。
    3. Data view(数据视图)下拉菜单中,选择 filebeat-*

    你应该能看到已摄取的事件。

现在,你可以在 Kibana 中探索和可视化已摄取的日志数据,从而从你的 Node.js 应用程序中获取见解。

要可视化你的日志数据,请参考 Kibana 关于创建可视化的文档。这可确保你为你的部署使用了最新的界面。

通过在每个终端窗口中按 Ctrl + C 停止所有正在运行的进程。

完成后,你可以删除临时文件,例如 logs/ 目录和 node_modules 文件夹。

你已经学习了如何监控来自 Node.js Web 应用程序的日志文件,将日志事件数据安全地传输到 Elastic Cloud Hosted 或 Elastic Cloud Enterprise 部署中,然后在 Kibana 中实时可视化结果。要了解有关数据摄取和处理选项的更多信息,请参阅 Filebeat 文档

© . This website operates independently and is not affiliated with or endorsed by Elasticsearch B.V. All brand names, logos, and trademarks are the property of their respective owners.