Skip to main content
能够实时分析日志,对生产应用至关重要。 ClickHouse 凭借出色的压缩能力 (对于日志最高可达 170x) 以及对海量数据的快速聚合能力,非常适合存储和分析日志数据。 本指南将向你展示如何使用流行的数据管道 Vector,对 Nginx 日志文件进行 tail 并将其发送到 ClickHouse。 下面的步骤同样适用于 tail 任何类型的日志文件。 前置条件:
  • 你已成功运行 ClickHouse
  • 你已安装 Vector
1

创建数据库和表

定义一个用于存储日志事件的表:
  1. 先创建一个名为 nginxdb 的新数据库:
  1. 将整个日志事件作为单个字符串插入。显然,这并不是对日志数据进行分析的理想格式,但我们会在下文借助 materialized views 解决这个问题。
由于目前还不需要主键,因此将 ORDER BY 设置为 tuple() (空 Tuple) 。
2

配置 Nginx

在这一步中,您将了解如何配置 Nginx 日志。
  1. 以下 access_log 属性会以 combined 格式将日志写入 /var/log/nginx/my_access.log。 该值应放在 nginx.conf 文件的 http 部分中:
  1. 如果你修改了 nginx.conf,请务必重启 Nginx。
  2. 访问 Web 服务器上的页面,以在访问日志中生成一些日志事件。 combined 格式的日志如下所示:
3

配置 Vector

Vector 用于收集、转换并将日志、指标和链路追踪 (统称为 sources) 路由到许多不同的厂商平台 (称为 sinks) ,并且开箱即用地支持 ClickHouse。 sources 和 sinks 在名为 vector.toml 的配置文件中定义。
  1. 以下 vector.toml 文件定义了一个类型为 filesource,用于持续跟踪 my_access.log 文件末尾追加的内容;它还将上面定义的 access_logs 表定义为一个 sink
  1. 使用上述配置启动 Vector。有关如何定义 sources 和 sinks 的更多信息,请参阅 Vector 文档
  2. 运行以下查询,验证访问日志是否已插入 ClickHouse。你应该会在表中看到访问日志:
4

解析日志

将日志存储在 ClickHouse 中固然很好,但将每个事件存储为单一字符串并不利于深入的数据分析。 接下来,我们将介绍如何使用 materialized view 解析日志事件。materialized view 的功能类似于 SQL 中的插入触发器。当数据行插入源表时,materialized view 会对这些行进行转换,并将结果插入目标表。 可以配置 materialized view,以生成 access_logs 中日志事件的解析表示。 以下是此类日志事件的一个示例:
ClickHouse 中有多种函数可用于解析上述字符串。splitByWhitespace 函数按空白字符拆分字符串,并以数组形式返回每个标记。 如需演示,请运行以下命令:
Query
Response
部分字符串包含一些多余字符,User-Agent (浏览器详情) 也无需解析,但最终得到的数组已基本满足需求。splitByWhitespace 类似,splitByRegexp 函数根据正则表达式将字符串拆分为数组。 运行以下命令,该命令返回两个字符串。
请注意,返回的第二个字符串是从日志中成功解析出的 User-Agent:
在查看最终的 CREATE MATERIALIZED VIEW 命令之前,让我们先了解几个用于清理数据的函数。 例如,RequestMethod 的值为 "GET,其中包含一个多余的双引号。 您可以使用 trimBoth (别名 trim) 函数去除该双引号:
时间字符串以 [ 开头,且格式无法被 ClickHouse 解析为日期。 不过,如果将分隔符从冒号 (:) 改为逗号 (,) ,解析便可正常工作:
现在我们可以定义 materialized view 了。 以下定义包含 POPULATE,这意味着 access_logs 中的现有行将被立即处理并写入。 执行以下 SQL 语句:
现在验证操作是否成功。 您应该能看到访问日志已被整齐地解析成各列:
上面的课程将数据存储在两个表中,但你也可以把初始的 nginxdb.access_logs 表改为使用 Null 表引擎。 解析后的数据仍会进入 nginxdb.access_logs_view 表,但原始数据不会存储到任何表中。
使用 Vector 时,只需简单安装并快速配置,即可将 Nginx 服务器的日志发送到 ClickHouse 中的表。通过使用 materialized view,您可以将这些日志解析到多个列中,以便更轻松地进行分析。
最后修改于 2026年7月24日