Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| dba1e3e26d | |||
|
|
829e89ce40 | ||
|
|
b233bec6a2 | ||
|
|
a7ddd08afb | ||
|
|
9a521164fc | ||
|
|
54efe7547a | ||
|
|
ced50ac491 |
88
README.md
88
README.md
@@ -1,9 +1,11 @@
|
||||
# zap_logger 日志组件库使用文档
|
||||
|
||||
## 项目概述
|
||||
|
||||
`zap_logger` 是一个基于 [Zap](https://github.com/uber-go/zap) 的日志组件库,提供灵活的多输出目标支持、可定制的日志格式和级别控制,以及与 Loki 日志系统的集成能力。该库旨在简化 Go 应用程序的日志配置流程,满足不同环境下的日志收集需求。
|
||||
|
||||
## 核心功能
|
||||
|
||||
- **多输出目标**:同时支持控制台输出、文件输出和 Loki 日志系统
|
||||
- **灵活配置**:通过 YAML 配置文件或代码选项动态调整日志行为
|
||||
- **日志轮转**:文件日志自动轮转,支持大小限制、备份数量和压缩
|
||||
@@ -12,6 +14,7 @@
|
||||
- **默认配置**:内置合理默认值,零配置快速启动
|
||||
|
||||
## 安装方法
|
||||
|
||||
```go
|
||||
go get code.mrx.ltd/pkg/zap_logger
|
||||
```
|
||||
@@ -19,6 +22,7 @@ go get code.mrx.ltd/pkg/zap_logger
|
||||
## 快速开始
|
||||
|
||||
### 默认配置
|
||||
|
||||
无需任何配置文件,直接初始化即可使用默认配置(控制台输出,Info级别,Console编码):
|
||||
|
||||
```go
|
||||
@@ -35,7 +39,6 @@ func main() {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
|
||||
// 使用全局日志器
|
||||
log.Info("这是一条info级别的日志")
|
||||
log.Error("这是一条error级别的日志")
|
||||
@@ -43,12 +46,14 @@ func main() {
|
||||
```
|
||||
|
||||
### 自定义配置文件
|
||||
|
||||
创建 YAML 配置文件(如 `logger.yaml`):
|
||||
|
||||
```yaml
|
||||
logger:
|
||||
encoder: "json" # 全局编码器 (json/console)
|
||||
level: "info" # 全局日志级别
|
||||
stack_level: panic # 全局堆栈打印级别,触发panic及以上级别日志时打印堆栈跟踪
|
||||
|
||||
file:
|
||||
enable: true # 启用文件输出,默认关闭
|
||||
@@ -84,6 +89,7 @@ if err := zap_logger.NewZapLogger("logger.yaml"); err != nil {
|
||||
## 配置说明
|
||||
|
||||
### 全局配置 (logger)
|
||||
|
||||
| 字段名 | 类型 | 说明 | 可选值 | 默认值 |
|
||||
|-------------|--------|----------|------------------------|-----------|
|
||||
| encoder | string | 全局日志编码器 | "json", "console" | "console" |
|
||||
@@ -91,6 +97,7 @@ if err := zap_logger.NewZapLogger("logger.yaml"); err != nil {
|
||||
| stack_level | string | 全局堆栈打印级别 | "warn", "error", "dpanic", "panic", "fatal" | "panic" |
|
||||
|
||||
### 文件输出配置 (file)
|
||||
|
||||
| 字段名 | 类型 | 说明 | 默认值 |
|
||||
|---------------|--------|-------------------------------|---------------------------------|
|
||||
| enable | bool | 是否启用文件输出 | false |
|
||||
@@ -104,6 +111,7 @@ if err := zap_logger.NewZapLogger("logger.yaml"); err != nil {
|
||||
| compress | bool | 是否压缩备份文件 | false |
|
||||
|
||||
### 控制台输出配置 (console)
|
||||
|
||||
| 字段名 | 类型 | 说明 | 默认值 |
|
||||
|----------|--------|-------------------------------|-------------------|
|
||||
| enable | bool | 是否启用控制台输出 | true |
|
||||
@@ -112,6 +120,7 @@ if err := zap_logger.NewZapLogger("logger.yaml"); err != nil {
|
||||
| color | bool | 是否启用彩色输出 | false |
|
||||
|
||||
### Loki输出配置 (loki)
|
||||
|
||||
| 字段名 | 类型 | 说明 | 默认值 |
|
||||
|---------------|--------|-------------------------------|---------------------------------|
|
||||
| enable | bool | 是否启用Loki输出 | false |
|
||||
@@ -125,6 +134,7 @@ if err := zap_logger.NewZapLogger("logger.yaml"); err != nil {
|
||||
| environment | string | 环境标识标签 | "" |
|
||||
|
||||
## 代码配置选项
|
||||
|
||||
除了配置文件外,还可以通过代码选项动态调整配置:
|
||||
|
||||
```go
|
||||
@@ -174,6 +184,7 @@ func main() {
|
||||
## 高级使用示例
|
||||
|
||||
### 多输出组合
|
||||
|
||||
同时启用文件和Loki输出,禁用控制台:
|
||||
|
||||
```yaml
|
||||
@@ -197,7 +208,82 @@ loki:
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. 配置优先级:代码选项 > 配置文件 > 默认配置
|
||||
2. 日志级别:如果全局级别高于输出特定级别,以全局级别为准
|
||||
3. Loki依赖:使用Loki输出时需确保Loki服务可访问
|
||||
4. 错误处理:NewZapLogger返回的错误需妥善处理,避免日志初始化失败
|
||||
|
||||
## 框架集成插件
|
||||
|
||||
### Gin 中间件集成
|
||||
|
||||
`zap_logger` 提供了 Gin 框架的日志中间件,可自动记录 HTTP 请求信息:
|
||||
|
||||
```go
|
||||
import (
|
||||
"code.mrx.ltd/pkg/zap_logger"
|
||||
"code.mrx.ltd/pkg/zap_logger/plugins"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// 初始化日志
|
||||
if err := zap_logger.NewZapLogger("logger.yaml"); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
r := gin.Default()
|
||||
// 添加Gin日志中间件
|
||||
r.Use(plugins.GinZap())
|
||||
|
||||
// 自定义日志格式示例
|
||||
customFormat := func(param plugins.LogParam) string {
|
||||
return fmt.Sprintf("[%s] %s %s %d %s",
|
||||
param.Time, param.Method, param.Path, param.StatusCode, param.Latency)
|
||||
}
|
||||
r.Use(plugins.GinZapWithFormat(customFormat))
|
||||
|
||||
r.Run()
|
||||
}
|
||||
```
|
||||
|
||||
中间件默认记录:时间、状态码、响应耗时、客户端IP、请求方法、路径和用户代理信息。
|
||||
|
||||
### GORM 日志插件
|
||||
|
||||
集成 GORM ORM 框架的日志插件,可记录 SQL 执行情况:
|
||||
|
||||
```go
|
||||
import (
|
||||
"code.mrx.ltd/pkg/zap_logger"
|
||||
"code.mrx.ltd/pkg/zap_logger/plugins"
|
||||
"gorm.io/driver/mysql"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// 初始化日志
|
||||
if err := zap_logger.NewZapLogger("logger.yaml"); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// 配置GORM使用zap_logger
|
||||
db, err := gorm.Open(mysql.Open("dsn"), &gorm.Config{
|
||||
Logger: plugins.DefaultGormLogger, // 使用默认配置
|
||||
})
|
||||
|
||||
// 自定义GORM日志配置
|
||||
customLogger := plugins.NewGormLogger(plugins.logger.Config{
|
||||
SlowThreshold: 3 * time.Second, // 慢查询阈值
|
||||
LogLevel: plugins.logger.Warn, // 日志级别
|
||||
IgnoreRecordNotFoundError: true, // 忽略记录不存在错误
|
||||
})
|
||||
|
||||
db, err = gorm.Open(mysql.Open("dsn"), &gorm.Config{
|
||||
Logger: customLogger,
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
GORM 插件默认记录:SQL 语句、执行时间、影响行数,支持慢查询告警和错误日志分级。
|
||||
20
go.mod
20
go.mod
@@ -3,6 +3,7 @@ module code.mrx.ltd/pkg/zap_logger
|
||||
go 1.25
|
||||
|
||||
require (
|
||||
github.com/gin-gonic/gin v1.11.0
|
||||
github.com/grafana/loki-client-go v0.0.0-20240913122146-e119d400c3a5
|
||||
github.com/prometheus/common v0.48.0
|
||||
go.uber.org/zap v1.27.0
|
||||
@@ -21,7 +22,6 @@ require (
|
||||
github.com/dennwc/varint v1.0.0 // indirect
|
||||
github.com/gabriel-vasile/mimetype v1.4.8 // indirect
|
||||
github.com/gin-contrib/sse v1.1.0 // indirect
|
||||
github.com/gin-gonic/gin v1.11.0 // indirect
|
||||
github.com/go-kit/kit v0.10.0 // indirect
|
||||
github.com/go-kit/log v0.2.1 // indirect
|
||||
github.com/go-logfmt/logfmt v0.5.1 // indirect
|
||||
@@ -54,24 +54,24 @@ require (
|
||||
github.com/prometheus/procfs v0.12.0 // indirect
|
||||
github.com/prometheus/prometheus v0.35.0 // indirect
|
||||
github.com/quic-go/qpack v0.5.1 // indirect
|
||||
github.com/quic-go/quic-go v0.54.0 // indirect
|
||||
github.com/quic-go/quic-go v0.54.1 // indirect
|
||||
github.com/stretchr/testify v1.11.1 // indirect
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
|
||||
github.com/ugorji/go/codec v1.3.0 // indirect
|
||||
github.com/ugorji/go/codec v1.3.1 // indirect
|
||||
go.uber.org/atomic v1.9.0 // indirect
|
||||
go.uber.org/goleak v1.3.0 // indirect
|
||||
go.uber.org/mock v0.5.0 // indirect
|
||||
go.uber.org/multierr v1.11.0 // indirect
|
||||
golang.org/x/arch v0.20.0 // indirect
|
||||
golang.org/x/crypto v0.43.0 // indirect
|
||||
golang.org/x/crypto v0.45.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect
|
||||
golang.org/x/mod v0.28.0 // indirect
|
||||
golang.org/x/net v0.46.0 // indirect
|
||||
golang.org/x/mod v0.29.0 // indirect
|
||||
golang.org/x/net v0.47.0 // indirect
|
||||
golang.org/x/oauth2 v0.27.0 // indirect
|
||||
golang.org/x/sync v0.17.0 // indirect
|
||||
golang.org/x/sys v0.37.0 // indirect
|
||||
golang.org/x/text v0.30.0 // indirect
|
||||
golang.org/x/tools v0.37.0 // indirect
|
||||
golang.org/x/sync v0.18.0 // indirect
|
||||
golang.org/x/sys v0.38.0 // indirect
|
||||
golang.org/x/text v0.31.0 // indirect
|
||||
golang.org/x/tools v0.38.0 // indirect
|
||||
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect
|
||||
google.golang.org/grpc v1.56.3 // indirect
|
||||
google.golang.org/protobuf v1.36.10 // indirect
|
||||
|
||||
40
go.sum
40
go.sum
@@ -470,6 +470,8 @@ github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/
|
||||
github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
|
||||
github.com/go-openapi/validate v0.21.0/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg=
|
||||
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
||||
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
|
||||
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
||||
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
|
||||
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
|
||||
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
|
||||
@@ -951,7 +953,6 @@ github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP
|
||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||
github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE=
|
||||
github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
|
||||
github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ=
|
||||
github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
|
||||
github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
|
||||
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
|
||||
@@ -1035,8 +1036,8 @@ github.com/prometheus/prometheus v0.35.0/go.mod h1:7HaLx5kEPKJ0GDgbODG0fZgXbQ8K/
|
||||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
|
||||
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
|
||||
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
|
||||
github.com/quic-go/quic-go v0.54.0 h1:6s1YB9QotYI6Ospeiguknbp2Znb/jZYjZLRXn9kMQBg=
|
||||
github.com/quic-go/quic-go v0.54.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQEm+l8zTY=
|
||||
github.com/quic-go/quic-go v0.54.1 h1:4ZAWm0AhCb6+hE+l5Q1NAL0iRn/ZrMwqHRGQiFwj2eg=
|
||||
github.com/quic-go/quic-go v0.54.1/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQEm+l8zTY=
|
||||
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
||||
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
||||
@@ -1132,10 +1133,9 @@ github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqri
|
||||
github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM=
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
|
||||
github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw=
|
||||
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
|
||||
github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA=
|
||||
github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4=
|
||||
github.com/ugorji/go/codec v1.3.1 h1:waO7eEiFDwidsBN6agj1vJQ4AG7lh2yqXyOXqhgQuyY=
|
||||
github.com/ugorji/go/codec v1.3.1/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4=
|
||||
github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
|
||||
@@ -1279,8 +1279,8 @@ golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5y
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20211202192323-5770296d904e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04=
|
||||
golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0=
|
||||
golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
|
||||
golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||
@@ -1321,8 +1321,8 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
|
||||
golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
|
||||
golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U=
|
||||
golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI=
|
||||
golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA=
|
||||
golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w=
|
||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
@@ -1391,8 +1391,8 @@ golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qx
|
||||
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||
golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||
golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4=
|
||||
golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210=
|
||||
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
|
||||
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
@@ -1425,8 +1425,8 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ
|
||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
|
||||
golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
|
||||
golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
|
||||
golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
|
||||
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
@@ -1553,8 +1553,8 @@ golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBc
|
||||
golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=
|
||||
golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
|
||||
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
@@ -1569,8 +1569,8 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||
golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k=
|
||||
golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM=
|
||||
golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
|
||||
golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
|
||||
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
@@ -1658,8 +1658,8 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
|
||||
golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
|
||||
golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE=
|
||||
golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w=
|
||||
golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ=
|
||||
golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
|
||||
@@ -29,13 +29,13 @@ type FormatFunc func(logParam LogParam) string
|
||||
|
||||
type Skipper func(c *gin.Context) bool
|
||||
|
||||
var defaultConfig = &Config{
|
||||
var defaultConfig = &GinLogConfig{
|
||||
TimeFormat: "2006-01-02 15:04:05.000",
|
||||
SkipPaths: nil,
|
||||
SkipPathRegexps: nil,
|
||||
DefaultLevel: zapcore.InfoLevel,
|
||||
Skipper: nil,
|
||||
formatFunc: defaultFormatFunc,
|
||||
FormatFunc: defaultFormatFunc,
|
||||
HideKeys: []string{"header"},
|
||||
}
|
||||
|
||||
@@ -67,13 +67,13 @@ var defaultFormatFunc FormatFunc = func(logParam LogParam) string {
|
||||
return builder.String()
|
||||
}
|
||||
|
||||
type Config struct {
|
||||
type GinLogConfig struct {
|
||||
TimeFormat string // custom time format default: 2006-01-02 15:04:05.000
|
||||
SkipPaths []string // skip path
|
||||
SkipPathRegexps []*regexp.Regexp
|
||||
DefaultLevel zapcore.Level
|
||||
Skipper Skipper
|
||||
formatFunc FormatFunc
|
||||
FormatFunc FormatFunc
|
||||
HideKeys []string // current only use 'header' 'errors'
|
||||
}
|
||||
|
||||
@@ -83,11 +83,11 @@ func GinZap() gin.HandlerFunc {
|
||||
|
||||
func GinZapWithFormat(formatFunc FormatFunc) gin.HandlerFunc {
|
||||
conf := defaultConfig
|
||||
conf.formatFunc = formatFunc
|
||||
conf.FormatFunc = formatFunc
|
||||
return GinZapWithConfig(conf)
|
||||
}
|
||||
|
||||
func GinZapWithConfig(conf *Config) gin.HandlerFunc {
|
||||
func GinZapWithConfig(conf *GinLogConfig) gin.HandlerFunc {
|
||||
skipPaths := make(map[string]bool, len(conf.SkipPaths))
|
||||
for _, path := range conf.SkipPaths {
|
||||
skipPaths[path] = true
|
||||
@@ -96,8 +96,8 @@ func GinZapWithConfig(conf *Config) gin.HandlerFunc {
|
||||
conf.TimeFormat = "2006-01-02 15:04:05.000"
|
||||
}
|
||||
|
||||
if conf.formatFunc == nil {
|
||||
conf.formatFunc = defaultFormatFunc
|
||||
if conf.FormatFunc == nil {
|
||||
conf.FormatFunc = defaultFormatFunc
|
||||
}
|
||||
|
||||
return func(c *gin.Context) {
|
||||
@@ -138,7 +138,7 @@ func GinZapWithConfig(conf *Config) gin.HandlerFunc {
|
||||
}
|
||||
|
||||
if !slices.Contains(conf.HideKeys, "header") {
|
||||
headerJson, _ := json.Marshal(logParam.Header)
|
||||
headerJson, _ := json.Marshal(c.Request.Header)
|
||||
logParam.Header = string(headerJson)
|
||||
}
|
||||
if !slices.Contains(conf.HideKeys, "error") {
|
||||
@@ -150,9 +150,9 @@ func GinZapWithConfig(conf *Config) gin.HandlerFunc {
|
||||
}
|
||||
|
||||
if len(c.Errors.Errors()) > 0 {
|
||||
log.Error(conf.formatFunc(logParam))
|
||||
log.Error(conf.FormatFunc(logParam))
|
||||
} else {
|
||||
log.Info(conf.formatFunc(logParam))
|
||||
log.Info(conf.FormatFunc(logParam))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user