在 CentOS 上使用 Golang 时日志报错,原因可能有很多种。下面我按常见场景和典型错误给你梳理一下,并给出排查思路。你可以对照自己的情况来看。
典型日志:
permission denied
open /var/log/xxx.log: permission denied
原因:
nobody、www、centos)没有写日志目录权限排查:
ls -ld /var/log/yourdir
whoami
解决:
chown -R youruser:yourgroup /var/log/yourdir
chmod 755 /var/log/yourdir
如启用 SELinux:
setenforce 0 # 临时
# 或
semanage fcontext -a -t var_log_t "/var/log/yourdir(/.*)?"
restorecon -Rv /var/log/yourdir
典型日志:
open log/app.log: no such file or directory
原因:
systemd 启动解决:
logFile, _ := os.OpenFile("/opt/myapp/log/app.log", ...)
或指定 systemd 工作目录:
[Service]
WorkingDirectory=/opt/myapp
典型现象:
journalctl 看不到原因:
排查:
journalctl -u yourservice -f
建议:
log.SetOutput(os.Stdout)典型日志:
时间比实际慢 8 小时
原因: CentOS 默认可能是 UTC
解决:
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
Go 中:
time.Local = time.UTC // 或显式设置
典型日志:
symbol lookup error
version `GLIBC_2.xx' not found
原因:
解决:
CGO_ENABLED=0 go build
如 logrus / zap / zerolog:
| 库 | 常见错误 |
|---|---|
| logrus | hook 写失败 |
| zap | 文件 rotate 配置错误 |
| lumberjack | 权限 / 磁盘满 |
建议:
os.Stdout 排除日志库问题# 1. 看错误原文
journalctl -u yourservice -n 100
# 2. 看权限
ls -l 日志路径
# 3. 看 SELinux
getenforce
ausearch -m avc -ts recent
# 4. 看磁盘
df -h
# 5. 看运行用户
ps -ef | grep yourapp
你可以补充:
我可以直接帮你定位到具体原因和改法。