本教程介绍如何实时记录和分析浏览器流量。当您拥有各种来源的大量日志记录,希望调试问题或从中生成最新统计信息时,这一方法会很有用。
本教程介绍如何使用 Fluentd 将 NGINX 网络服务器生成的日志信息发送到 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 的以下收费组件:
- Compute Engine
- BigQuery
请使用价格计算器根据您的预计使用情况来估算费用。
准备工作
-
登录您的 Google 帐号。
如果您还没有 Google 帐号,请注册新帐号。
-
在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。
-
确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能。
完成本教程后,您可以删除所创建的资源以避免继续计费。如需了解详情,请参阅清理。
创建 NGINX Web 服务器虚拟机
在本教程中,您将使用 Cloud Marketplace 创建一个预先配置为运行 NGINX Web 服务器的 Compute Engine 实例。
在 Cloud Console 中,转到虚拟机实例页面。
如果系统出现提示,请选择要使用的 Google Cloud 项目。
点击创建实例。
将虚拟机命名为
nginx
。选择位于美国地区或欧洲地区的区域。
在身份和 API 访问权限中,选择针对每个 API 设置访问权限。
将 BigQuery 访问权限设置为已启用。
在网络部分的防火墙下,确保选中允许 HTTP 流量选项。
选择创建。
等待部署完成,然后再继续安装 NGINX Web 服务器。
- 在虚拟机实例详细信息页面中,点击“SSH”按钮以建立与实例的连接。
使用 APT 安装 NGINX Web 服务器。
sudo apt-get update && sudo apt-get -y upgrade sudo apt-get install -y nginx
如需使 Fluentd 和 BigQuery 连接器安装下一部分,请保持 SSH 窗口处于打开状态。
安装 Fluentd 和 BigQuery 连接器
在本教程的这一部分中,您将在虚拟机上安装 Fluentd 日志收集器和 BigQuery 的 Fluentd 输出插件。
在虚拟机的 Shell 窗口中,验证 Debian 的版本:
lsb_release -rdc
结果会显示虚拟机上运行的 Debian 版本及其代号:
Description: Debian GNU/Linux 10 (buster) Release: 10 Codename: buster
转到 Debian 的 Fluentd 下载页面,然后找到 Debian 代号版本的安装命令行。
例如,对于 Debian Buster,您找到以下命令:
curl -L https://toolbelt.treasuredata.com/sh/install-debian-buster-td-agent4.sh | sh
将命令复制到虚拟机的 Shell 窗口中。
此命令会在虚拟机上安装 td-agent 软件包。该软件包内含 Fluentd 发行版。
将 Fluentd 代理的
td-agent
用户帐号添加到虚拟机的adm
群组中。sudo usermod -aG adm td-agent
安装 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 中创建日志目标表时,列名称必须与日志记录中的字段名称完全匹配。在以下步骤中,请务必使用建议的名称,以便随后的表列名称正确无误。
打开 BigQuery 网页界面:
在导航面板的资源下,点击您的项目名称。
在详细信息面板的查询编辑器下,点击创建数据集。
在数据集 ID 部分,输入
fluentd
。对于数据位置,选择创建了 NGINX 实例的多区域位置(美国或欧洲)。
点击创建数据集。
在导航面板的资源下,点击 fluentd 数据集。
在详细信息面板的查询编辑器下,点击创建表。
输入
nginx_access
作为表名称。选择以文本形式修改选项。
将以下 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
列值添加到记录中。在分区列表中,选择按字段分区:时间 (Partition by field: time)。
分区表会将大表分成较小的片段,以便通过减少查询读取的数据量来提高查询性能并控制费用。如需了解详情,请参阅 BigQuery 文档中的分区表简介。
点击底部的创建表。
名为
fluentd.nginx_access
的 BigQuery 表现已可用于接收日志记录。如需查看表的详细信息,请在资源 > 详细信息下点击表名称。
通过查看详细信息,您可以了解表中有多少行、使用了多少存储空间,等等。
设置日志收集并将日志转发到 BigQuery
Fluentd 配置文件 /etc/td-agent/td-agent.conf
定义了系统收集日志数据的来源、收集到的日志的输出结果以及所有过滤器。通过该配置文件,您还可以将标记应用于收集到的日志,以定义如何处理日志以及应该将日志发送到哪个输出插件。
在以下步骤中,您可以配置 Fluentd 以执行以下操作:
- 在系统生成 NGINX 日志时,使用 tail input 插件收集这些日志。
- 使用 NGINX 日志解析器解析日志行。
- 将日志发送到 BigQuery 输出插件,该插件会将日志插入到您创建的表中。
如需设置日志收集和转发,请执行以下操作:
- 使用 SSH 连接到安装了 NGINX 的虚拟机。
在 shell 窗口中,以根用户的身份打开文本编辑器(例如 Vim 或 Nano),并修改 Fluentd 代理配置文件
/etc/td-agent/td-agent.conf
。例如,您可以使用以下命令在 Vim 中打开该文件:sudo vim /etc/td-agent/td-agent.conf
在文件的底部,附加以下行,以将 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>
附加以下行以配置 BigQuery 输出插件。将
[MY_PROJECT_ID]
替换为您的 Google Cloud 项目的 ID。<match nginx.access> @type bigquery_insert # Authenticate with BigQuery using the VM's service account. auth_method compute_engine project [MY_PROJECT_ID] 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 能够将其转换为时间戳的方式设置了格式。
- 对于具有
保存文件并退出编辑器。
重启 Fluentd 代理以应用新的配置。
sudo systemctl restart td-agent
如需详细了解这些配置文件参数(包括身份验证的替代方法),请参阅 BigQuery Fluentd 插件网站和 Fluentd 插件文档。
在 BigQuery 中查看日志
现在,您已经配置了 Fluentd,接下来就可以生成一些 NGINX 日志数据并使用 BigQuery 查看这些日志数据。
在 Cloud Console 中,转到 Compute Engine“虚拟机实例”页面:
复制
nginx-vm
虚拟机实例的外部 IP 地址。在单独的浏览器标签页中,将 IP 地址粘贴到地址框中。
您会看到默认的欢迎使用 nginx!(Welcome to nginx!) 页面。
在 Cloud Console 中,转到 BigQuery 页面。
将以下查询复制到查询编辑器窗格中,然后点击运行:
SELECT * FROM `fluentd.nginx_access`
您会在查询结果面板中看到一行,其中显示了来自您的浏览器的访问日志记录。由于可以从互联网访问您的虚拟机,因此您可能还会看到来自其他远程主机的访问日志行。
模拟负载并根据日志计算统计信息
在本部分中,您将运行示例负载,然后使用 BigQuery 查看这些负载的指标。通过执行以下步骤,您将看到,BigQuery 不仅可以用来读取日志,而且还可以用来对日志进行分析。
- 在 Cloud Console 中,启动 Cloud Shell。
安装 ApacheBench (
ab
) Web 服务器基准化分析工具和相关的工具:sudo apt install -y apache2-utils
在 Cloud Shell 中,生成一个针对 NGINX 服务器运行的测试负载。请将
[IP_ADDRESS]
替换为您的虚拟机的 IP 地址。ab -t 20 -c 1 http://[IP_ADDRESS]/
此命令使用 ApacheBench 工具针对 NGINX 服务器生成 20 秒的负载。
在 Cloud Console 中,转到 BigQuery 页面:
在查询编辑器窗格中使用以下查询获取 ApacheBench 请求列表:
SELECT * FROM `fluentd.nginx_access` limit 100
运行以下 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。
如需使用批量加载功能,请执行以下操作:
- 以根用户身份修改 Fluentd 配置文件
/etc/td-agent/td-agent.conf
。 将之前指定的 BigQuery 输出插件配置替换为以下代码。将
[MY_PROJECT_NAME]
替换为您的 Google Cloud 项目的名称。<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 帐号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
- 在 Cloud Console 中,转到管理资源页面。
- 在项目列表中,选择要删除的项目,然后点击删除。
- 在对话框中输入项目 ID,然后点击关闭以删除项目。
后续步骤
- 了解如何使用 Cloud Logging(Google Kubernetes Engine 服务)进行托管式日志收集、存储和分析。
- 了解如何使用 Fluentd 为 Google Kubernetes Engine 自定义 Cloud Logging 日志。
- 了解如何在 Jupyter 笔记本中呈现 BigQuery 数据。
- 了解如何使用 Dataflow 大规模处理日志。
- 试用其他 Google Cloud 功能。查阅我们的教程。