跳至主要内容

FileLog 引擎

此引擎允许将应用程序日志文件作为记录流进行处理。

FileLog 允许您

  • 订阅日志文件。
  • 在将新记录追加到已订阅的日志文件时处理这些新记录。

创建表

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = FileLog('path_to_logs', 'format_name') SETTINGS
[poll_timeout_ms = 0,]
[poll_max_batch_size = 0,]
[max_block_size = 0,]
[max_threads = 0,]
[poll_directory_watch_events_backoff_init = 500,]
[poll_directory_watch_events_backoff_max = 32000,]
[poll_directory_watch_events_backoff_factor = 2,]
[handle_error_mode = 'default']

引擎参数

  • path_to_logs – 要订阅的日志文件路径。它可以是包含日志文件的目录的路径,也可以是单个日志文件的路径。请注意,ClickHouse 仅允许 user_files 目录内的路径。
  • format_name - 记录格式。请注意,FileLog 将文件中的每一行都视为单独的记录,并非所有数据格式都适合它。

可选参数

  • poll_timeout_ms - 从日志文件轮询一次的超时时间。默认值:stream_poll_timeout_ms
  • poll_max_batch_size — 在一次轮询中轮询的最大记录数。默认值:max_block_size
  • max_block_size — 轮询的最大批次大小(以记录为单位)。默认值:max_insert_block_size
  • max_threads - 解析文件的最大线程数,默认为 0,这意味着该数字将为 max(1, physical_cpu_cores / 4)。
  • poll_directory_watch_events_backoff_init - 监视目录线程的初始休眠值。默认为 500
  • poll_directory_watch_events_backoff_max - 监视目录线程的最大休眠值。默认为 32000
  • poll_directory_watch_events_backoff_factor - 回退速度,默认为指数级。默认为 2
  • handle_error_mode — 如何处理 FileLog 引擎的错误。可能的值:default(如果我们无法解析消息,则会抛出异常),stream(异常消息和原始消息将保存在虚拟列 _error_raw_message 中)。

描述

传递的记录会自动跟踪,因此日志文件中的每个记录只会被计算一次。

SELECT 对读取记录(除了调试之外)并不是特别有用,因为每个记录只能读取一次。使用 物化视图 创建实时线程更实用。为此

  1. 使用该引擎创建 FileLog 表,并将其视为数据流。
  2. 创建具有所需结构的表。
  3. 创建一个物化视图,将数据从引擎转换并放入先前创建的表中。

MATERIALIZED VIEW 连接到引擎时,它会开始在后台收集数据。这允许您持续接收来自日志文件的记录,并使用 SELECT 将其转换为所需的格式。一个 FileLog 表可以拥有任意数量的物化视图,它们不会直接从表中读取数据,而是接收新记录(以块为单位),这样您就可以写入具有不同详细程度(带分组 - 聚合和不带分组)的多个表。

示例

  CREATE TABLE logs (
timestamp UInt64,
level String,
message String
) ENGINE = FileLog('user_files/my_app/app.log', 'JSONEachRow');

CREATE TABLE daily (
day Date,
level String,
total UInt64
) ENGINE = SummingMergeTree(day, (day, level), 8192);

CREATE MATERIALIZED VIEW consumer TO daily
AS SELECT toDate(toDateTime(timestamp)) AS day, level, count() as total
FROM queue GROUP BY day, level;

SELECT level, sum(total) FROM daily GROUP BY level;

要停止接收流数据或更改转换逻辑,请分离物化视图

  DETACH TABLE consumer;
ATTACH TABLE consumer;

如果要使用 ALTER 更改目标表,建议禁用物化视图以避免目标表与视图中的数据之间出现差异。

虚拟列

  • _filename - 日志文件的名称。数据类型:LowCardinality(String)
  • _offset - 日志文件中的偏移量。数据类型:UInt64

handle_error_mode='stream' 时的其他虚拟列

  • _raw_record - 无法成功解析的原始记录。数据类型:Nullable(String)
  • _error - 解析失败期间发生的异常消息。数据类型:Nullable(String)

注意:_raw_record_error 虚拟列仅在解析期间发生异常时填充,当消息成功解析时,它们始终为 NULL