日志支持不展示调用链

This commit is contained in:
2025-11-16 15:53:07 +08:00
parent 2aabbfd8b9
commit bf747e22ce
4 changed files with 26 additions and 15 deletions

View File

@@ -19,6 +19,7 @@ log:
max_backups: 7 # 最多保留的旧日志文件数量
max_age: 7 # 最多保留的旧日志文件天数
compress: true # 是否压缩旧日志文件
enable_trace: false # 是否启用调用链追踪
# 数据库配置
database:

View File

@@ -20,6 +20,7 @@ log:
max_backups: 5 # 保留的旧日志文件的最大数量
max_age: 30 # 保留的旧日志文件的最大天数
compress: false # 是否压缩/归档旧日志文件
enable_trace: false # 是否启用调用链追踪
# 数据库配置 (PostgreSQL)
database:

View File

@@ -77,6 +77,7 @@ type LogConfig struct {
MaxBackups int `yaml:"max_backups"`
MaxAge int `yaml:"max_age"`
Compress bool `yaml:"compress"`
EnableTrace bool `yaml:"enable_trace"`
}
// DatabaseConfig 代表数据库配置

View File

@@ -34,6 +34,7 @@ const (
var (
defaultLogger *Logger
logConfig config.LogConfig
once sync.Once
)
@@ -73,19 +74,25 @@ func NewLogger(cfg config.LogConfig) *Logger {
// 此函数应在应用程序启动时调用一次。
func InitDefaultLogger(cfg config.LogConfig) {
once.Do(func() {
logConfig = cfg
defaultLogger = NewLogger(cfg)
})
}
// GetLogger 从 Context 中提取调用链信息,并返回一个携带这些信息的 Logger 副本。
// 如果 Context 中没有调用链信息,则直接返回默认的 Logger。
// 如果 Context 中没有调用链信息,或配置禁用了调用链,则直接返回默认的 Logger。
func GetLogger(ctx context.Context) *Logger {
if defaultLogger == nil {
// 在调用 InitDefaultLogger 之前,提供一个备用的、仅输出到控制台的 Logger
fallbackCfg := config.LogConfig{Level: "info", Format: "console"}
fallbackCfg := config.LogConfig{Level: "info", Format: "console", EnableTrace: true}
return NewLogger(fallbackCfg)
}
// 如果禁用了调用链追踪,则直接返回默认 logger
if !logConfig.EnableTrace {
return defaultLogger
}
val := ctx.Value(chainKey)
if val == nil {
return defaultLogger
@@ -211,11 +218,13 @@ func (g *GormLogger) Trace(ctx context.Context, begin time.Time, fc func() (sql
"elapsed", fmt.Sprintf("%.3fms", float32(elapsed.Nanoseconds())/1e6),
}
// 附加调用链信息
// 仅在启用调用链时附加信息
if logConfig.EnableTrace {
chain := GetTraceStr(ctx)
if chain != "" {
fields = append(fields, traceKey, chain)
}
}
if err != nil {
// 如果是 "record not found" 错误且我们配置了跳过,则直接返回
@@ -235,7 +244,6 @@ func (g *GormLogger) Trace(ctx context.Context, begin time.Time, fc func() (sql
// 正常情况,记录 Debug 级别的 SQL 查询
defaultLogger.With(fields...).Debugf("[GORM] trace")
// --- 逻辑修复结束 ---
}
// NewSilentLogger 创建一个不输出任何日志的 Logger 实例, 用于测试中屏蔽日志