CentOS 上 Golang 日志的权限管理
一 基本原则与运行身份
二 在 Go 中创建目录与日志文件并设置权限
package main
import (
"log"
"os"
)
func main() {
const (
logDir = "/var/log/myapp"
logFile = "/var/log/myapp/app.log"
)
// 1) 创建目录(若不存在)
if err := os.MkdirAll(logDir, 0755); err != nil {
log.Fatalf("创建日志目录失败: %v", err)
}
// 2) 创建或打开日志文件(追加写,权限 0640)
f, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0640)
if err != nil {
log.Fatalf("打开日志文件失败: %v", err)
}
defer f.Close()
// 3) 可选:显式纠正属主/属组(需要更高权限,通常在部署脚本中完成)
// os.Chown(logFile, uid, gid)
logger := log.New(f, "INFO: ", log.Ldate|log.Ltime|log.Lshortfile)
logger.Println("应用启动")
}
三 使用 logrotate 进行轮转与权限收敛
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 appuser appgroup
sharedscripts
postrotate
# 可选:通知应用重新打开日志(如 systemd 无需)
systemctl reload myapp.service >/dev/null 2>&1 || true
endscript
}
sudo logrotate -d /etc/logrotate.d/myappsudo logrotate -f /etc/logrotate.d/myapp四 使用 Lumberjack 进行应用内轮转
import (
"log"
"github.com/natefinch/lumberjack"
)
logger := log.New(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 10, // MB
MaxBackups: 7, // 保留旧文件个数
MaxAge: 28, // 天
Compress: true, // 启用压缩
}, "INFO: ", log.Ldate|log.Ltime|log.Lshortfile)
五 常见权限问题排查与加固建议
ls -ld /var/log/myapp /var/log/myapp/*.logif os.IsPermission(err) { /* 提示权限不足 */ }