在 Go 里“修改日志格式”取决于你用的是 标准库 log 还是 第三方日志库。下面按常见场景给你一个清晰对照。
log(最简单)log.Println("hello")
输出:
2026/01/15 10:00:00 hello
log.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds)
log.SetPrefix("[APP] ")
log.Println("hello")
输出:
[APP] 2026/01/15 10:00:00.123456 hello
常用 flag:
| Flag | 含义 |
|---|---|
log.Ldate |
日期 |
log.Ltime |
时间 |
log.Lmicroseconds |
微秒 |
log.Llongfile |
文件名+行号 |
log.Lshortfile |
短文件名+行号 |
✅ 缺点:格式固定,不能自定义 JSON 或复杂格式。
log.Loggertype MyLogger struct {
logger *log.Logger
}
func (l *MyLogger) Infof(format string, args ...interface{}) {
msg := fmt.Sprintf(format, args...)
l.logger.Printf("INFO %s", msg)
}
func main() {
logger := &MyLogger{
logger: log.New(os.Stdout, "", 0),
}
logger.Infof("user %s login", "tom")
}
输出:
INFO user tom login
log/slog(Go 1.21+,官方结构化日志)✅ 现代、推荐
logger := slog.New(slog.NewTextHandler(os.Stdout, nil))
logger.Info("hello", "user", "tom", "age", 18)
输出:
time=2026-01-15T10:00:00.000+0800 level=INFO msg=hello user=tom age=18
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
logger.Info("hello", "user", "tom")
输出:
{"time":"2026-01-15T10:00:00.000+0800","level":"INFO","msg":"hello","user":"tom"}
opts := &slog.HandlerOptions{
Level: slog.LevelInfo,
}
handler := slog.NewJSONHandler(os.Stdout, opts)
logger := slog.New(handler)
logrus(老牌,但已不活跃)log := logrus.New()
log.SetFormatter(&logrus.JSONFormatter{})
log.WithFields(logrus.Fields{
"user": "tom",
}).Info("login")
zap(高性能,生产推荐)logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("hello",
zap.String("user", "tom"),
)
| 场景 | 推荐 |
|---|---|
| 简单程序 | log |
| 新项目 | ✅ log/slog |
| 高性能 / 微服务 | zap |
| 老项目 | logrus |
Go 修改日志格式
- 标准库:
log.SetFlags / SetPrefix- 现代方式:
log/slog(JSON / 文本)- 高阶需求:用
zap或logrus
如果你能告诉我:
我可以直接给你一套生产级日志配置模板。