
这个工具解决什么问题
线上接口被用户投诉「有时候特别慢」,你手上只有一份几百 MB 的 Nginx 访问日志。想知道到底哪个接口慢、慢到什么程度,第一反应是敲 awk 拼管道:先把状态码捞出来 sort | uniq -c,再按接口分组算平均耗时——这一步就得写脚本了,还得处理 URL 上那些带 id 的查询串,不然每个 id 都会被算成一个「不同接口」,Top 榜直接被淹没。等你终于把脚本调通,天已经亮了,而隔壁同事问的「5xx 集中在哪个时段」又是另一个脚本。一份日志反复折腾一晚上,结论还没成型。
- 原来的做法:grep / awk / sort / uniq 手拼管道,每换一个问题就要重写一次命令;按接口分组统计必须自己写脚本;URL 带参数时分组会碎成几千个「接口」;结果还要再粘进 Excel 才能给别人看。
- 用这个工具:打开工具 → 选日志文件 → 点「开始分析」。五个标签页分别给出:总体概览、状态码分布(带中文含义)、最慢接口 Top 榜(已按平均耗时排序、标出错误数)、调用最多的接口、24 小时时段分布与来源 IP。URL 查询串自动去掉,同一个接口不会被拆成几千条。
- 省下来的:把「写脚本 + 调脚本 + 反复换问题」压缩成「点一次按钮」。原来半小时起步、还得会写脚本的活,现在 10 秒出结论。
技术实现
整体是「内核 + 界面」两层。内核 log_core.py 只做纯计算:流式解析日志、累加统计、渲染文本/CSV,完全不依赖 tkinter,可以脱离界面单独调用和测试。界面 log_watch.py 只负责画控件和把结果贴到屏幕上。分层的原因是 tkinter 的单线程限制——分析几百万行会卡死界面,所以内核跑在后台线程,用 queue 把进度消息送回主线程刷新进度条。
- 流式逐行读取,内存不随日志增长:用 for line in fh 迭代而不是 readlines()。几个 GB 的日志若一次性读进内存会直接吃满,逐行迭代时内存占用只跟单行长度有关。实测 6.9 MB / 8 万行日志耗时 3.1 秒(约 2.5 万行/秒),内存平稳。读取时带 errors='replace',日志里混进非法字节(比如被截断的 GBK 中文)只会让那一行变成替换字符,不会抛异常把整个分析打断。
- 四种日志格式自动识别,不用用户选:按 JSON → Nginx/Apache 组合格式 → 简化文本 → Key=Value 的顺序尝试,命中即用。JSON 特征最明确所以放第一位;组合格式的正则最严格放第二位;后两种约束松,用于兜底。字段名支持常见别名归一化:status / status_code / code / http_status 都认,url / uri / path / endpoint 都认,response_time / duration / elapsed / latency / cost 都认。这样用户换个日志库(比如把 go-http 换成 zerolog)字段名变了工具也不会废。
- 路径归一:去掉 URL 查询串:统计前先 strip_query() 把 /api/user?id=3&page=2 归成 /api/user。不做这一步的话,每个带不同 id 的请求都会被算成「另一个接口」,Top 榜会被同一批 URL 的无数变体淹没,反而看不出哪个接口真的慢。这是日志统计里最容易踩、也最容易被忽略的坑。
- 分位数与速度分桶:除了平均值,还给出 P50 / P95 / P99 三个分位数——平均耗时会被少数极慢请求拉偏,分位数才能反映大多数用户的真实体感。速度分桶(<100ms / 100-300ms / 300ms-1s / 1-3s / >3s)用左闭右开区间,唯独「>3s」这一桶含 3 秒,让正好卡在边界上的请求落进「1-3s」而不被误判成慢请求。分位数最多保留 20000 个样本、超出按步长抽样,保持内存恒定。
- 最慢榜的统计门槛:只被调用过一两次的接口不参与「最慢接口」排名(默认要求至少 3 次,可在界面上调)。原因是:出现 1 次、恰好碰上一次超时的接口,平均耗时就是那次超时的值,会毫无意义地霸占榜首,把真正的问题接口挤下去。界面上这个阈值是可改的,调小就能看到长尾。
- 时区折算用内置偏移表兜底:服务器日志常是 UTC,而运维脑子里的「几点」是本地时间,看时段分布会差好几个小时。这里提供时区折算,并特意做了兜底:Windows 上的 Python 默认不带 tzdata,直接用 ZoneInfo('Asia/Shanghai') 会抛 ZoneInfoNotFoundError。工具内置了一张固定偏移表覆盖常用时区,有 tzdata 时优先用 zoneinfo(能处理夏令时),没有时退回固定偏移,保证零依赖、离线可用、永不报错。
技术栈:Python 3.8+、tkinter 图形界面、流式逐行分析、零依赖免安装
已知局限:只处理单文件,不支持多文件合并统计;不做日志的实时追尾监控;不做关键字检索(那用 grep 更合适);日志格式只覆盖主流的四类,私有格式需要改代码加分支。分位数在大日志下是抽样计算的,会有极小误差。
操作教程
- 选择日志文件
双击打开程序,点「选择日志文件…」,在文件对话框里挑一个 .log / .txt / .json / .gz 文件。也可以把日志文件直接拖到程序图标上,程序会自动载入并开始分析。
预期结果:顶部显示所选文件的完整路径与文件大小。 - 确认统计选项
「时区」默认「本地」;服务器日志是 UTC 的话选 Asia/Shanghai,时段分布会折算成北京时间。「榜单条数」默认 10 条。
预期结果:不调整也能直接跑,默认值对大多数场景够用。 - 开始分析
点「开始分析」。分析在后台进行,界面不会卡死,底部进度条按已读字节推进。
预期结果:状态栏实时显示「已读取 xx 行(xx MB / xx MB)」。中途想停就点「中止」,已读部分的结果仍会展示。 - 看「概览」标签页
分析完成后自动停在概览页:总行数、解析成功/失败数、解析成功率、平均与分位响应时间、流量合计、速度分布柱状图。解析失败的行会列出最多 5 条样本,值不值得关注一眼就知道。
预期结果:拿到全局体感:日志干不干净、整体快不快。 - 看「状态码分布」标签页
每个状态码的次数与占比,并附中文含义(比如 502 = 网关错误,后端没起来),下方按 2xx/3xx/4xx/5xx 汇总。
预期结果:判断 5xx 占比是否异常、有没有被限流(429)或大面积 404。 - 看「最慢接口」标签页
按平均响应时间排序的 Top 榜,同时列出最大耗时、调用次数、错误数。有错误的接口会标「← 有错误」。
预期结果:定位到具体哪个接口慢,以及它是不是同时也在报错(慢 + 错的接口优先排查)。 - 导出报告
点「导出文本报告」得到一份排版好的纯文本报告;点「导出 CSV」得到 Excel 可直接打开的结果表(已带 UTF-8 BOM,中文不会乱码)。
预期结果:弹出「导出成功」并显示保存路径,文件可以直接发给同事或贴进工单。
常见问题
技术实现与后续维护
工具分为内核与界面两层:log_core.py 负责全部计算,log_watch.py 负责界面。任何统计口径的改动都在内核里,改完跑一遍 tests/selftest.py 即可回归——自测里的期望值是手算写死的,能真实反映口径变化。运行环境要求很低:Windows 10/11 64 位,不需要装 Python,不需要联网。后续可扩展方向包括多文件批量分析、自定义正则解析、告警阈值、实时追尾模式等,详见开发文档第六节。需要在此基础上做定制(比如适配私有日志格式、对接内网监控系统),可以联系站长进行二次开发。
技术构成:
src/log_core.py—— 分析内核:四种格式解析、统计累加、分位数与分桶、文本与 CSV 渲染。不依赖 tkinter,可脱离界面独立调用。src/log_watch.py—— tkinter 图形界面:文件选择、选项控件、后台线程调度、进度刷新、五个结果标签页、导出对话框。tests/selftest.py—— 自测脚本,183 项断言,分 12 组覆盖解析 / 统计 / 流式 / 导出 / 静态检查。DOCS/开发文档.md—— 开发文档:设计取舍、技术要点、两个已知坑的成因与处置、扩展方向、维护约定。
运行环境:
环境:Python 3.8+(需带 tkinter)。打包命令:pyinstaller --onefile --noconsole --name 本地日志统计小工具 src/log_watch.py。必须带 --noconsole,否则会带黑色控制台窗口;必须用带 tkinter 的 Python,某些精简发行版不带 tkinter 也能编译通过,但打出的 exe 一运行就报 No module named tkinter。
可扩展方向:
- 多文件 / 整目录批量分析:界面加目录选择,循环调用 analyze_file 后合并多个 Stats
- 自定义正则解析:给用户一个输入框写自己的正则与命名分组,覆盖内置四类之外的私有日志格式
- 慢接口告警阈值:平均耗时超过设定值就在界面上高亮或弹提示
- 实时追尾模式:定时重跑并只统计文件新增的字节,做成滚动监控
- 结果表格可点表头排序(把 Text 换成 Treeview)
- 导出 HTML 报告,内嵌柱状图,方便直接发出去
本工具免费提供使用,但不对外分发源码。如果你需要在本工具基础上做功能调整、对接内部系统或长期维护,可以联系我们做二次开发,源码与工程文档可在定制合作中一并交付。
需要其它功能?可以定制
这个工具只做一件事:服务日志几百万行,只想看状态码分布和最慢的接口,用命令行拼管道太费劲。如果你的场景还需要别的处理,可以联系我们做二次开发,按你的实际数据格式和流程定制。
常见的定制需求:
- 适配你们公司自己的私有日志格式(加一个解析分支)
- 把分析结果直接写进你们的监控系统或数据库
- 换成从多个日志文件 / 多个服务器汇总统计
- 按业务维度(比如租户 ID、订单号)分组做 Top 榜
- 加上「慢接口连续出现就告警」的阈值判断
- 联系方式:https://www.biyeyuanma.cn
- 定制说明:请附上你的数据样例(脱敏即可)和期望结果,方便快速评估工作量
- 交付形式:定制项目可交付可执行程序,按需一并交付源码与工程文档,支持长期维护
使用说明与免责声明
- 本工具在本地运行,不联网、不上传任何数据到服务器。
- 涉及文件改写的功能,请在使用前备份原始文件。
- 软件完全免费,可自由使用与转发,请勿用于倒卖。
- 因误操作造成的数据问题请自行承担。

