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
对于读取记录不是特别有用(调试除外),因为每个记录只能读取一次。使用物化视图创建实时线程更为实用。为此,请
- 使用引擎创建一个 FileLog 表,并将其视为数据流。
- 创建一个具有所需结构的表。
- 创建一个物化视图,将来自引擎的数据转换并放入先前创建的表中。
当 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
。