sqllog2db
解析达梦数据库 SQL 日志并导出为 CSV 或 SQLite。
一款流式命令行工具,以恒定内存占用处理达梦 SQL 日志文件,从零依赖的静态二进制文件提供约 520 万条记录/秒的 CSV 吞吐量。无需外部运行时、无需数据库客户端、无需 JVM——只是一个约 5 MB 的二进制文件,可在 Rust 编译的任何平台上运行。
适用场景:日志归档、审计追踪提取、分析预处理、DBA 工作负载画像。该工具处理达梦特有的日志编码(GB18030/GBK),从每条 SQL 记录中解析结构化字段,并通过可选的处理管道将其路由后写入配置的导出器。
功能特性
解析与导出
- 流式解析器:单线程顺序处理单个文件、目录中的
.log文件或 glob 模式匹配的文件。无论文件大小,内存保持恒定——工具流式处理记录而非加载到内存中。 - 灵活的输入模式:支持单文件路径、目录自动扫描(递归查找
.log文件)或 glob 模式(如./logs/2025-*.log)。结果按路径排序以在多次运行间保持确定性顺序。 - CSV 导出器:16 MB
BufWriter配合itoa零分配整数格式化,实现高吞吐、低延迟输出。memchr的 SIMD 加速字节搜索处理 CSV 转义。多文件场景支持 rayon 并行解析路径(parallel.rs)。 - SQLite 导出器:批量事务配合性能
PRAGMA调优(synchronous off、mmap size、cache size)和预编译语句实现批量插入吞吐量。多文件场景支持 rayon 并行解析路径(sqlite_parallel.rs)。 - 优先级路由的 ExporterManager:每次运行只有一个导出器处于活动状态;两者同时配置时 CSV 优先。
Exportertrait 允许基准测试在不修改生产代码的情况下注入模拟导出器。
过滤与字段控制
- 记录级包含过滤器(AND 语义):每条记录必须匹配每个配置的字段才能通过。支持用户名、IP、会话、线程、语句类型(INS/UPD/DEL/SEL)、应用名称、标签以及通过
start_ts/end_ts设定的时间戳范围。 - 记录级排除过滤器(OR 否决):任意单次匹配立即丢弃记录,不继续评估剩余的排除字段。字段集与包含过滤器相同。包含和排除叠加:包含缩小候选集,排除剔除例外项。
- 事务级指标过滤器:匹配
exec_id、最小执行时长(min_runtime_ms)或最小行数(min_row_count)。当事务中某条语句匹配时,整个事务被保留。需要两遍预扫描以检测事务边界。 - 事务级 SQL 内容过滤器:应用于 SQL 文本内容的字符串模式(
includes和excludes)。两遍设计:预扫描收集匹配的事务 ID,主遍将事务集过滤器与记录级过滤器一起应用。 - 字段投影:
ordered_indices: Vec<usize>允许你从记录模式中选择精确的列顺序和子集。从配置通过管道传递到导出器——未在列表中显式声明的字段不会被写入。
配置与性能
- 嵌套子表的 TOML 配置:v1.4+ 格式将
[filter.include]、[filter.exclude]作为顶级节(而非嵌套在[features]下)。旧的扁平格式通过RawFiltersFeature中间结构和 serde 别名支持向后兼容。validate()验证最终形式并拒绝旧版布局。 - 零开销快速路径:当管道为空(无过滤器、无 replace_parameters)时,热循环通过单个
pipeline.is_empty()检查跳过所有功能门控。快速路径中无虚函数调用、无逐记录的条件分支。 - 预编译的过滤器处理管道:
CompiledMetaFilters和CompiledSqlFilters在启动时持有编译好的RegexSet实例。每个过滤器变体带有类型标签(include、exclude、indicator、SQL include、SQL exclude),无需字符串匹配即可派发。 - 单线程流式处理:无论数据量大小,性能可预测。使用标准库全局分配器。Release 配置:
opt-level=3、LTO fat、codegen-units=1、panic=abort、strip=symbols——生成约 5 MB 的二进制文件。 - 基准测试结果:~520 万条记录/秒 CSV(criterion,合成 50k 记录数据集,Apple M 系列芯片),~110 万条记录/秒 SQLite(batch + PRAGMA),~155 万条记录/秒(真实 1.1 GB 文件,约 300 万条记录,NVMe SSD)。
- 简洁的 CLI:
init(生成配置)、validate(校验)、run(执行导出)、stats(统计分析)、watch(持续监听)五个命令。 - 持续监听:
watch子命令监听配置目录下的新.log文件,500ms 防抖后自动触发增量处理,Ctrl+C 退出并打印本次运行摘要(处理次数、总行数、运行时长)。
架构
数据通过四个阶段流经工具:
- 发现:
SqllogParser解析配置的路径(文件、目录或 glob)并生成有序的.log文件列表。 - 解析:每个文件通过
dm-database-parser-sqllog逐行流式读取,解码 GB18030/GBK 记录并提取结构化字段(用户、SQL 文本、执行时长、行数、会话 ID 等)。 - 处理管道:解析后的记录通过可选的处理管道。当管道为空(无过滤器)时,记录通过零开销快速路径绕过所有功能逻辑。当管道活跃时,运行编译好的正则过滤器。
- 导出:活跃的导出器(CSV 或 SQLite,按优先级选择)写入每条记录。ExporterManager 将记录路由到单一配置的导出器。
这种流式设计保持内存使用恒定——100 MB 日志文件和 100 GB 日志文件消耗相同的峰值内存。
graph LR
A[SQL Log Files] --> B[SqllogParser]
B --> C{Pipeline}
C -->|empty| D[ExporterManager]
C -->|filters| E[FilterProcessor]
E --> D
D --> F[CSV / SQLite]
同样的流程以文本形式表达:
输入 .log 文件 --> SqllogParser --> 处理管道 --> ExporterManager --> CSV / SQLite
关键模块
cli/run/mod.rs:主编排——加载配置、构建管道、预扫描事务过滤器、逐个文件流式处理记录。cli/run/parallel.rs:CSV 导出的多文件并行解析路径(基于 rayon),解析错误通过log::warn!上报。cli/run/sqlite_parallel.rs:SQLite 导出的多文件并行解析路径(基于 rayon),解析错误通过log::warn!上报。cli/stats/mod.rs:stats子命令入口,委托给src/stats/完成聚合与写出。stats/mod.rs:run_stats流式扫描 →StatsAccumulator→ 写入slow_sql.csv/frequent_sql.csv(或 SQLite 表)。exporter/mod.rs:Exportertrait 和ExporterManager工厂。每次运行只有一个导出器处于活动状态。pipeline/mod.rs:LogProcessortrait 和Pipeline。pipeline.is_empty()启用零开销快速路径。pipeline/filters/mod.rs:两遍过滤器设计。预扫描使用CompiledMetaFilters和CompiledSqlFilters查找匹配的事务 ID。config/mod.rs:所有配置结构体,支持 serde 反序列化、嵌套子表支持和validate()校验。
安装
从 crates.io 安装(推荐)
需要 Rust 1.85+。Release 二进制文件约 5 MB(LTO fat、stripped、panic=abort、codegen-units=1)。
本地构建
验证安装的二进制文件
快速入门
生成默认配置,验证后运行导出:
统计分析慢 SQL 和高频 SQL(输出到 slow_sql.csv / frequent_sql.csv):
指定时间范围统计(v1.14+,仅聚合 ts 字段落入 --from 与 --to 区间的记录):
持续监听新 .log 文件(按 Ctrl+C 停止并打印摘要):
交互式向导生成配置文件(每步显示示例值与默认值,回车接受默认值):
进度输出控制:-q/--quiet 抑制非错误输出(适合后台/定时任务),-v/--verbose 显示每文件详情:
详细用法参见快速入门指南。
配置
sqllog2db init 生成的默认配置使用嵌套 TOML 子表来设置过滤器选项(v1.4+ 格式):
[]
= ["sqllogs"]
[]
= false
[]
# users = ["SYSDBA"]
# statements = ["INS", "UPD"]
[]
= "outputs/sqllog.csv"
= true
完整配置参考请参见 docs/config-reference.md。
性能
基准测试结果
| 模式 | 吞吐量 | 备注 |
|---|---|---|
| CSV(合成数据) | ~520 万条/秒 | criterion,Apple M 系列芯片 |
| SQLite(合成数据) | ~110 万条/秒 | batch + PRAGMA |
| 真实文件(1.1 GB,NVMe) | ~155 万条/秒 | ~300 万条记录,生产日志 |
基准测试使用 cargo bench 在搭载 Apple Silicon 和 NVMe SSD 的 Mac 上测量。
错误处理
解析错误不是致命的。当日志行无法解析时,错误信息写入配置的错误日志文件(配置中的 [error] file),处理继续到下一条行。该工具使用结构化错误类型(通过 thiserror)为所有错误变体提供文件路径和原因上下文。
通过 Ctrl+C 优雅关闭会在当前批次完成后停止。退出码:0(成功)、1(处理完成但有非致命错误)、2(致命错误,包含配置/文件/解析/导出)、130(用户中断)。
版本亮点
v1.16.0 — watch 持续监听、SQL 统计分析与全面体验升级(2026-06-07)
watch子命令:持续监听目录,新增/追加.log文件时自动增量处理,支持 CSV/SQLite 双格式,Ctrl+C 退出码 130stats子命令:慢 SQL TOP-N + 高频 SQL TOP-N,支持--from/--to时间段过滤,SQL 字面量标准化归一init --interactive向导:对话式配置生成,每步提示默认值,Enter 直接接受- 进度条升级:
[N/M]文件计数器 + ETA + records/sec;错误诊断按类型分组 + hint - 多文件 CSV 并行:rayon 并行路径与单线程输出等价,自动激活
- 代码质量:10 个
mod.rs拆分为命名子模块;行覆盖率 92.06%;全代码库 unwrap 注释审计
链接
许可证
基于 Apache License, Version 2.0 许可。详见 LICENSE。