# 浏览器本地日志分析

0.9.1 新增第四个入口“日志分析”。网页与离线 HTML 包含相同代码、人工样例、帮助及许可证。

1. 加载两份 MMDB，在角色选择框中分别指定 City 和 ASN。数据库名称不决定角色。
2. 选择或拖入一个 UTF-8 JSONL 文件。每行一个对象，默认 IP 位于 `/ip`；例如嵌套日志可填写 `/client/ip`。
3. 设置 Top N 与日志限制，点击“开始分析”。正常结束后显示国家与 ASN 排名及五类互斥计数。
4. 复制 JSON 可取得与命令行同结构的分析结果；下载 JSON 另外包含网页版本、数据库文件名及操作来源信息。日志原文不包含在报告中。

点击“日志分析样例”再开始分析，预期请求数 4、有效 IP 数 4；国家 ZZ 两次、YY 一次，另一次未命中。ASN 64512 两次、64513 一次。全部样例为人工数据，不代表真实归属。

## 统计与错误

沿用 [正式日志分析](ANALYTICS.md) 的口径、精确整数、排序与错误优先级；请求次数不等于去重 IP 或人数。报告中的计数为十进制字符串，条形图仅辅助比较占比。

每维 `counted + not_found + missing_field + type_error + query_error = valid_ips`。字段缺失单独统计，不改变退出码含义。空输入得到零计数报告。正常完成可能包含错误行；页面会明确提示，报告保留 `exit_code`，但浏览器本身没有进程退出码。

错误 JSON、缺失 IP、非法 IP 继续计数；损坏 UTF-8、读取失败、分组或输入预算耗尽立即终止。此时只显示错误，不产生 `status: complete` 的分析报告。正常 EOF 无法识别上游静默截断。

## 资源、进度和隐私

- 日志默认 8 MiB、10,000 行，可提高到 64 MiB、1,000,000 行；更大日志使用 Native `analyze`。
- 单行最多 8 MiB（不包含 LF，包含 CR），JSON 深度 128，每维最多 10,000 组，分组键最多 256 UTF-8 字节。
- 数据库单库与合计最多 256 MiB，结果最多 8 MiB，JSON 预览最多 64 KiB。文件限制不是浏览器进程内存限制。
- 每次读取 64 KiB，逐行统计。原始字节 SHA-256 包括 BOM、CRLF、错误行和末行原始字节，不对重新编码的 JSON 计算散列。
- 进度显示已读取字节和处理行数；读取达到 100% 后仍须完成最终报告。取消终止 Worker，重新加载已选数据库后可重试；旧任务不能覆盖新结果。
- 文件、IP 和日志仅保存在当前页面内存，不上传、不保存历史、不写入 URL 或持久存储。在线打开网页本身仍是一次网站访问；主动下载的报告由用户自行保存。

使用固定 MoonBit 工具链和 `moonbitlang/x@0.5.5` 的增量 SHA-256；散列适配为独立工具模块，不增加核心读取库依赖。首版验证桌面 Chromium、Edge 与 Firefox，不承诺 Safari 或手机大库性能。
