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)和设置日志前缀/标志。
默认就是输出到 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 := log.New(f, "", log.Ldate|log.Ltime|log.Lshortfile)
logger.Print* 调用都会写入该文件标准 log 包不直接支持多输出,但可用 io.MultiWriter 组合多个 io.Writer:
"io" 包writers := io.MultiWriter(os.Stdout, f)(f 是已打开的日志文件)log.New(writers, "[APP] ", log.LstdFlags) 创建 logger标准 log 包功能有限,无级别(info/warn/error)区分、无自动轮转。生产环境建议:
zap(高性能)、logrus(易扩展)或 slog(Go 1.21+ 内置结构化日志)log 默认是线程安全的lumberjack)或自行定时切割