使用 Fluentd 和 BigQuery 实时分析日志

本教程介绍如何实时记录和分析浏览器流量。当您拥有各种来源的大量日志记录,希望调试问题或从中生成最新统计信息时,这一方法会很有用。

本教程介绍了如何使用 Fluentd 将 NGINX Web 服务器生成的日志信息发送到 BigQuery,然后使用 BigQuery 分析日志信息。本教程假定您基本熟悉 Google Cloud Platform (GCP)、Linux 命令行、应用日志收集和日志分析。

简介

日志是查看大型系统和应用运行性能的强大工具。但是,随着此类系统的规模和复杂性的不断增长,管理分布在一系列计算资源上的众多日志也越来越具有挑战性。

Fluentd 是一款流行的开源日志收集器,旨在将跨多个数据源和系统的日志收集到一个统一的日志记录层中。由于事先很难知道哪些数据可能对分析有用,因此一种常见的方法是记录所有数据并在以后对其进行分类处理。但收集和存储所有的这些数据可能会非常麻烦,以致于您寻找解决方案的速度会变得非常缓慢,而且困难重重。

这就是 BigQuery 的优势对于日志数据分析的有用之处。BigQuery 是 Google 完全托管的高可扩缩性云数据仓库和分析引擎。它可以在几十秒内对 TB 级日志执行查询。此性能使您可以快速找到所需的解决方案,以修复或改进您的系统。

默认情况下,您每秒可以将 10 万行日志数据流式插入到 BigQuery 中,并且可以通过申请增加配额来提高此限额。

Fluentd 有一个输出插件,该插件可以使用 BigQuery 作为收集到的日志的目标存储空间。使用该插件,您可以从许多服务器以近乎实时的速度将日志直接加载到 BigQuery 中。然后,您可以创建一个在 Google 表格或 Google 数据洞察中频繁更新的信息中心,从而轻松呈现这些数据。

目标

  • 在 Compute Engine 实例中运行 NGINX Web 服务器。
  • 安装 Fluentd 日志收集代理。
  • 配置 Fluentd 以执行以下操作:
    • 收集 NGINX 流量日志。
    • 将日志转发到 BigQuery。
  • 使用 BigQuery 网页界面查询日志消息。
  • 使用 BigQuery 对日志运行分析查询。

费用

本教程使用 Google Cloud Platform 的可计费组件,包括:

  • Compute Engine
  • BigQuery

请使用价格计算器根据您的预计使用情况来估算费用。

准备工作

  1. 登录您的 Google 帐号。

    如果您还没有 Google 帐号,请注册新帐号

  2. 选择或创建 Google Cloud Platform 项目。

    转到“管理资源”页面

  3. 确保您的 Google Cloud Platform 项目已启用结算功能。

    了解如何启用结算功能

完成本教程后,您可以删除所创建的资源以避免继续计费。如需了解详情,请参阅清理

创建 NGINX Web 服务器虚拟机

在本教程中,您将使用 GCP Marketplace 创建一个预先配置为运行 NGINX Web 服务器的 Compute Engine 实例。

  1. 在 GCP Console 中,转到 Nginx(Google 一键部署)映像的 Marketplace 详细信息页面:

    转到 NGINX 详细信息页面

  2. 点击在 Compute Engine 上启动

  3. 如果系统提示您,请选择要使用的 GCP 项目。

  4. 等待系统启用所需的 API。

  5. 将部署命名为 nginx

  6. 选择位于美国区域或欧洲区域的地区。

  7. 网络部分的防火墙下,确保选中允许 HTTP 流量选项。

  8. 阅读服务条款下列出的条款。

  9. 如果您接受条款,请点击部署

    部署详细信息屏幕会显示正在您指定的地区中创建的新虚拟机,以及正在安装的 NGINX Web 服务器。

  10. 等待部署完成,然后再继续。

添加权限

虚拟机需要具有额外的权限才能将数据写入到 BigQuery 中。如需修改虚拟机权限,您必须先关停虚拟机。

  1. 在 GCP Console 中,转到 Compute Engine“虚拟机实例”页面。

    转到“虚拟机实例”页面

    您会看到一个名为 nginx-vm 的新虚拟机实例。

  2. 如需打开虚拟机的详细信息页面,请点击虚拟机名称。

  3. 点击页面顶部的停止按钮。

    关停虚拟机需要一些时间。

  4. 点击页面顶部的修改

  5. 向下滚动并将 BigQuery 访问权限更改为已启用

  6. 点击页面底部的保存

  7. 点击页面顶部的启动,以重启具有新权限的虚拟机。

