# Harlog **Repository Path**: vipkwds/harlog ## Basic Information - **Project Name**: Harlog - **Description**: A Go library and CLI tool for capturing, merging, and converting HTTP archive formats (HAR and SAZ). - **Primary Language**: Go - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-01 - **Last Updated**: 2026-06-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Harlog - HAR/SAZ 网络抓包工具箱 一个 Go 语言库和命令行工具,用于捕获、合并和转换 HTTP 归档格式(HAR 和 SAZ)。 [![Go](https://img.shields.io/badge/Go-1.21+-blue.svg)](https://go.dev) [![License](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE) ## 功能特性 - **HAR 流量捕获**:作为 `http.RoundTripper` 包装器,将所有 HTTP 请求/响应记录为 HAR 1.2 格式 - **完整计时分析**:DNS、连接、SSL、发送、等待、接收各阶段耗时精准记录 - **Cookie 解析**:完整支持请求/响应 Cookie 的 SameSite、HTTPOnly、Secure 等属性 - **响应解压**:自动解压 gzip、deflate、brotli 编码的响应体 - **二进制处理**:自动检测并 base64 编码二进制内容 - **缓存追踪**:ETag 和 HitCount 追踪 - **格式互转**:HAR ↔ SAZ(Fiddler 格式)双向无损转换 - **合并操作**:支持 glob/正则模式批量合并多个 HAR 或 SAZ 文件 - **协议检测**:HTTP/1.1、HTTP/2、HTTP/3 自动检测 - **连接追踪**:连接复用检测、真实 IP/端口获取 - **导出格式**:支持 Chrome DevTools、Postman Collection、HTML 报告 - **Web UI**:自带浏览器界面操作 ## 项目结构 ``` harlog/ ├── har.go # HAR 数据结构定义和 HarTransport 核心实现 ├── saz.go # SAZ 格式支持(Fiddler 兼容) ├── cert.go # 证书处理 ├── export.go # 导出功能(DevTools、Postman、HTML) ├── grpc.go # gRPC 追踪支持 ├── http2.go # HTTP/2 支持 ├── websocket.go # WebSocket 追踪支持 ├── sdk/ # SDK 上报模块 │ ├── reporter.go # HAR 上报器(支持去重、过滤) │ └── receiver.go # HAR 接收解析器 ├── dedup/ # 去重模块 │ ├── bloom.go # BloomFilter 实现 │ ├── simhash.go # SimHash + RingBuffer 实现 │ ├── status.go # 业务状态检查 │ └── readme.md # 去重策略详细说明 ├── cmd/harlog/ # CLI 命令行工具 │ ├── main.go # 主程序入口 │ ├── ui.go # Web UI │ └── README.md # CLI 使用说明 └── templates/ # HTML 报告模板 ``` ## 库使用 ```go import "gitee.com/vipkwds/harlog" // 创建用于捕获 HTTP 流量的 Transport transport := harlog.NewTransport(nil) client := &http.Client{Transport: transport} // 发起请求(自动被捕获) resp, err := client.Get("https://example.com") ``` ### HAR 数据获取方法对比 | 方法 | 说明 | |------|------| | `HAR()` | 仅导出 HAR JSON,**不清空**内部缓冲区,后续请求继续累积 | | `GetAndReset()` | 导出 HAR JSON 后**自动清空**内部缓冲区,原子操作,线程安全 | | `Reset()` | 仅清空内部缓冲区,不返回数据 | ```go // 导出为 HAR JSON(数据保留在缓冲区,持续累积) harData := transport.HAR() os.WriteFile("capture.har", harData, 0644) // 线程安全获取并重置(适用于并发场景) // 获取当前 HAR 数据后自动清空,可避免数据累积 harData = transport.GetAndReset() os.WriteFile("capture2.har", harData, 0644) // 转换为 SAZ(Fiddler 格式) transport.ToSAZ("capture.saz") // 导入合并多个文件 transport.ImportSAZ("another.saz") transport.ImportEntries(otherEntries) // 重置捕获状态 transport.Reset() ``` ## 命令行使用 ```bash # 合并多个 HAR 文件 harlog merge-har "*.har" harlog merge-har --regex "^2025.*\.har$" # 合并 SAZ 文件 harlog merge-saz "./saz/*.saz" # HAR 转 SAZ harlog har2saz input.har -o output.saz # SAZ 转 HAR harlog saz2har input.saz -o output.har # 导出为 Chrome DevTools 格式 harlog export-devtools input.har -o output.json # 导出为 Postman Collection v2.1 harlog export-postman input.har -o collection.json --name "My API" # 生成 HTML 报告 harlog export-html input.har -o report.html # 查看统计信息 harlog stats input.har # 启动 Web UI harlog ui harlog ui --port 8080 ``` ## 命令说明 | 命令 | 说明 | |------|------| | `merge-har` | 合并多个 HAR 文件(支持 glob/正则) | | `merge-saz` | 合并多个 SAZ 文件(支持 glob/正则) | | `har2saz` | 将 HAR 文件转换为 SAZ 格式 | | `saz2har` | 将 SAZ 文件转换为 HAR 格式 | | `export-devtools` | 导出为 Chrome DevTools 兼容格式 | | `export-postman` | 导出为 Postman Collection v2.1 | | `export-html` | 生成 HTML 报告 | | `stats` | 显示文件统计信息 | | `ui` | 启动 Web 界面 | ## 选项说明 | 选项 | 说明 | |------|------| | `-o <文件>` | 指定输出文件 | | `--regex` | 使用正则匹配输入文件 | | `--port <端口>` | 设置 Web UI 端口(默认 9191) | | `--preserve-binary` | 保留二进制数据(不进行 base64 编码) | | `--merge` | 合并重复会话(按 URL+Method) | ## HAR 格式支持 库实现了 HAR 1.2 规范,并包含扩展字段: - 完整的请求/响应头信息 - Query String 参数解析 - POST 数据及 MIME 类型检测 - Cookie 全属性解析 - 内容压缩处理(gzip、deflate、brotli) - 服务器 IP 地址和连接追踪 - TLS 版本追踪 - 请求优先级检测 - 缓存条目(ETag 和 HitCount) - 扩展字段支持(`_priority`、`_tlsVersion`、`_http3`、`_sessionId`、`_comment`) ## SAZ 格式支持 SAZ(Fiddler 会话存档 ZIP)格式,兼容 Fiddler: - `meta.xml` 元数据 - `index.json` 会话索引 - 原始请求/响应文件(`_c.txt`、`_s.txt`) ## 依赖 - `github.com/andybalholm/brotli` - Brotli 解压支持 - `golang.org/x/net/http2` - HTTP/2 支持 ## 安装 ```bash # 安装命令行工具 go install gitee.com/vipkwds/harlog/cmd/harlog@latest # 或构建 git clone https://gitee.com/vipkwds/harlog.git cd harlog go build -o harlog ./cmd/harlog ```