温馨提示×

golang linux日志为何报错

小樊
45
2026-10-02 14:09:57
栏目: 编程语言

“Golang 在 Linux 下日志报错”这个现象本身比较宽泛,我先从常见原因 + 典型报错示例 + 排查方法几个角度给你梳理一下,你可以对照看看属于哪一类。


一、最常见的原因分类

1️⃣ 日志文件权限不足(非常常见)

报错示例

open /var/log/app.log: permission denied

原因

  • 程序以普通用户运行,但日志目录属于 root
  • 容器里以非 root 用户运行

解决

# 查看权限
ls -ld /var/log

# 修改目录权限或属主
sudo chown -R appuser:appuser /var/log

2️⃣ 日志目录不存在

报错示例

open /data/logs/app.log: no such file or directory

原因

  • 代码直接写文件,但没创建目录

解决

os.MkdirAll("/data/logs", 0755)

3️⃣ 磁盘满了

报错示例

write /var/log/app.log: no space left on device

排查

df -h

解决

  • 清理日志
  • 配置日志轮转(logrotate)

4️⃣ 文件被删除但进程仍持有

现象

  • 日志不更新
  • 或报错 bad file descriptor

原因

  • rm 了日志文件,但程序没重启

解决

# 查看被删除但仍打开的文件
lsof | grep deleted

重启进程或重新打开日志文件。


5️⃣ 使用 logrotate 后没发信号

现象

  • 日志轮转后程序继续写旧文件

解决(示例)

/var/log/app.log {
    daily
    rotate 7
    missingok
    notifempty
    postrotate
        kill -USR1 $(cat /var/run/app.pid)
    endscript
}

6️⃣ Go 并发写日志未加锁

报错示例

concurrent write to log

原因

  • 多个 goroutine 直接写 os.File

解决

  • 使用 log.Logger
  • 或使用 zap / logrus

7️⃣ 容器环境常见问题

  • stdout 被 Docker 接管
  • 写文件但挂载路径不存在

建议

  • 开发/测试:直接打到 stdout
  • 生产:stdout + 日志采集(filebeat / loki)

二、快速自查清单 ✅

# 1. 权限
ls -l 日志路径

# 2. 磁盘
df -h

# 3. 文件是否被删
lsof | grep deleted

# 4. 进程用户
ps -ef | grep 你的程序

三、如果你能贴具体报错,我可以精准定位

你可以直接把:

  • 完整报错信息
  • Go 写日志的代码片段
  • 运行环境(物理机 / Docker / K8s)

发出来,我可以直接帮你改代码或给配置。

0 踩