DoubleCloud 即将结束服务。现在迁移到 ClickHouse,享受限时免费迁移服务。立即联系我们 ->->

博客 / 工程

使用 Fluent Bit 将 Nginx 日志发送到 ClickHouse

author avatar
Calyptia
2022 年 10 月 21 日

calypia-blog.png

此博客文章是系列的一部分

简介

ClickHouse 已经成为接收日志的流行后端,例如 Uber 将这款速度极快的数据库纳入其基础设施后。所有数据存储都面临一个共同的挑战,即如何从各种来源提取数据。幸运的是,云原生计算基金会 (CNCF) 项目 Fluent Bit 已经为许多后端(例如 Amazon)解决了这个问题。Fluent Bit 是一个超快、轻量级且高度可扩展的日志和指标处理器和转发器。

在本博客中,我们将介绍如何在 5 分钟内设置 Fluent Bit 将日志路由到 Clickhouse。在我们的下一篇文章中,我们将展示收集和丰富来自 Kubernetes 的日志的日常可观察性用例。

环境

  • 同时运行 Clickhouse 和 Calypita Fluent Bit(由创建者提供的 Fluent Bit 的 LTS 版本)的 Ubuntu 20.04 LTS
  • Fluent Bit v1.9.9

对于 ClickHouse,我们建议尝试使用我们的无服务器 ClickHouse Cloud,它提供慷慨的免费试用,足以满足本博客文章的要求。或者,所有说明都应与大于 22.6 的自管理版本兼容。

创建 ClickHouse 数据库和表

我们的第一步是在 ClickHouse 中创建一个数据库,我们将在此存储日志。我们可以通过 clickhouse-client 或通过您的 ClickHouse Cloud 控制台运行以下命令

CREATE DATABASE fluentbit

请注意,JSON 类型 目前在 ClickHouse 核心数据库中处于实验阶段,并且默认情况下在 ClickHouse Cloud 中未启用。如果用户希望在 ClickHouse Cloud 中使用此功能,他们可以在启动服务后打开支持案例。

创建数据库后,我们需要通过实验性标志 allow_experimental_object_type 启用 JSON 对象类型

SET allow_experimental_object_type = 1

设置完毕后,我们可以使用提供的结构创建表。这将创建一个包含所有 JSON 对象的字段 log

CREATE TABLE fluentbit.jsonlogs ( timestamp DateTime, log JSON ) Engine = MergeTree ORDER BY tuple()

创建完毕后,我们可以配置 Fluent Bit 发送数据。

在 Ubuntu 上配置 Fluent Bit

以下说明使用 Fluent Bit 的开源版本。如果您有兴趣使用具有更多高级功能的 LTS 版本,请在此处找到有关 Calyptia 产品的更多信息 here.

为了举例说明,我们发送基本的 Nginx 访问日志,并假设用户使用 Ubuntu 系统。对于其他系统,说明请参考 here

curl https://raw.githubusercontent.com/fluent/fluent-bit/master/install.sh | sh

这将安装 Fluent Bit 到 /opt/fluent-bit。如果您需要一些测试 Nginx 访问日志,您可以从 here 下载一系列模拟访问日志,并将它们放置在 /var/log/access.log 下。

sudo wget -O /var/log/access.log https://gist.githubusercontent.com/agup006/b936d299c11b60283bdaf05a12e334eb/raw/b87905c7ea1e21745dba87233666135ee61d0087/apache-access.log
sudo chmod a+r /var/log/access.log

作为对 Fluent Bit 配置的概述,我们指定了一组 输入过滤器输出。在输入端,我们将指定 tail 插件,该插件将读取访问日志并使用众所周知的格式进行解析。

解析这些日志后,我们将使用 Fluent Bit 嵌套过滤器 将所有字段嵌套在字段“log”下,使 ClickHouse 能够识别包含 JSON 对象 的字段。

