应使用log.setflags(log.lstdflags | log.lshortfile)同时添加时间戳和文件行号,其中log.lstdflags提供日期时间,log.lshortfile输出简洁的文件名:行号格式,该设置全局生效且影响所有log.print*调用。

log.SetFlags 怎么加时间戳和文件行号
Go 标准库 log 默认只输出内容,不带任何上下文——这意味着你看到 log.Println("started") 时,根本不知道它发生在哪一秒、哪个文件哪一行。必须显式调用 log.SetFlags() 才能补上这些关键信息。
常见组合有:
-
log.LstdFlags:等价于log.Ldate | log.Ltime,输出形如2026/07/22 18:31:45 -
log.Lshortfile:显示main.go:42这样的短路径(推荐,避免日志被长路径撑爆) -
log.Lmicroseconds:替换Ltime,精确到微秒(调试高并发时有用)
多个标志用 | 拼接,例如:log.SetFlags(log.LstdFlags | log.Lshortfile)。注意:这个设置全局生效,会影响所有 log.Print* 调用,包括第三方库(如果它们也用默认 logger)。
log.SetPrefix 为什么加了却没空格
log.SetPrefix() 只是往每条日志开头硬塞字符串,不做任何格式处理。写成 log.SetPrefix("[API]"),输出就是 [API]request received——没有冒号、没有空格、没有换行。
正确做法是把分隔符写进前缀里:
-
log.SetPrefix("[API] ")(末尾带空格) -
log.SetPrefix("[INFO] - ")(带连接符) - 如果用
log.New()创建独立实例,需在构造时传入 prefix,或调用该实例的SetPrefix()
别指望它自动对齐或美化;它就是个纯字符串前置器。
怎么同时输出到终端和文件
本地调试需要实时看输出,又想保留完整记录,io.MultiWriter 是最轻量解法,不用自己写缓冲或 goroutine。
典型步骤:
- 打开日志文件:
f, _ := os.OpenFile("debug.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) - 组合输出目标:
log.SetOutput(io.MultiWriter(os.Stdout, f)) - 程序退出前必须
f.Close(),否则最后一段日志可能卡在缓冲区没刷盘
容易漏掉的点:忘记设文件权限(Linux/macOS 下 0644 是安全底线),或用 O_TRUNC 覆盖旧日志时没做清理逻辑。
自定义时间格式为什么 SetFlags 不管用
log.SetFlags() 只支持预设格式:Ldate(2006/01/02)、Ltime(15:04:05)、Lmicroseconds。它**不接受模板字符串**,所以 "2006-01-02T15:04:05Z07:00" 这类 RFC3339 格式无法通过 flag 实现。
真要定制,唯一办法是替换 Output:
- 创建新 logger:
logger := log.New(os.Stdout, "", 0)(flags 设为 0,禁用默认时间) - 实现
io.Writer,在Write([]byte)里手动拼接time.Now().Format("2006-01-02 15:04:05") + " " + data - 然后
logger.SetOutput(yourWriter)
别用 fmt.Printf 拼时间凑合——它绕过 log 的线程安全和输出重定向能力,一上生产就出问题。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











