快速开始
1. 创建日志记录器
DD 提供多种便捷构造函数,满足不同场景需求:
go
package main
import (
"log"
"github.com/cybergodev/dd"
)
func main() {
// 方式一:默认全局日志记录器(零配置)
dd.Info("使用全局日志记录器")
// 方式二:开发模式(DEBUG 级别,带 caller)
dev, err := dd.New(dd.DevelopmentConfig())
if err != nil {
log.Fatal(err)
}
defer dev.Close()
dev.Info("开发模式输出")
// 方式三:输出到文件
file, err := dd.New(dd.Config{
Targets: []dd.OutputTarget{dd.FileOutput("logs/app.log")},
})
if err != nil {
log.Fatal(err)
}
defer file.Close()
file.Info("文件输出")
// 方式四:同时输出到控制台和文件
all, err := dd.New(dd.Config{
Targets: []dd.OutputTarget{
dd.ConsoleOutput(),
dd.FileOutput("logs/app.log"),
},
})
if err != nil {
log.Fatal(err)
}
defer all.Close()
all.Info("双目标输出")
// 方式五:JSON 格式双目标输出
jsonLogger, err := dd.New(dd.Config{
Format: dd.FormatJSON,
Targets: []dd.OutputTarget{
dd.ConsoleOutput(),
dd.FileOutput("logs/app.json"),
},
})
if err != nil {
log.Fatal(err)
}
defer jsonLogger.Close()
jsonLogger.Info("JSON 格式输出")
}零值 Config 陷阱
上面方式三/四/五直接使用 dd.Config{...} 字面量,仅显式设置了 Targets/Format,其余字段保持零值:Level=Debug(不过滤)、IncludeTime=false(无时间戳)、IncludeLevel=false(无级别)、DynamicCaller=false(无调用者)、Security=nil(回退到 DefaultSecurityConfig() 基础过滤,仍开启约 36 类脱敏;如需关闭需显式 &dd.SecurityConfig{} 或 SecurityLevelDevelopment)。输出会缺失时间戳与级别等关键信息。
生产推荐:以 dd.DefaultConfig() 作为基础再修改字段,可一次性获得时间戳、级别、调用者与默认安全过滤:
go
cfg := dd.DefaultConfig() // Level=Info, Format=Text, 含时间/级别/caller/Security
cfg.Targets = []dd.OutputTarget{dd.FileOutput("logs/app.log")}
logger, err := dd.New(cfg)类似地,dd.DevelopmentConfig()(DEBUG+caller)与 dd.JSONConfig()(DEBUG+JSON+RFC3339)也是预设了完整字段集的便捷起点。
2. 日志级别
DD 支持 5 个日志级别,从低到高:
go
dd.Debug("调试信息") // LevelDebug
dd.Info("一般信息") // LevelInfo(默认)
dd.Warn("警告信息") // LevelWarn
dd.Error("错误信息") // LevelError
dd.Fatal("致命错误") // LevelFatal(调用 os.Exit)格式化版本:
go
dd.Debugf("用户 %s 登录,耗时 %dms", name, elapsed)
dd.Infof("请求处理完成:status=%d", status)
dd.Warnf("连接池使用率 %d%%", usage)
dd.Errorf("数据库查询失败: %v", err)3. 结构化日志
使用类型安全的字段构造器:
go
dd.InfoWith("请求处理完成",
dd.String("method", "GET"),
dd.String("path", "/api/users"),
dd.Int("status", 200),
dd.Duration("elapsed", 150*time.Millisecond),
)输出示例(默认文本格式):
text
[2026-04-16T21:16:48+08:00 INFO] main.go:13 请求处理完成 method=GET path=/api/users status=200 elapsed=150msJSON 格式输出
默认全局日志记录器使用文本格式。如需 JSON 格式输出,请使用 dd.New(dd.JSONConfig()) 创建 JSON 格式的日志记录器。
4. 字段链式传递
go
// 创建带预设字段的 Entry
requestLogger := dd.WithFields(
dd.String("service", "api-gateway"),
dd.String("version", "1.0.0"),
)
// 每次日志自动携带预设字段
requestLogger.Info("服务启动")
requestLogger.InfoWith("路由注册完成",
dd.Int("routes", 42),
)5. 文件轮换
通过 FileWriter 配置轮换策略:
go
// 默认 100MB, 30 天,10 个备份
fwCfg := dd.DefaultFileWriterConfig()
fwCfg.MaxBackups = 3
fwCfg.MaxSizeMB = 1
fwCfg.Compress = true
fw, err := dd.NewFileWriter("logs/app.log", fwCfg)
if err != nil {
log.Fatal(err)
}
logger, err := dd.New(dd.Config{
Level: dd.LevelInfo,
Targets: []dd.OutputTarget{dd.CustomOutput(fw)},
})
if err != nil {
log.Fatal(err)
}
defer logger.Close()
logger.Info("hello world")6. 敏感数据过滤
DD 默认启用基础敏感数据过滤(密码、API Key、信用卡号等自动脱敏):
go
// 默认配置已包含基础安全过滤
logger, err := dd.New(dd.DefaultConfig())
if err != nil {
log.Fatal(err)
}
defer logger.Close()
// 密码字段自动脱敏
logger.InfoWith("用户登录",
dd.String("username", "admin"),
dd.String("password", "s3cr3t"), // 输出:[REDACTED]
)