在 Go 里,日志时间格式取决于你用的是哪种日志方式。下面按常见场景给你总结一下。
log(最常见)log.Println("hello")
输出类似:
2026/01/21 10:30:00 hello
默认格式是:
2006/01/02 15:04:05
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) 关闭默认时间2006-01-02 15:04:05log.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 |
如果你愿意,可以告诉我:
slog2026-01-21 10:30:00.000)我可以直接给你一份可直接用的日志模板。