请勿关闭此页面;您将在下一部分中继续使用此页面。

安装 Fluentd 和 BigQuery 连接器

在本教程的这一部分中,您将在虚拟机上安装 Fluentd 日志收集器和 BigQuery 的 Fluentd 输出插件。

  1. 在虚拟机实例详细信息页面中,点击“SSH”按钮以建立与实例的连接。
  2. 在虚拟机的 Shell 窗口中,验证 Debian 的版本:

    lsb_release -rdc
    

    结果会显示虚拟机上运行的 Debian 版本及其代号:

    Description:    Debian GNU/Linux 9.6 (stretch)
    Release:        9.6
    Codename:       stretch
    
  3. 转到 Debian 的 Fluentd 下载页面,然后找到 Debian 代号版本的安装命令行。

    例如,对于 Debian Stretch,您会找到以下命令:

    curl -L
       https://toolbelt.treasuredata.com/sh/install-debian-stretch-td-agent3.sh
       | sh
    
  4. 将命令复制到虚拟机的 Shell 窗口中。

    此命令会在虚拟机上安装 td-agent 软件包。该软件包内含 Fluentd 发行版。

  5. 安装 Fluentd-to-BigQuery 插件:

    sudo /usr/sbin/td-agent-gem install fluent-plugin-bigquery
    

创建 BigQuery 数据集和表以作为日志的目标存储空间

Fluentd 可以使用输入插件收集其他应用和服务生成的日志。它会将这些数据解析为结构化 JSON 记录,这些记录随后会转发到任何已配置的输出插件。

Fluentd NGINX 访问日志解析器会读取 NGINX access.log 文件。以下列表显示了包含字段和示例值的示例记录。

time: 1362020400
record:
{
  "remote"              : "127.0.0.1",
  "host"                : "192.168.0.1",
  "user"                : "-",
  "method"              : "GET",
  "path"                : "/",
  "code"                : "200",
  "size"                : "777",
  "referer"             : "-",
  "agent"               : "Opera/12.0",
  "http_x_forwarded_for": "-"
}

在 BigQuery 中创建日志目标表时,列名称必须与日志记录中的字段名称完全匹配。在以下步骤中,请务必使用建议的名称,以便随后的表列名称正确无误。

  1. 打开 BigQuery 网页界面:

    转到 BigQuery 网页界面

  2. 在导航面板的资源下,点击您的项目名称。

  3. 在详细信息面板的查询编辑器下,点击创建数据集

  4. 对于数据集 ID,输入 fluentd

  5. 对于数据位置,选择创建了 NGINX 实例的多区域位置(美国或欧洲)。

  6. 点击创建数据集

  7. 在导航面板的资源下,点击 fluentd 数据集。

  8. 在详细信息面板的查询编辑器下,点击创建表

  9. 对于表名称,输入 nginx_access

  10. 选择以文本形式修改选项。

  11. 将以下 JSON 列定义复制到文本框中。

    [  { "type": "TIMESTAMP", "name": "time" },
       { "type": "STRING",    "name": "remote" },
       { "type": "STRING",    "name": "host" },
       { "type": "STRING",    "name": "user" },
       { "type": "STRING",    "name": "method" },
       { "type": "STRING",    "name": "path" },
       { "type": "STRING",    "name": "code" },
       { "type": "INTEGER",   "name": "size" },
       { "type": "STRING",    "name": "referer" },
       { "type": "STRING",    "name": "agent" },
       { "type": "STRING",    "name": "http_x_forwarded_for" } ]
    

    请注意,列名称与 Fluentd 日志记录中的字段名称完全匹配。通过将日志记录时间戳转换为与 BigQuery 兼容的时间戳字符串,系统会将 time 列值添加到记录中。

  12. 分区列表中,选择“按字段分区:时间”(Partition by field: time)。

    分区表会将大表分成较小的片段,以便通过减少查询读取的数据量来提高查询性能并控制费用。如需了解详情,请参阅 BigQuery 文档中的分区表简介

  13. 点击底部的创建表

    名为 fluentd.nginx_access 的 BigQuery 表现在可以用来接收日志记录。

  14. 如需查看表的详细信息,请在资源 > 详细信息下点击表名称。

    通过查看详细信息,您可以了解表中有多少行、使用了多少存储空间,等等。