最后但并非最不重要的是,我们将使用 Fluent Bit 的 HTTP 输出 插件将这些日志路由到 ClickHouse,并使用一些参数。从 URI 中可以看出,我们使用了之前创建的数据库和表。

Fluent Bit 配置

注意:我们还需要指定默认用户的密码,以便 Fluent Bit 使用 HTTP 基本身份验证。对于 ClickHouse Cloud,我们指定端口 8443,并通过 tls on 参数启用 SSL。使用自管理 ClickHouse 的用户可能需要使用端口 8143(如果您的集群不安全)。您还需要显式设置 http 的使用情况,即 tls off 参数。

将以下配置文件追加到 /etc/fluent-bit/fluent-bit.conf

[INPUT] name tail path /var/log/access.log read_from_head true parser nginx_access [FILTER] Name nest Match * Operation nest Wildcard * Nest_under log [OUTPUT] name http tls on match * host port 8443 URI /?query=INSERT+INTO+fluentbit.jsonlogs+FORMAT+JSONEachRow format json_stream json_date_key timestamp json_date_format epoch http_user default http_passwd

如果使用 ClickHouse Cloud,您的凭据将在创建集群时提供,即

connect_cloud.png

使用以下命令运行 Fluent Bit,并将日志发送到 ClickHouse

/opt/fluent-bit/bin/fluent-bit -c /etc/fluent-bit/fluent-bit.conf

在 ClickHouse 中搜索日志

在 ClickHouse 中,我们可以运行以下命令来查看日志的实际情况。如果没有 FORMAT 选项,我们只会看到 JSON 的值。

SET output_format_json_named_tuples_as_objects = 1 SELECT * FROM fluentbit.jsonlogs FORMAT JSONEachRow

logs.png

现在将这些日志存储在 ClickHouse 中的一个优势是,我们可以运行临时查询进行分析,而无需指定任何模式。使用 DESCRIBE 命令(设置 describe_extend_object_types),我们可以发现 jsonlogs 表中可用的字段。

DESCRIBE TABLE fluentbit.jsonlogs FORMAT Vertical SETTINGS describe_extend_object_types = 1 Row 1: ────── name: timestamp type: DateTime default_type: default_expression: comment: codec_expression: ttl_expression: Row 2: ────── name: log type: Tuple(agent String, code String, host String, method String, path String, referer String, remote String, size String, user String) default_type: default_expression: comment: codec_expression: ttl_expression: 2 rows in set. Elapsed: 0.001 sec.

我们可以运行以下命令来了解返回了多少个错误代码 - 请注意我们如何通过其点分隔的 json 路径访问代码字段。

SELECT count(log.code) AS count, log.code AS code FROM fluentbit.jsonlogs GROUP BY log.code ┌─count─┬─code─┐ │ 26 │ 301 │ │ 9 │ 500 │ │ 397 │ 200 │ │ 17 │ 404 │ └───────┴──────┘ 4 rows in set. Elapsed: 0.003 sec.

对于有兴趣可视化这些日志的用户,我们建议使用 Grafana 和官方支持的 ClickHouse 插件。有关更多详细信息,请参考 here,其中包含在本博客文章结尾处可视化 JSON 日志的示例 earlier post。下面我们在 Grafana 的日志视图中显示了上述数据。

grafana-logs.png

注意:确保您的 Grafana 实例可以访问您的 ClickHouse Cloud 服务,并具有适当的 IP 访问列表规则。

总结

在本博客文章中,我们使用 Fluent Bit 和 JSON 类型将 Nginx 日志加载到 ClickHouse 中。在本系列的下一篇文章中,我们将探讨收集 Kubernetes 日志的常见可观察性用例。

如果您对最新技术充满热情,并且对开源充满热情,我们目前正在招聘 集成团队 的成员,期待您的加入。

分享此文章

订阅我们的时事通讯

及时了解功能发布、产品路线图、支持和云服务!
加载表单...
关注我们
Twitter imageSlack imageGitHub image
Telegram imageMeetup imageRss image