Debian 上 Golang 日志报错 的原因很多,不能一概而论。下面我按最常见场景给你一个排查清单,并给出典型错误示例 + 解决方法。你可以对照看看属于哪一种。
| 场景 | 典型报错 | 原因 | 解决 |
|---|---|---|---|
| 权限不足 | permission denied |
日志目录不可写 | chmod / chown |
| systemd 限制 | write /var/log/xxx: no such file or directory |
目录不存在或被 systemd 限制 | 创建目录 + 配置 LogsDirectory |
| 日志路径写死 | open /var/log/app.log: no such file or directory |
目录不存在 | mkdir -p |
使用 log 包 |
write error: broken pipe |
stdout 被关闭 | 正常,可忽略 |
| 日志库配置错误 | zap: cannot create sink |
路径或权限问题 | 检查路径 |
| 容器 / Debian | app.log: read-only file system |
容器只读 | 挂载 volume |
| 时区问题 | 日志时间不对 | 未设置 TZ |
apt install tzdata |
2026/01/15 10:00:00 open /var/log/myapp.log: permission denied
/var/log 默认 root 可写sudo mkdir -p /var/log/myapp
sudo chown -R $USER:$USER /var/log/myapp
或(推荐):
sudo chown -R myapp:myapp /var/log/myapp
open /var/log/myapp.log: no such file or directory
ProtectSystem=full 限制service 文件
[Service]
ExecStart=/usr/local/bin/myapp
LogsDirectory=myapp
systemd 会自动创建:
/var/log/myapp
log.SetOutput(os.OpenFile("/var/log/app.log", os.O_CREATE|os.O_WRONLY, 0644))
❌ 忘记处理 error
✅ 正确写法
f, err := os.OpenFile("/var/log/app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
log.Fatal(err)
}
log.SetOutput(f)
zap: cannot create sink "file:///var/log/app.log"
✅ 解决
sudo mkdir -p /var/log
sudo chown app:app /var/log
open /var/log/app.log: no such file or directory
✅ 解决
file, _ := os.OpenFile("/var/log/app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
log.SetOutput(file)
# 1. 看完整错误
journalctl -u your-service -e
# 2. 看程序运行用户
ps aux | grep your-app
# 3. 看目录权限
ls -ld /var/log
# 4. 手动运行程序看是否报错
./your-app
你可以直接贴出:
我可以直接帮你定位到具体哪一行代码或配置导致的问题。