Go标准库log包通过环境变量控制级别、SetFlags添加时间戳与文件信息、SetOutput切换输出目标,配合封装可满足多环境日志需求。

Go 标准库的 log 包足够轻量且灵活,配合环境变量或配置文件即可实现开发、测试、生产环境的日志分级输出和格式定制,无需引入重型日志框架也能满足大多数场景。
区分环境并动态设置日志级别
通过读取环境变量(如 LOG_LEVEL=debug)控制是否输出调试信息。标准 log 本身不内置级别,但可用封装实现:
- 定义日志级别常量:
const ( Debug = iota; Info; Warn; Error ) - 用
os.Getenv("LOG_LEVEL")解析后,只在当前级别 ≥ 配置级别时调用log.Print/Printf - 例如:调试环境允许
Debug级别输出,生产环境设为Error,避免敏感信息泄露
让日志带上下文和时间戳
默认 log 输出不含时间或文件信息,可通过 log.SetFlags() 启用:
-
log.SetFlags(log.LstdFlags | log.Lshortfile)—— 添加日期、时间、文件名与行号 - 若需更丰富上下文(如请求 ID、用户 ID),建议封装一个带字段的
Logger类型,用log.New()创建实例,并在每次写入前拼接前缀 - 避免在高并发中频繁字符串拼接,可考虑使用
fmt.Sprintf或预分配缓冲区
输出到不同目标:控制台、文件或系统日志
log.SetOutput() 可切换输出目标:
立即学习“go语言免费学习笔记(深入)”;
- 开发时指向
os.Stdout(默认),便于实时查看 - 生产环境重定向到文件:
os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) - Linux 上可对接
syslog(需第三方包如github.com/hashicorp/go-syslog),方便统一收集 - 注意文件日志需处理轮转,简单方案可用
lumberjack库自动切分
调试时临时启用详细日志,上线前关闭
不要靠注释/反注释日志语句管理调试开关:
- 统一用
if logger.level >= Debug { logger.Debug("...") }形式包裹调试日志 - 在
main()开头初始化日志器,根据环境变量或命令行参数(如-debug)设置初始级别 - 避免在热路径(如循环内部)调用高开销日志,尤其是含反射或 JSON 序列化的调试输出
标准库日志够用,关键在结构化控制和习惯性封装。不复杂但容易忽略细节。