设置日志收集并将日志转发到 BigQuery

Fluentd 配置文件 /etc/td-agent/td-agent.conf 定义了系统收集日志数据的来源、收集到的日志的输出结果以及所有过滤器。通过该配置文件,您还可以将标记应用于收集到的日志,以定义如何处理日志以及应该将日志发送到哪个输出插件。

在以下步骤中,您可以配置 Fluentd 以执行以下操作:

如需设置日志收集和转发,请执行以下操作:

  1. 使用 SSH 连接到安装了 NGINX 的虚拟机。
  2. 在 Shell 窗口中,以根用户身份打开文本编辑器(例如,打开 Vim 或 Nano),然后修改 Fluentd 代理配置文件 /etc/td-agent/td-agent.conf。例如,您可以使用以下命令在 Vim 中打开该文件:

    sudo vim /etc/td-agent/td-agent.conf
    
  3. 在文件的底部,附加以下行,将 tail input 插件配置为读取 NGINX 日志,再使用 NGINX 解析器解析日志,然后使用 nginx.access 标记日志:

    <source>
      @type tail
      @id input_tail
      <parse>
        @type nginx
      </parse>
      path /var/log/nginx/access.log
      pos_file /var/log/td-agent/httpd-access.log.pos
      tag nginx.access
    </source>
    
  4. 附加以下行以配置 BigQuery 输出插件。请将 [MY_PROJECT_NAME] 替换为您的 GCP 项目的名称。

    <match nginx.access>
      @type bigquery_insert
    
      # Authenticate with BigQuery using the VM's service account.
      auth_method compute_engine
      project [MY_PROJECT_NAME]
      dataset fluentd
      table nginx_access
      fetch_schema true
    
      <inject>
        # Convert fluentd timestamp into TIMESTAMP string
        time_key time
        time_type string
        time_format %Y-%m-%dT%H:%M:%S.%NZ
      </inject>
    </match>
    

    这会将 Fluentd 配置为执行以下操作:

    • 对于带有 nginx.access 标记的每个日志条目,Fluentd 应使用 bigquery_insert 插件将记录写入到 BigQuery 表中。
    • Fluentd 会使用虚拟机的服务帐号执行身份验证。
    • 原始时间戳会以字符串的形式添加到记录中,该字符串已通过 BigQuery 能够将其转换为时间戳的方式设置了格式。
  5. 保存文件并退出编辑器。

  6. 重启 Fluentd 代理以应用新的配置。

    sudo systemctl restart td-agent
    

如需详细了解这些配置文件参数(包括身份验证的替代方法),请参阅 BigQuery Fluentd 插件网站Fluentd 插件文档

在 BigQuery 中查看日志

现在,您已经配置了 Fluentd,接下来就可以生成一些 NGINX 日志数据并使用 BigQuery 查看这些日志数据。

  1. 在 GCP Console 中,转到 Compute Engine“虚拟机实例”页面:

    转到“虚拟机实例”页面

  2. 复制 nginx-vm 虚拟机实例的外部 IP 地址。

  3. 在单独的浏览器标签页中,将 IP 地址粘贴到地址框中。

    您会看到默认的“欢迎使用 nginx!”(Welcome to nginx!) 页面。

  4. 在 GCP Console 中,转到 BigQuery 页面

  5. 将以下查询复制到查询编辑器窗格中,然后点击运行

    SELECT * FROM `fluentd.nginx_access`
    

    您会在查询结果面板中看到一行,其中显示了来自您的浏览器的访问日志记录。由于可以从互联网访问您的虚拟机,因此您可能还会看到来自其他远程主机的访问日志行。

模拟负载并根据日志计算统计信息

