CentOS 上 Golang 日志权限管理
一 核心原则与推荐做法
二 方案一 输出到标准输出并由 systemd 管理
[Unit]
Description=My Go Application
After=network.target
[Service]
Type=simple
User=myapp
Group=myapp
ExecStart=/opt/myapp/myapp
StandardOutput=journal
StandardError=journal
Restart=always
WorkingDirectory=/opt/myapp
[Install]
WantedBy=multi-user.target
sudo journalctl -u myapp -fsudo journalctl -u myapp -bsudo journalctl -u myapp --since "2025-11-25 00:00:00"三 方案二 写入文件并用 logrotate 管理权限与轮转
sudo mkdir -p /var/log/myapp
sudo chown myapp:myapp /var/log/myapp
sudo chmod 0755 /var/log/myapp
/var/log/myapp/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0640 myapp myapp
copytruncate
}
sudo logrotate -f /etc/logrotate.d/myapp。四 方案三 程序内按大小切分与权限控制
import (
"log"
"gopkg.in/natefinch/lumberjack.v2"
)
logger := log.New(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 10, // 单个文件最大 10MB
MaxBackups: 7, // 最多保留 7 个备份
MaxAge: 28, // 备份最多保留 28 天
Compress: true, // 启用压缩
}, "", log.LstdFlags)
logger.Println("hello, this is a log message")
import (
"log"
"os"
"syscall"
)
func main() {
// 目录:root:myapp 750
if err := os.MkdirAll("/var/log/myapp", 0750); err != nil {
log.Fatalf("mkdir: %v", err)
}
// 文件:myapp:myapp 640
f, err := os.OpenFile("/var/log/myapp/app.log",
os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0640)
if err != nil {
log.Fatalf("open: %v", err)
}
defer f.Close()
log.SetOutput(f)
log.Println("secure log init ok")
}
五 安全加固与常见排错