如何使用Golang log记录日志信息_输出到控制台或文件

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

  • 导入 "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)切勿直接打日志;必要时脱敏处理后再记录