将 Vector 与 ClickHouse 集成
能够实时分析日志对生产应用程序至关重要。你是否曾想过 ClickHouse 在存储和分析日志数据方面表现如何?只需查看一下 Uber 的经验,他们将日志基础设施从 ELK 转换为 ClickHouse。
本指南展示如何使用流行的数据流水线 Vector 来尾随 Nginx 日志文件并将其发送到 ClickHouse。以下步骤对尾随任何类型的日志文件都是类似的。我们将假设你已经安装并运行了 ClickHouse 和 Vector(不过暂时不需要启动它)。
1. 创建数据库和表
让我们定义一个表来存储日志事件:
- 我们将从一个名为
nginxdb
的新数据库开始:
- 首先,我们将整条日志事件作为一个字符串插入。显然,这对执行日志数据分析来说并不是一个很好的格式,但我们将在下面使用 物化视图 来解决这个问题。
目前并不需要一个主键,这就是为什么 ORDER BY 设置为 tuple()。
2. 配置 Nginx
我们确实不想花太多时间解释 Nginx,但也不想隐藏所有细节,所以在此步骤中,我们将提供足够的细节来配置 Nginx 日志记录。
- 以下
access_log
属性将日志发送到/var/log/nginx/my_access.log
,格式为 combined。该值放在nginx.conf
文件的http
部分:
-
如果你必须修改
nginx.conf
,请务必重启 Nginx。 -
通过访问你的网站服务器上的页面来生成一些访问日志。combined 格式的日志具有以下格式:
3. 配置 Vector
Vector 收集、转换并路由日志、指标和踪迹(统称为 源)到许多不同的供应商(称为 接收器),其中包括与 ClickHouse 的开箱即用兼容性。源和接收器在名为 vector.toml 的配置文件中定义。
- 以下 vector.toml 定义了一个类型为 file 的 源,它尾随 my_access.log 的末尾,并且它还定义了一个 接收器,即上面定义的 access_logs 表:
-
使用上述配置启动 Vector。有关定义源和接收器的更多详细信息,请 访问 Vector 文档。
-
验证访问日志是否已插入到 ClickHouse。运行以下查询,你应该能在表中看到访问日志:

4. 解析日志
将日志存储在 ClickHouse 中非常好,但将每个事件存储为单个字符串并不利于数据分析。让我们看看如何通过物化视图解析日志事件。
- 物化视图(缩写为 MV)是基于现有表的新表,当对现有表进行插入时,新数据也将添加到物化视图中。让我们看看如何定义一个包含 access_logs 中日志事件解析表示的 MV,换句话说:
ClickHouse 中有多种函数可以解析字符串,但首先我们先看看 splitByWhitespace – 它通过空格解析字符串并返回一个数组中的每个标记。为了演示,运行以下命令:
注意响应结果相当接近我们想要的结果!有些字符串包含一些多余的字符,用户代理(浏览器详细信息)不需要解析,但我们将在下一步解决这一点:
- 类似于 splitByWhitespace,splitByRegexp 函数根据正则表达式将字符串拆分为一个数组。运行以下命令,它返回两个字符串。
注意返回的第二个字符串是成功从日志解析的用户代理:
- 在查看最终的 CREATE MATERIALIZED VIEW 命令之前,让我们查看另外几个用于清理数据的函数。例如,
RequestMethod
看起来像 "GET 并且有一个不需要的双引号。运行以下 trim 函数,去除双引号:
- 时间字符串有一个前导方括号,并且不符合 ClickHouse 可解析为日期的格式。然而,如果我们将分隔符从冒号(:)更改为逗号(,),则解析效果很好:
- 我们现在准备定义我们的物化视图。我们的定义包括 POPULATE,这意味着 access_logs 中的现有行将被处理并立即插入。运行以下 SQL 语句:
- 现在验证它是否有效。你应该可以看到访问日志被整齐地解析为列:

上述课程将数据存储在两个表中,但你可以将初始的 nginxdb.access_logs
表更改为使用 Null 表引擎 - 解析后的数据仍将进入 nginxdb.access_logs_view
表,但原始数据将不会存储在表中。
总结: 通过使用 Vector,只需简单的安装和快速配置,我们可以将来自 Nginx 服务器的日志发送到 ClickHouse 中的表。通过使用巧妙的物化视图,我们可以将这些日志解析成列以便于分析。