GoLand自动构建不输出日志,仅捕获程序写入os.Stdout/Stderr的内容;必须勾选“在输出控制台中模拟终端”,且log.SetOutput等配置须置于main()首行,否则日志丢失或渲染异常。

GoLand 自动构建本身不输出应用日志,它只负责编译和启动程序;你看到的“日志”其实是你的 Go 程序运行后写到 os.Stdout 或 os.Stderr 的内容,GoLand 只是把标准输出流捕获并显示在 Run 工具窗口里。
GoLand 运行配置中必须启用“在输出控制台中模拟终端”
这是最常被忽略的前提。默认新建的 Go 构建配置可能没勾选此项,导致日志不实时刷出、换行异常,甚至部分输出被截断。
- 打开 Run | Edit Configurations…(或按
Alt Shift F10→0 0) - 选中你的 Go 构建配置,在右侧勾选 在输出控制台中模拟终端
- 不勾选时,GoLand 用纯文本流处理输出,会丢失 ANSI 颜色、缓冲行为异常,
log.Printf或slog.Debug的多行日志可能粘连 - 该选项不影响日志内容本身,只影响控制台渲染逻辑和 I/O 缓冲策略
log.SetOutput 必须在 main() 开头调用,否则部分日志会消失
Go 标准库的 log 包是全局单例,一旦有日志打出(比如某包 init 函数里调了 log.Println),再调 log.SetOutput 就晚了——那些日志已写进 os.Stderr,GoLand 捕获不到你重定向后的目标。
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
- 所有
log.SetOutput、log.SetFlags、log.SetPrefix必须放在main()第一行,早于任何其他包初始化或业务逻辑 - 错误示范:
func init() { log.SetOutput(...) }—— init 执行顺序不可控,且可能被其他包抢先输出 - 正确写法:
func main() { log.SetOutput(os.Stdout) log.SetFlags(log.LstdFlags | log.Lshortfile) // 后续所有 log.Print* 都会走 stdout,并带时间戳+文件行号 }
GoLand 服务工具窗口里看 Docker 容器日志,不是看本地进程日志
如果你在 GoLand 里跑的是 Docker 容器(比如用 docker-compose up 或 Docker 插件启动),那 Services 工具窗口(Alt 0 8)里显示的日志,是容器 stdout/stderr 流,和本地 Go 进程日志无关。这两者完全隔离。
- 确认你在看哪个视图:Run 工具窗口 → 本地 Go 程序输出;Services 工具窗口 → Docker 容器日志
- Docker 日志依赖 Docker 插件启用,路径:
Ctrl Alt 0 S→ Plugins → 确保Docker插件已勾选 - 容器日志默认不折叠,但可勾选 在日志控制台中折叠之前的会话(Settings → Tools → Docker → Container logs)来只留最新一轮
- 如果容器日志空白,检查容器是否真在运行:
docker ps,以及容器内程序是否真的往 stdout 写了日志(不是只写文件)
真正容易被绕晕的点是:你以为在调试 Go 程序日志,结果其实在看容器日志;或者你改了 log.SetOutput 却发现控制台没变化——八成是没勾选“模拟终端”,或者 SetOutput 调得太晚,第一条日志已经漏掉了。










