Documentation
¶
Overview ¶
Package ginx 提供独立 Gin Engine、请求日志和 Recovery。
以下示例需导入 github.com/gin-gonic/gin 和 github.com/bpcoder16/pixiu/infra/ginx:
router, err := ginx.New(ginx.Config{
TrustedProxies: []string{"127.0.0.1"},
LogRequestInfo: true,
LogResponseInfo: true,
})
if err != nil {
return err
}
router.POST("/items", func(c *gin.Context) {
// 使用 c.Request.Context() 传递日志与取消;绑定错误由业务映射响应。
c.Status(204)
})
// router 实现 http.Handler,交给应用选用的 HTTP 服务端。
New 不修改 Gin 全局模式或 Validator,不自动注册管理端点。 默认开启 ContextWithFallback,兼容直接传 c 时透传请求的取消、deadline 与日志上下文。 业务仍推荐使用 c.Request.Context(),不要将可复用的 *gin.Context 交给后台任务。 默认关闭自动重定向,尾斜杠不匹配按 404 处理;默认 404/405 在结果采集前写出完整正文。 需要可观测的重定向时可在显式路由中调用 c.Redirect。 自行重新开启 Gin 自动重定向会绕过内置中间件,不产生访问日志、Observe 或日志 ID 响应头。 通过 TraceHeader(PIXIU-Log-Id)接收并回写日志 ID;非空值原样使用,缺失或为空时生成。 访问日志统一使用 logit.InfoDuration,不随状态码改变 Info 级别。 LogRequestInfo、LogResponseInfo 默认关闭,分别追加 request_info、response_info 详情; DisableAccessLog 为 true 时两者均不生效,Observe 回调和独立 panic 错误日志不受影响。 进入观察中间件时请求 Logger 未启用 Info,本次访问日志及详情采集均关闭,中途开启不补记。 入口允许记录时,输出仍遵循请求结束时 Logger 的 Info 级别过滤。 请求详情包含 method、Header、body;响应详情包含 Header、body。 正文不截断、不脱敏;UTF-8 文本直接记录,二进制以 Base64 记录并标明 body_encoding。 请求正文在业务中间件之前完整预读并还原,读取失败会记录 body_error 并向业务保留原错误。 响应正文随写出复制,保留 Flush;Header 记录应用提交的快照,不承诺包含传输层自动添加的值。 开启详情会保存完整正文;请求体大小与读取期限由应用约束。
可在启动阶段显式登记忽略访问日志、两侧详情采集及 Observe 的路由,示例还需导入 net/http:
ginx.RegisterIgnoredRoute(&router.RouterGroup, http.MethodGet, "/assets/app.js", func(c *gin.Context) {
c.Data(http.StatusOK, "application/javascript; charset=utf-8", []byte("console.log('ready');"))
})
匹配沿用 Gin 的方法、路由模板和组前缀,仅影响本次登记的路由;不按后缀或响应状态推断。 请求日志作用域、原组和业务中间件、Recovery 及独立 panic 日志仍执行;未匹配的 404/405 仍正常观察。 不增加配置文件字段;与其他 Gin 路由一样,服务开始处理请求后不再注册。
直接使用本包时,OpenAPI 文档与 Stoplight Elements 由调用方显式注册,New 不自动启用;先 blank import 应用生成的文档包:
if err := ginx.RegisterOpenAPI(&router.RouterGroup); err != nil {
return err
}
不传模块时,根路由组提供 /docs,页面读取默认实例的 /openapi/doc.json。 需要多个模块时,传入命名文档(由 swag init --instanceName 生成):
if err := ginx.RegisterOpenAPI(&router.RouterGroup,
ginx.OpenAPIModule{Name: "app", Title: "App"},
ginx.OpenAPIModule{Name: "admin", Title: "Admin"},
); err != nil {
return err
}
模块模式提供 /openapi/<Name>.json、/docs/<Name> 和顶部切换导航,/docs 展示首个模块。 模块名非空且只允许 ASCII 字母、数字、下划线和连字符,名称重复时返回错误。 Title 为空时使用 Name;页面文字和链接均按 HTML 转义。 Elements 资源及加载脚本位于 /docs/assets/ 下的 web-components.min.js、styles.min.css 和 openapi.js。 不注册旧 /elements 路径,也不提供重定向。 Elements 使用 hash 导航,刷新详情页不需要服务端路径回退。 也可传 router.Group("/internal"),文档与资源 URL 随组前缀调整;组中间件负责访问控制。 全部模块通过校验且读取成功后才注册路由,文档缺失时返回错误且不添加路由;生成物须由应用自行维护。 文档内容在注册路由时固定,应用须在此之前完成文档元信息设置。 页面按浏览器获取文档的地址补齐 Swagger 2.0 缺省的 host/schemes,保留 basePath 与显式配置; 页面还将 Swagger 2.0 的 formData/file 参数适配为 string/binary,启用文件选择控件; 覆盖操作级、路径级及根级公共参数定义,保留 consumes、必填标记和文档内引用。 上传接口继续使用 @Accept mpfd 和 @Param file formData file true "上传文件"。 JSON 端点仍返回原始文档,补齐及文件适配仅影响页面内的副本;OpenAPI 3 保持原样,外部引用文件不做适配。 Elements 的静态资源均内嵌,不依赖运行时 CDN。 Elements 沿用上游默认认证持久化,会在浏览器 localStorage 保存并恢复认证输入。 Swagger 2.0 的 Authorization apiKey 方案可用扩展 x-pixiu-bearer: true(也接受字符串 "true")启用前缀补齐。 Swag 对应注释为 @x-pixiu-bearer true;仅影响本项目 Elements 的调试请求与代码示例。 输入纯 Token 或完整 Bearer Header 均可,空输入不发送 Authorization;其他 API Key 保持原样。 RegisterOpenAPI 主动将全部文档 GET 路由登记为忽略访问日志、详情及 Observe。 包括页面、首页别名、JSON 端点和内嵌静态资源;保留请求作用域、组中间件及 Recovery。
Index ¶
Constants ¶
const TraceHeader = "PIXIU-Log-Id"
Variables ¶
This section is empty.
Functions ¶
func RegisterIgnoredRoute ¶
func RegisterIgnoredRoute(group *gin.RouterGroup, method, relativePath string, handlers ...gin.HandlerFunc)
RegisterIgnoredRoute 在启动阶段登记跳过 ginx 访问日志、两侧详情采集及 Observe 的路由。 method、relativePath 和 handlers 沿用 Gin Handle 的约定,路径随 group 前缀调整。 请求日志作用域、原组和业务中间件、Recovery 及独立 panic 日志仍保留。 仅影响本次登记的路由,不按后缀或响应状态推断;服务开始处理请求后不再注册。
func RegisterOpenAPI ¶
func RegisterOpenAPI(r *gin.RouterGroup, modules ...OpenAPIModule) error
RegisterOpenAPI 注册 Swag 文档与 Elements 页面。 未传 modules 时提供默认文档的 /openapi/doc.json 和 /docs。 传入模块时提供 /openapi/<Name>.json、/docs/<Name> 和模块导航,/docs 展示首个模块。 页面与静态资源均位于 /docs 下,不注册 /elements 或重定向。 全部文档 GET 路由主动登记为忽略访问日志、详情采集及 Observe,仍保留 Recovery。 调用方须先通过 blank import 注册全部文档;校验或读取失败时不添加任何路由。 本函数只在启动阶段调用,不读取配置,也不自动增加认证;访问控制由调用方的路由组负责。
Types ¶
type Config ¶
type Config struct {
// TrustedProxies 指定可信代理的 IP 或 CIDR;为空时不信任任何代理。
TrustedProxies []string
// LoggerName 指定请求使用的命名 Logger;为空时沿用请求 context 的 Logger 路由。
LoggerName string
// DisableAccessLog 关闭 HTTP 访问日志,不影响 Observe 回调或 panic 错误日志。
DisableAccessLog bool
// LogRequestInfo 在访问日志中记录请求 method、Header 和 body,默认关闭。
// 开启后完整预读并还原 body,不截断或脱敏;DisableAccessLog 为 true 时不生效。
// 进入观察中间件时请求 Logger 未启用 Info 则跳过采集,后续开启也不补采。
LogRequestInfo bool
// LogResponseInfo 在访问日志中记录响应 Header 和 body,默认关闭。
// 开启后随写出复制 body,不截断或脱敏;DisableAccessLog 为 true 时不生效。
// 进入观察中间件时请求 Logger 未启用 Info 则跳过采集,后续开启也不补采。
LogResponseInfo bool
// Middlewares 在内置请求作用域、结果观察和 Recovery 之后按顺序注册;元素不能为 nil。
Middlewares []gin.HandlerFunc
// Observe 在请求处理结束时同步接收结果;为 nil 时不调用。
// RegisterIgnoredRoute 登记的路由和成功 Hijack 的请求跳过观察。
// 回调须并发安全并快速完成;回调 panic 会被恢复并记录错误日志。
Observe func(context.Context, RequestResult)
}
Config 只配置当前 Engine;回调须并发安全并快速完成。
type OpenAPIModule ¶
OpenAPIModule 声明一份命名 Swag 文档;Name 同时用作文档实例名和 URL 中的模块名。 Name 只允许 ASCII 字母、数字、下划线和连字符;Title 为空时使用 Name。
type RequestResult ¶
type RequestResult struct {
// Method 是 HTTP 请求方法,如 GET、POST。
Method string
// Route 是匹配的路由模板,如 /items/:id;未匹配时为 unmatched。
Route string
// Status 是 Gin Writer 记录的 HTTP 状态码;因 http.ErrAbortHandler 中断且未写出响应时为 0。
Status int
// Bytes 是已写入的响应体字节数,不含响应头;未写入时为 0。
Bytes int
// ClientIP 是 Gin 根据连接对端和可信代理等配置解析的客户端 IP。
ClientIP string
// Duration 是从进入结果观察中间件到采集结果时的耗时,不含后续日志和 Observe 回调。
Duration time.Duration
// Panicked 表示内置 Recovery 捕获了普通 panic,不含 http.ErrAbortHandler。
Panicked bool
// Aborted 表示捕获到 http.ErrAbortHandler;普通 c.Abort() 不会设置此标记。
Aborted bool
}
RequestResult 提供一次普通 HTTP 请求的结果,Route 使用模板或 unmatched。