Files
hotime/docs/Seq日志集成.md
T
hoteas 8921aa3b1c feat(logging): 增加 Seq 日志集成与标准输出重定向
- 新增 SeqWriter 支持,将日志异步推送到 Seq 平台,支持多进程实例区分
- 实现 redirectStdout 函数,重定向 os.Stdout 和标准 log 包输出,确保 fmt.Println 等输出被捕获并记录
- 更新 README 文档,增加 Seq 日志集成的说明与配置链接
- 扩展 Logger 结构,支持动态添加输出目标,提升日志记录灵活性
2026-05-18 13:12:51 +08:00

122 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Seq 日志集成
HoTime 框架内置 Seq 日志推送支持。通过在 `config.json` 填写 `seqUrl` 即可激活,
所有框架日志(含 `fmt.Println` 等绕过 Logger 的输出)实时推送到 Seq,
通过 Seq Web UI 实现关键词、日期范围、日志级别、结构化字段等多维度搜索。
---
## 配置项
`config.json` 中添加:
```json
"seqUrl": "http://127.0.0.1:5341",
"seqApiKey": ""
```
| 字段 | 默认值 | 说明 |
|---|---|---|
| `seqUrl` | 空(不激活) | Seq 服务地址,空值时功能静默不生效 |
| `seqApiKey` | 空 | API Key,免费单用户版留空 |
`instance` 字段由框架自动拼接为 `ip:port`(如 `192.168.1.10:8085`),无需手动填写,同机多进程靠端口区分,跨服务器靠 IP 区分,支持未来集群扩展。
---
## 架构原理
```
业务代码
│ l.Info().Msg("...") ← HoTime Logger 正常调用路径
│ fmt.Println("...") ← 被 redirectStdout 捕获后转入同一路径
multiWriterhotimev1.5/log/logger.go
├─ ConsoleWriter → 彩色终端输出(不变)
├─ FileWriter → 本地日志文件(按需,logFile 配置)
└─ SeqWriter
│ Write() 只做 channel <- bytesO(1) 非阻塞
channel(容量 10000
↓ 后台 goroutine
批量打包(100 条 或 500ms
↓ HTTP POST
Seq 服务(CLEF 格式)
```
**关键特性:**
- `SeqWriter.Write()` 仅向 channel 投递字节即返回,**绝不阻塞** web 请求处理 goroutine
- channel 满时(Seq 宕机/网络故障)新日志被丢弃并计数,主服务完全不受影响
- HTTP POST 设 5s 超时,失败仅打印到 stderr
---
## 字段映射(zerolog → CLEF
| zerolog 字段 | Seq CLEF 字段 | 说明 |
|---|---|---|
| `time` | `@t` | 时间,自动转 ISO 8601 格式 |
| `level` | `@l` | 级别,映射为 Debug/Information/Warning/Error/Fatal |
| `message` / `msg` | `@mt` | 消息正文 |
| `caller` | `caller` | 调用位置,原样保留 |
| 其余自定义字段 | 原字段名 | 原样保留,可在 Seq 中直接查询 |
| — | `instance` | 框架自动注入,值为 `port` 配置(如 `"8085"` |
| — | `source` | fmt.Println 等捕获的输出标记为 `stdout` |
---
## 单机多进程实例区分
框架启动时自动获取本机出口 IP,拼接为 `ip:port` 格式作为 `instance`
```
单机多进程:
192.168.1.10:8085 ─┐
192.168.1.10:8086 ─┼─ HTTP CLEF ──→ Seq
192.168.1.10:8087 ─┘
多服务器集群:
192.168.1.10:8085 ─┐
192.168.1.11:8085 ─┼─ HTTP CLEF ──→ Seq(中央日志服务器)
192.168.1.12:8085 ─┘
```
Seq 中按实例筛选:
- 单台机器所有进程:`instance like '192.168.1.10%'`
- 精确到某个进程:`instance = '192.168.1.10:8085'`
---
## stdout 全量捕获
框架启动时(`SetConfig()` 中)自动调用 `redirectStdout()`
`os.Stdout` 和标准 `log` 包重定向到 HoTime Logger
- `fmt.Println("xxx")` → 以 `INFO` 级别、`source=stdout` 字段推送到 Seq
- `log.Printf("xxx")` → 同上
- 控制台仍然能看到这些输出(输出管道由 goroutine 实时转发)
---
## Seq 安装
Seq 提供 Windows MSI 安装包和 Docker 镜像,单机免费,无外部数据库依赖:
- Windows[https://datalust.co/download/seq](https://datalust.co/download/seq),安装后自动注册为 Windows 服务
- Docker`docker run -d --restart always --name seq -p 5341:80 -e ACCEPT_EULA=Y datalust/seq`
- 访问 `http://localhost:5341` 使用 Web UI
---
## 搜索语法速查
| 目标 | 查询语句 |
|---|---|
| 关键词搜索 | 直接输入,如 `支付失败` |
| 日志级别 | `@l = 'Error'` |
| 特定实例 | `instance = '8085'` |
| stdout 来源 | `source = 'stdout'` |
| 调用位置 | `caller like '%order.go%'` |
| 组合查询 | `@l = 'Error' and instance = '8086' and @mt like '%超时%'` |
| 日期范围 | 右上角时间选择器,支持精确到秒 |