feat(middleware): 请求日志新增 handler 字段定位实际处理函数

- 通过 c.HandlerName() 获取处理请求的 handler 函数名
- 解决 caller 始终指向中间件文件无法定位业务代码的问题
- 同步更新架构文档日志示例,补充 caller/handler 说明

Made-with: Cursor
This commit is contained in:
bujinyuan
2026-02-28 15:56:32 +08:00
parent 99c2f4f86a
commit a6ef49a3e0
2 changed files with 15 additions and 3 deletions

View File

@@ -71,9 +71,13 @@ func Logger() gin.HandlerFunc {
status := rbw.Status() status := rbw.Status()
path := c.Request.URL.Path path := c.Request.URL.Path
// handler 名称:如 "main.main.func1" 或 "controller.auth_controller.Login"
handler := c.HandlerName()
fields := []zap.Field{ fields := []zap.Field{
zap.String("method", c.Request.Method), zap.String("method", c.Request.Method),
zap.String("path", path), zap.String("path", path),
zap.String("handler", handler),
zap.Int("status", status), zap.Int("status", status),
zap.Duration("latency", latency), zap.Duration("latency", latency),
zap.String("ip", c.ClientIP()), zap.String("ip", c.ClientIP()),

View File

@@ -466,14 +466,16 @@ HTTP 请求日志中间件自动记录每个请求的完整信息,包含请求
```json ```json
{ {
"level": "INFO", "level": "INFO",
"ts": "2026-02-28 15:47:59", "ts": "2026-02-28 15:55:48",
"trace_id": "178fa038-90bd-4038-b526-e2243ac82408", "caller": "middleware/logger.go:135",
"trace_id": "a6f0a744-eb14-4ac8-9e7a-5162ce7be842",
"func": "middleware.Logger", "func": "middleware.Logger",
"msg": "请求完成", "msg": "请求完成",
"method": "GET", "method": "GET",
"path": "/health", "path": "/health",
"handler": "main.main.func1",
"status": 200, "status": 200,
"latency": 0.000346, "latency": 0.000422,
"ip": "192.168.1.100", "ip": "192.168.1.100",
"user_agent": "Mozilla/5.0", "user_agent": "Mozilla/5.0",
"query": "foo=bar&debug=true" "query": "foo=bar&debug=true"
@@ -486,11 +488,13 @@ HTTP 请求日志中间件自动记录每个请求的完整信息,包含请求
{ {
"level": "INFO", "level": "INFO",
"ts": "2026-02-28 15:48:00", "ts": "2026-02-28 15:48:00",
"caller": "middleware/logger.go:135",
"trace_id": "abc-123-def-456", "trace_id": "abc-123-def-456",
"func": "middleware.Logger", "func": "middleware.Logger",
"msg": "请求完成", "msg": "请求完成",
"method": "POST", "method": "POST",
"path": "/api/v1/auth/login", "path": "/api/v1/auth/login",
"handler": "controller.auth_controller.Login",
"status": 200, "status": 200,
"latency": 0.025, "latency": 0.025,
"ip": "192.168.1.100", "ip": "192.168.1.100",
@@ -504,17 +508,21 @@ HTTP 请求日志中间件自动记录每个请求的完整信息,包含请求
{ {
"level": "WARN", "level": "WARN",
"ts": "2026-02-28 15:48:01", "ts": "2026-02-28 15:48:01",
"caller": "middleware/logger.go:125",
"trace_id": "def-456-ghi-789", "trace_id": "def-456-ghi-789",
"func": "middleware.Logger", "func": "middleware.Logger",
"msg": "客户端错误", "msg": "客户端错误",
"method": "POST", "method": "POST",
"path": "/api/v1/auth/register", "path": "/api/v1/auth/register",
"handler": "controller.auth_controller.Register",
"status": 400, "status": 400,
"req_body": "{\"username\":\"a\",\"email\":\"bad\",\"password\":\"***\"}", "req_body": "{\"username\":\"a\",\"email\":\"bad\",\"password\":\"***\"}",
"resp_body": "{\"code\":400,\"message\":\"邮箱格式不正确\"}" "resp_body": "{\"code\":400,\"message\":\"邮箱格式不正确\"}"
} }
``` ```
> **关于 `caller` 和 `handler` 字段**`caller` 字段固定指向中间件源码行号(因为请求日志由中间件发出),`handler` 字段则显示实际处理请求的 Controller 函数名(如 `controller.auth_controller.Login`),通过 `handler` + `trace_id` 可快速定位到具体的业务处理代码。
### 8.7 WebSocket 日志 ### 8.7 WebSocket 日志
WebSocket 连接和消息也纳入日志追踪体系: WebSocket 连接和消息也纳入日志追踪体系: