Fluent Bit 是一个开源的日志处理器和转发器,用于从各种数据源收集日志和指标,支持自定义输出插件将数据写入存储系统。本文将介绍如何通过 Fluent Bit 将数据写入 ByteHouse,适用于需要将系统日志、应用日志汇总到 ByteHouse 进行分析的场景。
本文主要介绍如何通过 Fluent Bit 将日志数据写入 ByteHouse,演示了基本的操作流程。您可以基于该演示,根据您的实际需求写入数据以及调优参数。
数据写入流程与本示例的数据和相关文件脚本的说明如下。
数据写入流程 | 本示例中涉及的文件/脚本说明 | 注意事项 | |
|---|---|---|---|
1 | 准备日志数据写入 ByteHouse 的目标库表 | 不涉及,本示例创建的库表为 | 建议将各脚本、配置文件放置在同一目录下,方便后续操作。 |
2 | 准备 Fluent Bit 环境 | 不涉及,为了减少环境因素影响并简化安装过程,本文将使用 Docker 来进行演示。 | |
3 | 准备 Fluent Bit 中待写入的日志数据 | 本示例准备了一个日志文件: | |
4 | 解析 Fluent Bit 中的日志数据并写入 ByteHouse |
| |
5 | 查看写入 ByteHouse 中的结果 | 不涉及,执行数据写入 ByteHouse 命令后,可在 ByteHouse 中查询并验证写入的结果数据。 | |
使用以下 SQL 在 ByteHouse 中创建测试数据库、表。假设我们要将日志输入写入 demo_db.demo_table 表,该表中的三个字段分别对应步骤二中创建的日志文件中 JSON 数据行中的三个字段。
# 创建数据库 CREATE DATABASE IF NOT EXISTS demo_db # 创建表 CREATE TABLE demo_db.demo_table ( `id` Int32 NULL, `level` String NULL, `content` String NULL ) ENGINE = CnchMergeTree ORDER BY id UNIQUE KEY id;
docker pull cr.fluentbit.io/fluent/fluent-bit
准备了一个演示用日志文件 demo.log,该日志文件中的内容大致如下:
.. {"id": 995, "level": "info", "content": "hYb7yQT3qrIiMo7cd"} {"id": 996, "level": "debug", "content": "Ln"} ...
准备日志内容追加 Python 脚本 gen.py,用于向该日志文件追加写入内容。
创建 Python 脚本 gen.py。
import json import time import random import string import sys # 文件名 filename = 'demo.log' def generate_random_content(max_length=20): """生成随机内容,长度小于 max_length""" length = random.randint(1, max_length) return ''.join(random.choices(string.ascii_letters + string.digits + ' ', k=length)) # 初始 id current_id = 1 max_id = 1000 try: with open(filename, 'a', buffering=1) as file: while True: # 随机选择 level level = random.choice(['info', 'debug']) # 生成随机 content content = generate_random_content() # 定义要写入的 JSON 数据 log_entry = { "id": current_id, "level": level, "content": content } # 将字典转换为 JSON 字符串 json_line = json.dumps(log_entry) # 写入文件并换行 file.write(json_line + '\n') # 输出日志到控制台(可选) print(f'Written to file: {json_line}') # 增加 id current_id += 1 if current_id >= max_id: sys.exit(0) # 等待 5 秒 time.sleep(5) except KeyboardInterrupt: print("Logging stopped.")
参数说明
参数 | 配置说明 |
|---|---|
filename | 自定义生成的日志文件名称。 |
generate_random_content(max_length=value) | 设置 max_length 的值,用于限制随机生成的日志内容的最大长度。 |
current_id | 日志条目起始 ID,推荐设置为 1。 |
max_id | 最大日志 ID 限制,当日志 ID 达到此值时,脚本会自动退出。 |
level | 推荐使用示例值。
|
content | 推荐使用示例值。该参数表示日志的具体内容,通过 |
log_entry | 根据您的日志内容定义需写入的 JSON 数据。 |
json_line | 推荐使用示例值。该参数表示 JSON 格式的日志字符串,通过 |
file.write | 推荐使用示例值。该参数定义了向文件写入内容的操作。 |
print() | 可选配置,推荐使用示例值。 |
time.sleep(n) | 日志生成的时间间隔,单位为秒。推荐值: 5 秒。 |
执行以下命令启动脚本,启动后,脚本将每隔 5s 向 demo.log 文件中写入一行 JSON 行。
需确保该脚本一直处于运行状态,确保其持续生成日志内容。
python3 gen.py
注意
开始操作前,请再次确认 fluent-bit.conf、parsers.conf、demo.log 三个文件放置在同一目录下,并进入该目录执行命令。
准备自定义 parser 配置文件 parsers.conf,用于解析日志文件中的字段,将日志文件中的 JSON 字段解析为结构化数据。
[PARSER] Name json_log Format json
准备 Fluent Bit 配置文件 fluent-bit.conf,配置 Fluent Bit 的输入和输出。
使用时,请使用实际的参数值替换命令中的占位符,配置说明请参见下文参数说明表格。
[SERVICE] Flush 20 Log_Level debug Parsers_File /fluent-bit/etc/parsers.conf [INPUT] Name tail Path /fluent-bit/demo.log Refresh_Interval 60 Tag my_logs DB /var/log/flb_kv.db Mem_Buf_Limit 5MB Skip_Long_Lines Off Parser json_log [OUTPUT] Name http tls on Match * Host <bytehouse-host> Port 8123 URI /?user=bytehouse&password=<apitoken>&query=INSERT+INTO+<db.table>+FORMAT+JSONEachRow&input_format_skip_unknown_fields=1 Format json_stream Retry_Limit 5
参数说明
参数 | 配置说明 |
|---|---|
SERVICE | |
Flush | 设置数据刷新间隔(单位:秒),Fluent Bit 会按照此间隔将缓存的数据发送到输出目标。 |
Log_Level | 配置 Fluent Bit 的日志级别,可选值包括 debug、info、warn、error 等。推荐使用示例中设置的 debug,会输出详细调试信息,便于问题排查。 |
Parsers_File | 这里指定了一个 parser 配置文件,实际将要使用的就是上述步骤中准备的 |
INPUT | |
Name | 指定输入插件类型,推荐使用示例中设置的 tail 插件,用于监控文件并读取新增内容。 |
Path | 指定要监控的日志文件路径。参数值配置示例: |
Refresh_Interval | 设置检查文件变化的时间间隔(单位:秒)。示例中设置为 60 秒,即每隔 60 秒检查一次文件是否有新增或变化。 |
Tag | 为收集的日志添加标签,用于后续输出时的过滤或匹配。示例中设置为 |
DB | 指定存储文件位置和偏移量的数据库文件路径,用于记录已读取的位置,避免重复读取日志。参数值配置示例: |
Mem_Buf_Limit | 设置内存缓冲区的上限。示例中设置为 5MB,当缓存数据超过此限制时会触发处理机制。 |
Skip_Long_Lines | 配置是否跳过过长的日志行。设置为 |
Parser | 指定用于解析日志内容的解析器名称,需与 |
OUTPUT | |
Name | 指定输出插件类型,示例中使用 http 插件,用于通过 HTTP 协议将数据发送到目标服务。 |
tls | 配置是否启用 TLS 加密传输。设置为 |
Match | 设置日志匹配规则,用于筛选需要发送的日志。示例中设置为 |
Host | 指定输出目标的主机地址,此处为 ByteHouse 的访问域名。获取方式如下: |
Port | 指定输出目标的端口号,固定配置为 8123。 |
URI | 包含认证信息和数据插入命令的 URL 参数。其中:
|
Format | 设置输出数据的格式。示例中设置为 |
进入配置文件所在的工作路径,执行如下命令,启动 Fluent Bit,访问日志文件,将日志数据解析后写入ByteHouse库表中。
注意
执行命令时,需要保证此时 Python 脚本gen.py 也在运行,它将持续生成日志内容。
docker run -ti -v ./fluent-bit.conf:/fluent-bit/etc/fluent-bit.conf \ -v ./parsers.conf:/fluent-bit/etc/parsers.conf \ -v ./demo.log:/fluent-bit/demo.log \ cr.fluentbit.io/fluent/fluent-bit
参数说明
参数项 | 说明 |
|---|---|
-v ./fluent-bit.conf:/fluent-bit/etc/fluent-bit.conf | 挂载 Fluent Bit 主配置文件:将当前目录下的 |
-v ./parsers.conf:/fluent-bit/etc/parsers.conf | 挂载日志解析器配置文件:将当前目录下的 |
-v ./demo.log:/fluent-bit/demo.log | 挂载日志文件:将当前目录下的 |
cr.fluentbit.io/fluent/fluent-bit | 指定使用的 Docker 镜像:这是 Fluent Bit 官方提供的镜像,确保容器运行的是标准的 Fluent Bit 服务。 |
观察屏幕日志是否有报错,如果无报错,则表示成功写入增量的日志数据。
写入成功后,可在 ByteHouse 中执行以下命令,查看具体的数据。
SELECT count() FROM demo_db.demo_table; SELECT * FROM demo_db.demo_table LIMIT 10;