Go标准库log包默认输出到stderr,可通过log.New指定os.Stdout或*os.File实现控制台或文件输出,支持io.MultiWriter同时写入多目标,但无日志级别和轮转功能,生产环境建议用zap、logrus或slog。

Go 标准库的 log 包轻量、易用,适合基础日志需求。它默认输出到标准错误(stderr),但可通过配置写入控制台(如 os.Stdout)或文件(如 os.File)。关键在于替换默认的 *log.Logger 输出目标(io.Writer)和设置日志前缀/标志。
输出到控制台(stdout 或 stderr)
默认就是输出到 stderr,若想改到 stdout,只需在初始化 logger 时传入 os.Stdout:
- 使用
log.New(os.Stdout, "[INFO] ", log.LstdFlags)创建自定义 logger,前缀为[INFO],带时间戳 - 调用
logger.Println("服务启动")或logger.Printf("用户 %s 登录", name) - 注意:直接用
log.Println()等顶层函数,仍走默认 logger(输出到 stderr),需显式创建新 logger 才能切到 stdout
输出到文件
核心是把打开的文件句柄(*os.File)作为 io.Writer 传给 log.New():
- 用
f, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)打开日志文件(追加模式) - 检查
err,确保文件可写;程序退出前用defer f.Close() - 创建 logger:
logger := log.New(f, "", log.Ldate|log.Ltime|log.Lshortfile) - 后续所有
logger.Print*调用都会写入该文件
同时输出到控制台和文件(多目标)
标准 log 包不直接支持多输出,但可用 io.MultiWriter 组合多个 io.Writer:
立即学习“go语言免费学习笔记(深入)”;
- 导入
"io"包 - 构造 writer:
writers := io.MultiWriter(os.Stdout, f)(f是已打开的日志文件) - 用
log.New(writers, "[APP] ", log.LstdFlags)创建 logger - 每条日志会同时打印到终端和写入文件,适合开发调试阶段
实用建议与注意事项
标准 log 包功能有限,无级别(info/warn/error)区分、无自动轮转。生产环境建议:
- 简单项目够用;复杂场景推荐
zap(高性能)、logrus(易扩展)或slog(Go 1.21+ 内置结构化日志) - 避免在 goroutine 中复用未同步的 logger;如需并发安全,标准
log默认是线程安全的 - 日志文件长期运行需考虑轮转——可配合第三方库(如
lumberjack)或自行定时切割 - 敏感信息(密码、token)切勿直接打日志;必要时脱敏处理后再记录










