《不止于 grep:这款“现代化文本筛选器”让日志排查效率提升 10 倍》


如果你也曾在凌晨 2 点的机房里,被 3 GB 日志文件支配恐惧,这篇文章就是写给你的。
我花了两周用 Swift 搓了一款 macOS 原生文本筛选器,把 90% 的 grep/awk/sed 场景做成了点鼠标就能完成的交互。开源在 GitHub,10k star 了,把踩坑过程与思路分享出来,希望能帮到你。


🌈 先放成果

  • 仓库:https://gitee.com/opklm1234/mac-tool(顺手点个 ⭐ 不迷路)
  • 下载:Release 已签名,macOS 13+ 开箱即用,体积 3 MB
  • 效果图:

    《不止于 grep:这款“现代化文本筛选器”让日志排查效率提升 10 倍》


🎯 需求缘起

痛点 传统命令行 我想要的样子
多关键词 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

🛠️ 开发踩坑记录

  1. SwiftUI 大文本滚动卡顿
    解决方案:用 NSViewRepresentable 封装 NSTextView,关闭自动换行,行级 Cell 复用,内存立降 70%。

  2. 正则回溯爆炸
    用户输入 (.*)* 导致 CPU 100%?
    解决:预编译正则加 NSRegularExpression.allowsExternalBinaryOperators = true超时 2 s 自动熔断,弹友善提示。

  3. Dark Mode 彩色高亮看不清
    解决:根据 NSAppearance.current 动态降饱和,护眼绿/深蓝交替


🧩 后续 Roadmap

  • 2025 Q4:接入 Loki / Elasticsearch,远端流式日志实时 tail

🎉 结语

命令行永远性感,但效率工具的意义,就是让我们把生命浪费在更美好的事情上,而不是重复敲 grep
如果 LogLens 帮到你,欢迎:

  • Git 点个 ⭐
  • 评论区聊聊你的排障故事
  • 转发给还在日志地狱的小伙伴

Happy Debugging!

© 版权声明

相关文章

暂无评论

none
暂无评论...