在 Debian 上用 Go 写程序时,“日志权限”通常包含 3 个层面:
下面按常见场景说明。
sudo mkdir -p /var/log/myapp
sudo chown -R myuser:myuser /var/log/myapp
sudo chmod 750 /var/log/myapp
不要直接写到
/var/log根目录,避免权限混乱
Go 默认受 umask 影响,不能直接设 0644 以外的权限。
✅ 推荐写法:
f, err := os.OpenFile(
"/var/log/myapp/app.log",
os.O_CREATE|os.O_WRONLY|os.O_APPEND,
0644,
)
if err != nil {
log.Fatal(err)
}
log.SetOutput(f)
如果你发现权限不对,检查 umask:
umask
# 0022 -> 文件默认 0644
# 0077 -> 文件默认 0600
sudo vim /etc/systemd/system/myapp.service
示例:
[Unit]
Description=My Go App
After=network.target
[Service]
User=myuser
Group=myuser
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/myapp
Restart=on-failure
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp
✅ 这样日志文件就属于 myuser
Debian 推荐用 logrotate
sudo vim /etc/logrotate.d/myapp
内容:
/var/log/myapp/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0644 myuser myuser
sharedscripts
postrotate
systemctl kill -s USR1 myapp.service
endscript
}
如果 Go 用
signal.Notify捕获SIGUSR1重新打开日志更好
原因:
✅ 解决:
sudo chown -R myuser:myuser /var/log/myapp
sudo chmod 0644 /var/log/myapp/app.log
或改 Go 创建权限为 0644
✅ 专用用户运行 Go 程序
✅ 专用日志目录
✅ Go 中用 0644 创建日志
✅ systemd 指定 User/Group
✅ 用 logrotate 管理
如果你愿意,可以告诉我:
我可以给你更精确的配置。