Skip to content

LoggerEntry

LoggerEntry 是带预设字段的日志记录器,传入至少一个字段时返回新的不可变 Entry。

创建

go
// 从 Logger 创建
entry := logger.WithFields(
    dd.String("service", "api"),
    dd.String("env", "prod"),
)

// 通过全局 Logger 创建
entry := dd.Default().WithFields(
    dd.String("service", "api"),
)

// 单字段快捷方式
entry := logger.WithField("request_id", "req-123")

链式调用

go
// 追加字段(返回新 Entry,原始 Entry 不变)
base := logger.WithFields(dd.String("svc", "api"))
enhanced := base.WithFields(dd.String("env", "prod"))

// 新字段覆盖同名旧字段
entry := base.WithField("svc", "gateway")  // svc 变为 "gateway"

不可变性

传入至少一个字段时,WithFields / WithField 调用返回新的 LoggerEntry,原始 Entry 不受影响,可安全并发使用。WithFields() 不传字段时属无操作优化,直接返回原 Entry。

日志方法

所有 Logger 的日志方法在 Entry 上同样可用,输出的日志自动携带预设字段:

基础日志

方法说明
Debug(args ...any)Debug 级别
Info(args ...any)Info 级别
Warn(args ...any)Warn 级别
Error(args ...any)Error 级别
Fatal(args ...any)Fatal 级别(默认调用 os.Exit(1),defer 不会执行;可通过 FatalHandler 自定义)
Log(level LogLevel, args ...any)指定级别

格式化日志

方法说明
Debugf(format string, args ...any)格式化 Debug
Infof(format string, args ...any)格式化 Info
Warnf(format string, args ...any)格式化 Warn
Errorf(format string, args ...any)格式化 Error
Fatalf(format string, args ...any)格式化 Fatal(默认调用 os.Exit(1),defer 不会执行;可通过 FatalHandler 自定义)
Logf(level LogLevel, format string, args ...any)格式化指定级别

结构化日志

方法说明
DebugWith(msg string, fields ...Field)结构化 Debug(合并预设字段)
InfoWith(msg string, fields ...Field)结构化 Info
WarnWith(msg string, fields ...Field)结构化 Warn
ErrorWith(msg string, fields ...Field)结构化 Error
FatalWith(msg string, fields ...Field)结构化 Fatal(默认调用 os.Exit(1),defer 不会执行;可通过 FatalHandler 自定义)
LogWith(level LogLevel, msg string, fields ...Field)结构化指定级别
方法说明
Print(args ...any)输出到 Writer(LevelInfo,受安全过滤)
Println(args ...any)与 Print 行为一致
Printf(format string, args ...any)格式化输出(LevelInfo,受安全过滤)

字段链

方法说明
WithFields(fields ...Field) *LoggerEntry追加字段,返回新 Entry
WithField(key string, value any) *LoggerEntry添加单个字段,返回新 Entry

使用示例

HTTP 请求日志

go
func handleRequest(w http.ResponseWriter, r *http.Request) {
    reqLog := logger.WithFields(
        dd.String("method", r.Method),
        dd.String("path", r.URL.Path),
        dd.String("remote", r.RemoteAddr),
    )

    reqLog.Info("请求开始")

    // 处理逻辑...

    reqLog.WithField("status", 200).Info("请求完成")
}

服务组件日志

go
serviceLog := logger.WithFields(
    dd.String("service", "user-service"),
    dd.String("version", "2.1.0"),
)

serviceLog.Info("服务启动")

dbLog := serviceLog.WithField("component", "database")
dbLog.Info("连接成功")
dbLog.ErrorWith("查询失败", dd.Err(err))

下一步