
日常调试用log.Println结构化日志必须用log.Printf需时间戳和行号则设log.SetFlags(log.LstdFlags | log.Lshortfile)写文件要用os.OpenFile并检查err分级和上下文需换zap/slog。log.Println 和 log.Printf 到底该用哪个直接结论日常调试用 log.Println结构化/可读性要求高的日志必须用 log.Printf。log.Println 会自动在参数间加空格、末尾加换行适合快速打点但一旦涉及变量拼接比如 log.Println(user:, user)结构体或 map 会输出内存地址不是你想要的字段值。log.Printf 支持格式化能精准控制输出内容和对齐且不自动换行——漏写 会导致多条日志挤在同一行这是线上排查时最常被忽略的细节之一。想打印用户 ID 和名字用 log.Printf(user id%d name%s, u.ID, u.Name)别用 log.Println(user id, u.ID, name, u.Name)错误日志建议统一用 %v log.Printf(failed to parse config: %v, err)避免手动调 err.Error()如果只是临时看一眼log.Println 省事但只要日志要留存、要搜索、要进 ELK一律上 log.Printf如何让每条日志带时间戳和文件行号标准库默认不带这些信息必须显式启用——靠 log.SetFlags不是靠“猜”或“重装包”。立即学习“go语言免费学习笔记深入”log.LstdFlags 包含日期 时间精确到秒log.Lshortfile 输出 main.go:42 这种紧凑格式。两者组合最常用也最实用。 AI Code Reviewer AI自动审核代码