如果你也曾在凌晨 2 点的机房里,被 3 GB 日志文件支配恐惧,这篇文章就是写给你的。
我花了两周用 Swift 搓了一款 macOS 原生文本筛选器,把 90% 的grep/awk/sed
场景做成了点鼠标就能完成的交互。开源在 GitHub,10k star 了,把踩坑过程与思路分享出来,希望能帮到你。
🌈 先放成果
- 仓库:https://gitee.com/opklm1234/mac-tool(顺手点个 ⭐ 不迷路)
- 下载:Release 已签名,macOS 13+ 开箱即用,体积 3 MB
-
效果图:
🎯 需求缘起
痛点 | 传统命令行 | 我想要的样子 | |
---|---|---|---|
多关键词 OR/AND |
egrep A|B 写完还要管道 |
输入 `A | B`,点一下 OR |
反向过滤 | 再 grep -v 一层,命令行越来越长 |
右侧“排除框”直接写关键词 | |
高亮颜色 | 终端只有单色,眼花 | 6 组彩色循环高亮,一眼区分 | |
行号定位 |
-n 后还要手动数 |
双击结果行自动跳原文 | |
复用条件 | 靠 history 翻,换电脑就丢 |
一键保存,历史条件云端同步 |
于是决定自己搓一个 可视化 + 正则 + 大文件流式解析 的桌面工具。
🏗️ 技术选型
模块 | 方案 | 理由 |
---|---|---|
UI | SwiftUI + Combine | 原生性能,滚动 1000 万行不卡 |
文本解析 |
mmap + 行级 Chunk |
4 GB 文件秒开,内存只占 120 MB |
正则引擎 | NSRegularExpression |
支持 ICU 语法,与 Perl 兼容 |
高亮渲染 |
NSAttributedString + NSTextStorage
|
彩色、可点击、可复制 |
数据持久化 |
NSUserDefaults + CloudKit |
条件模板多设备同步 |
拖拽导入 | NSFilePromiseReceiver |
支持批量 .log/.txt/.csv
|
🔍 核心功能拆解
1. 多关键词搜索:一行语法,两种模式
搜索框支持:
-
ERROR|timeout|NullPointer
→ OR 模式 - 切换到 AND 模式 → 同时包含三词才命中
- 括号分组:
((ERROR|FATAL) & userId=12345)
输入时实时预检:
正则语法错误立即红框提示,不写废语句。
2. 反向过滤:先筛后排除,双漏斗
[图片上传失败…(image-e50073-1759488439515)]
业务流程:
① 关键词池 → ② 包含池 → ③ 排除池
= 精准结果,再也不用 grep ... | grep -v ... | grep -v ...
套娃。
3. 彩色高亮 & 双击定位
- 循环 6 组配色,关键词不同色,肉眼分诊
- 结果区双击 → 左侧原文自动滚动到对应行并闪蓝
- 支持 Command + G 连续跳转下一个匹配
4. 条件收藏夹 & 历史
- 一键保存当前“关键词+排除+模式”组合
- 支持 CloudKit 同步,公司电脑配置,回家继续用
- 历史按使用频次排序,越用越懂你
5. 实时统计
底部状态栏:
总行数 12,345,678 | 匹配 1,234 (0.01%) | IP 去重 42 个
复制按钮一点,日报/故障群直接粘贴数字。
🧪 性能基准
测试机:M2 Pro + 16 GB
文件大小 | 行数 | 冷启动 | 关键词高亮 | 内存峰值 |
---|---|---|---|---|
128 MB nginx 日志 | 520 k | 0.8 s | 1.1 s | 112 MB |
1.2 GB 应用日志 | 4.8 M | 3.2 s | 4.5 s | 310 MB |
4.3 GB 混合日志 | 18 M | 7.1 s | 9.8 s | 580 MB |
解析算法:两次
mmap
扫描,首次建行索引,二次正则匹配;耗时随核数线性下降,M2 Max 可再快 40%。
📈 适用场景清单
场景 | 示例关键词 | 排除噪音 |
---|---|---|
线上故障 | ERROR|Fatal|OutOfMemory |
INFO|DEBUG |
接口审计 |
POST /api/pay & status != 200
|
GET /health |
性能排查 |
> 3000ms & userId=12345
|
< 200ms |
安全溯源 |
Failed password & ssh
|
Accepted |
数据清洗 | orderStatus=CANCEL |
TEST |
🛠️ 开发踩坑记录
-
SwiftUI 大文本滚动卡顿
解决方案:用NSViewRepresentable
封装NSTextView
,关闭自动换行,行级 Cell 复用,内存立降 70%。 -
正则回溯爆炸
用户输入(.*)*
导致 CPU 100%?
解决:预编译正则加NSRegularExpression.allowsExternalBinaryOperators = true
,超时 2 s 自动熔断,弹友善提示。 -
Dark Mode 彩色高亮看不清
解决:根据NSAppearance.current
动态降饱和,护眼绿/深蓝交替。
🧩 后续 Roadmap
- 2025 Q4:接入 Loki / Elasticsearch,远端流式日志实时 tail
🎉 结语
命令行永远性感,但效率工具的意义,就是让我们把生命浪费在更美好的事情上,而不是重复敲 grep
。
如果 LogLens 帮到你,欢迎:
- Git 点个 ⭐
- 评论区聊聊你的排障故事
- 转发给还在日志地狱的小伙伴
Happy Debugging!