温馨提示×

Go日志时间格式怎么调整

小樊
34
2026-08-23 16:59:30
栏目: 编程语言

在 Go 里,日志时间格式取决于你用的是哪种日志方式。下面按常见场景给你总结一下。


一、使用标准库 log(最常见)

1️⃣ 默认情况

log.Println("hello")

输出类似:

2026/01/21 10:30:00 hello

默认格式是:

2006/01/02 15:04:05

2️⃣ 自定义时间格式(推荐做法)

log 本身不能直接改时间格式,但可以通过 自定义 log.Logger + log.SetOutput 实现。

✅ 示例:自定义时间格式

package main

import (
	"log"
	"os"
	"time"
	"fmt"
)

func main() {
	logger := log.New(os.Stdout, "", 0)

	log.SetOutput(logger.Writer())
	log.SetFlags(0) // 关闭默认时间

	log.Println(formatTime(), "hello")
}

func formatTime() string {
	return time.Now().Format("2006-01-02 15:04:05.000")
}

输出:

2026-01-21 10:30:00.123 hello

关键点

  • log.SetFlags(0) 关闭默认时间
  • 自己拼时间字符串
  • Go 的时间格式必须用 2006-01-02 15:04:05

二、使用 log.SetFlags 控制时间显示

log.SetFlags(log.Ldate | log.Ltime)

常用 flag:

Flag 说明
log.Ldate 日期
log.Ltime 时间
log.Lmicroseconds 微秒
log.Lshortfile 文件名+行号
log.Llongfile 完整路径

示例:

log.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds)

输出:

2026/01/21 10:30:00.123456 hello

⚠️ 注意log 不支持自定义格式,只能组合 flag。


三、使用 log/slog(Go 1.21+ 推荐 ✅)

如果你想真正控制时间格式,强烈推荐 slog

示例:自定义时间格式

package main

import (
	"log/slog"
	"os"
	"time"
)

func main() {
	handler := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
		ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
			if a.Key == slog.TimeKey {
				t := a.Value.Time()
				a.Value = slog.StringValue(t.Format("2006-01-02 15:04:05.000"))
			}
			return a
		},
	})

	logger := slog.New(handler)
	slog.SetDefault(logger)

	slog.Info("hello")
}

输出:

time=2026-01-21 10:30:00.123 level=INFO msg=hello

优点

  • 时间格式完全可控
  • 结构化日志
  • 官方推荐

四、常见时间格式对照表

写法 含义
2006-01-02 年-月-日
15:04:05 时:分:秒
2006/01/02 15:04:05 常见日志格式
2006-01-02T15:04:05Z07:00 RFC3339
01/02 03:04:05 PM 美式时间

总结建议

场景 建议
简单程序 log.SetFlags
想改时间格式 自定义 log.Logger
正式项目 / 微服务 log/slog
高性能 / 结构化 slog + JSON

如果你愿意,可以告诉我:

  • Go 版本
  • 是否用 slog
  • 想要的时间格式(如 2026-01-21 10:30:00.000

我可以直接给你一份可直接用的日志模板

0