在本部分中,您将运行示例负载,然后使用 BigQuery 查看这些负载的指标。通过执行以下步骤,您将看到,BigQuery 不仅可以用来读取日志,而且还可以用来对日志进行分析。

  1. 在 GCP Console 中,启动 Cloud Shell。
  2. 安装 ApacheBench (ab) Web 服务器基准化分析工具和相关的工具:

     sudo apt install -y apache2-utils
    
  3. 在 Cloud Shell 中,生成一个针对 NGINX 服务器运行的测试负载。请将 [IP_ADDRESS] 替换为您的虚拟机的 IP 地址。

    ab -t 20 -c 1 http://[IP_ADDRESS]/
    

    此命令使用 ApacheBench 工具针对 NGINX 服务器生成 20 秒的负载。

  4. 在 GCP Console 中,转到 BigQuery 页面:

    转到 BigQuery 页面

  5. 查询编辑器窗格中使用以下查询获取 ApacheBench 请求列表:

    SELECT * FROM `fluentd.nginx_access` limit 100
    
  6. 运行以下 SQL 命令以计算每个响应代码每秒钟的请求次数:

    SELECT
      time_sec, code, COUNT(*) as count
    FROM (
      SELECT
        TIMESTAMP_TRUNC(time, SECOND)AS time_sec, code
      FROM
        `fluentd.nginx_access`)
    GROUP BY
      time_sec, code
    ORDER BY
      time_sec DESC
    

    每秒钟的数值应大约等于您之前看到的 ApacheBench 输出结果中每秒请求次数这一行的数值。

可选:使用批量加载功能记录大量日志

如前所述,BigQuery 流式插入(如本教程中所使用的那样)使数据能够在几秒钟内用于查询操作。使用此方法需要支付少量费用,并且系统对插入的大小和频率有所限制

对于较大的日志记录量,您可能需要使用 BigQuery 批量加载功能。顾名思义,此功能会使用优先级较低的批处理作业加载数据。与流式插入相比,批量加载功能加载和提供数据的时间比较长。不过,批量加载是免费的。

与流式插入一样,系统对批量加载作业的频率也有限制;最重要的限制是,每个表每天只允许 1000 个加载作业,每个项目每天只允许 50000 个加载作业。

如需实现批量加载,请使用 bigquery_load Fluentd 插件。此插件使用 Fluentd 缓冲区收集文件中的一组日志,直至达到指定的时间或大小限制,然后再以批量方式将日志发送到 BigQuery。

如需使用批量加载功能,请执行以下操作:

  1. 以根用户身份修改 Fluentd 配置文件 /etc/td-agent/td-agent.conf
  2. 将之前指定的 BigQuery 输出插件配置替换为以下代码。将 [MY_PROJECT_NAME] 替换为您的 GCP 项目的名称。

    <match nginx.access>
      @type bigquery_load
    
      <buffer>
        @type file
        path /var/log/bigquery_nginx_access.*.buffer
        flush_at_shutdown true
        timekey_use_utc
        total_limit_size 1g
        flush_interval 3600
      </buffer>
    
      # Authenticate with BigQuery using the VM's service account.
      auth_method compute_engine
      project [MY_PROJECT_NAME]
      dataset fluentd
      table nginx_access
      fetch_schema true
    
      <inject>
        # Convert fluentd timestamp into TIMESTAMP string
        time_key time
        time_type string
        time_format %Y-%m-%dT%H:%M:%S.%NZ
      </inject>
    </match>
    

    此配置指定应使用 bigquery_load 输出插件(而不是 bigquery_insert 插件)。

    buffer 部分指定日志数据在虚拟机中缓冲,直至收集到 1 GB 的日志或者达到一小时的时间限制。随后,缓冲的数据会加载到 BigQuery 中。如需详细了解配置参数,请参阅插件文档

问题排查

在任何时候,如果您怀疑代理没有收集或传递日志,可以通过在 Fluentd 虚拟机的 Shell 窗口中运行以下命令来检查其状态:

sudo systemctl status td-agent

输出结果会显示服务的活跃状态,以及来自服务的最后几行日志:

Active: active (running) since [DATE]

如果代理未启动,最可能的原因是 Fluentd 配置文件中存在错误。Fluentd 日志文件会报告这一情况,您可以在虚拟机的 Shell 窗口中使用以下命令查看该文件:

sudo less /var/log/td-agent/td-agent.log

例如,当插件名称不正确时,以下输出结果会显示错误:

[info]: parsing config file is succeeded path="/etc/td-agent/td-agent.conf"
[error]: config error file="/etc/td-agent/td-agent.conf" error_class=Fluent::ConfigError error="Unknown output plugin 'bad_plugin'. Run 'gem search -rd fluent-plugin' to find plugins"

清理

为避免因本教程中使用的资源导致您的 Google Cloud Platform 帐号产生费用,请执行以下操作:

  1. 在 GCP Console 中,转到项目页面。

    转到“项目”页面

  2. 在项目列表中,选择您要删除的项目,然后点击删除 delete
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
解决方案