面向开发、测试与运维场景的本地桌面日志分析工具,技术栈为 Rust + Tauri 2 + React 19 + TypeScript。它的目标不是把日志“收上云”,而是让你直接在本地导入目录或归档包,完成搜索、筛选、归类和问题定位。
以下界面截图来自当前仓库程序界面的实际运行画面,用来帮助你快速上手。
- 导入日志目录、单文件或压缩包,建立可持续使用的工作区
- 对大体量日志做本地搜索,支持
|表示 OR 多关键词匹配 - 按日志级别、时间范围、文件模式组合过滤结果
- 维护关键词组,把常见告警词和故障模式沉淀下来
- 对目录开启监听,持续观察新增日志并刷新工作区
- 在不依赖外部服务的情况下完成问题排查与结果导出
工作区页是日常入口。你可以在这里导入目录或文件、查看工作区状态、刷新索引、开启或停止监听。
搜索页支持多关键词搜索、时间范围过滤、日志级别过滤和文件模式过滤。结果区会直接展示命中文本和文件位置。
关键词组页用于沉淀常见故障模式,适合把团队内反复出现的关键告警词整理成可复用配置。
先准备好 Node.js、Rust 和 Tauri 所需系统依赖。
git clone https://github.com/ashllll/log-analyzer_rust.git
cd log-analyzer_rust/log-analyzer
npm install
npm run tauri dev环境要求:
| 工具 | 版本要求 |
|---|---|
| Node.js | >= 22.12.0 |
| npm | >= 10 |
| Rust | 1.88 (pinned in rust-toolchain.toml) |
| Tauri 前置依赖 | 见 Tauri 2 官方文档 |
启动后先进入 Workspaces 页面:
- 点击
Import Folder导入一个日志目录 - 或点击
Import File导入单个日志文件 / 归档文件 - 程序会为导入源创建工作区,并显示
READY、PROCESSING、WATCHING等状态
推荐做法:
- 日志目录长期增长时,优先导入目录并开启监听
- 临时排障包优先直接导入压缩文件
- 归档包支持递归解压,适合处理事故打包日志
导入后,点击目标工作区卡片进入该工作区上下文。顶部面包屑会显示当前工作区名称,状态区会显示当前是否可搜索、是否在监听。
常见状态含义:
READY:工作区可正常搜索PROCESSING:正在导入、解压或建立索引WATCHING:正在监听目录变化,适合持续追踪新日志
进入 Search Logs 页面后:
- 在搜索框输入关键词
- 多关键词之间使用
|,例如timeout|retry|circuit breaker - 按需要展开过滤条件
- 点击
Search - 在结果表格中查看命中级别、时间、文件和内容
搜索建议:
- 排障时优先先用 2 到 4 个高信号关键词缩小范围
- 时间范围能明显减少无效扫描
- 文件模式适合限定到
*.log、gateway/*、error*.txt这类目标文件
当前搜索页支持这些常用过滤:
Level:按E / W / I / D日志级别过滤Time Range:限制搜索时间区间File Pattern:按文件名或路径模式过滤,支持通配符
组合方式建议:
- 先输关键词,再加时间范围
- 结果仍然过多时,再加日志级别
- 已知问题集中在某类文件时,再补
File Pattern
进入 Keywords 页面后,可以把常见问题模式沉淀成关键词组,例如:
- 可靠性告警:
timeout、circuit breaker - 容量信号:
queue full、backpressure
这样团队在做重复问题排查时,不需要每次重新组织关键词。
关键词组支持启用/禁用切换——禁用后的组不会出现在搜索页的过滤器面板中,也不会参与日志高亮。适合保留历史关键词组但不希望每次搜索都命中的场景。
如果日志目录会持续写入,建议:
- 在工作区页开启监听
- 需要时点击
Refresh workspace - 回到搜索页重复使用同一套关键词与过滤条件
这套流程适合线上事故追踪、联调观察和批量回放分析。
当前 UI 主搜索链路基于 Clean Architecture,命令层委托给 WorkspaceService,由 SearchUseCase 编排:
SearchPage.tsx
→ api.searchLogs(query, filters)
→ commands/search/mod.rs: search_logs()
→ resolve_search_query()(query.rs — 解析 + 验证)
→ WorkspaceService::search()(trait:SearchService)
→ WorkspaceServiceImpl 内部创建 CancellationToken
→ SearchUseCase::execute()(spawn_blocking on Rayon pool)
→ CasLogFileRepository → MetadataStore::get_all_files() + CAS::retrieve()
→ SearchBatch(BATCH_SIZE=2000, FILE_CHUNK_SIZE=10)
→ QueryEngineLogSearcher(regex / Aho-Corasick / Memchr / Fancy)
→ CompiledSearchFilters(时间范围、日志级别、文件路径)
→ 实现 la_core::domain::Filter trait
→ DiskResultStoreRepo → DiskResultStore::write_results()
→ 返回 search_id(UUID)
→ cancel_search(searchId) / fetch_search_page(searchId, offset, limit)
当前主搜索的实际规则:
|表示 OR 查询- 正则能力以 Rust
regex引擎支持的子集为准;look-around 模式自动通过FancyEngine处理 - 查询验证器检测 ReDoS 模式(嵌套量词、重叠交替)
SearchBatch控制批量刷新与截断,避免内存溢出- 搜索结果通过
DiskResultStore分页写盘 - 时间过滤与日志级别掩码通过
CompiledSearchFilters统一处理 - 文件模式过滤支持通配符 + SQLite GLOB(
LogFileRepository层)
- 本地日志搜索,支持
|多关键词 OR 查询 - 混合搜索引擎(Memchr / Aho-Corasick / Standard Regex / Fancy look-around)
- 搜索结果磁盘分页,适配大结果集
- 按日志级别、时间范围、文件模式组合过滤
Filterdomain trait — 过滤器可独立测试和 mock- ZIP / TAR / GZ / 7Z 等归档导入与递归解压
- CAS 内容寻址存储去重(SHA-256)
- SQLite 元数据管理 + 虚拟路径映射
- 文件监听与实时增量追踪(
FileTailer+WatcherRunner) - 虚拟文件树浏览、文件内容导出
- 结构化查询与关键词组管理
- 验证 newtypes:
SafePath/WorkspaceId/QueryString
log-analyzer_rust/
├── log-analyzer/ # 前端与 Tauri 应用根目录
│ ├── src/ # React 前端(hooks / stores / pages)
│ ├── src-tauri/ # Rust 后端主 crate
│ │ ├── src/
│ │ │ ├── application/ # Use cases: search, watch, config, export
│ │ │ ├── commands/ # Tauri 命令(纯校验 + 委托)
│ │ │ ├── infrastructure/ # Adapters: searcher, event_publisher, etc.
│ │ │ ├── services/ # Engines: query_planner, regex_engine
│ │ │ ├── models/ # AppState(typed registries)
│ │ │ └── utils/ # encoding, validation, newtypes
│ │ └── crates/
│ │ ├── la-core/ # Domain traits + models
│ │ ├── la-storage/ # CAS + SQLite
│ │ ├── la-search/ # Query engine + result store
│ │ └── la-archive/ # Archive extraction
│ └── package.json
├── docs/ # 核心文档
├── scripts/ # CI / 校验脚本
├── .github/workflows/ # CI/CD 流水线(含 Dependabot)
└── test_nested_archives/ # 测试用嵌套归档夹具
cd log-analyzer
npm run dev启动桌面程序:
cd log-analyzer
npm run tauri devcd log-analyzer
npm run tauri build前端:
cd log-analyzer
npm run lint
npm run type-check
npm testRust:
cd log-analyzer/src-tauri
cargo fmt -- --check
cargo clippy --all-features --all-targets -- -D warnings
cargo test -q完整文档站:ashllll.github.io/log-analyzer_rust
本地预览文档:
npm ci
npm run docs:dev| 文档 | 说明 |
|---|---|
| 快速开始 | 安装、导入与第一次搜索 |
| 架构总览 | 分层、workspace crates 与关键数据流 |
| 文档索引 | 文档目录与阅读顺序 |
| 贡献指南 | 开发环境、提交流程、测试约定 |
| 运行手册 | 构建、排障、回滚指南 |
| 发布流程 | 版本发布步骤与校验要求 |
| CAS 存储架构 | 内容寻址存储与元数据设计 |
- 前端搜索入口:
log-analyzer/src/pages/SearchPage.tsx - 后端搜索入口:
log-analyzer/src-tauri/src/commands/search/mod.rs - 搜索用例编排:
log-analyzer/src-tauri/src/application/search.rs - 查询引擎:
log-analyzer/src-tauri/src/services/regex_engine.rs - 过滤器 trait:
log-analyzer/src-tauri/crates/la-core/src/domain/filter.rs - 验证 newtypes:
log-analyzer/src-tauri/src/utils/validation/ - 结构化查询能力存在,但不是当前 UI 主搜索入口
- 文档以“当前代码真实行为”为准,不把预留能力写成已落地主链路
Apache-2.0


