CentOS 上 Golang 日志权限管理实践
一 基本原则与运行身份
二 在 Go 中创建目录与日志文件并设置权限
package main
import (
"log"
"os"
)
func main() {
const (
logDir = "/var/log/myapp"
logFile = "/var/log/myapp/app.log"
)
// 1) 创建日志目录(0755)
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) 可选:显式收紧权限(例如仅属主可读写)
if err := os.Chmod(logFile, 0600); err != nil {
log.Printf("收紧日志文件权限失败: %v", err)
}
// 4) 使用标准库或结构化日志库输出
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 golang-app adm
sharedscripts
postrotate
# 可选:通知应用重新打开日志(如支持 SIGHUP)
systemctl reload myapp.service >/dev/null 2>&1 || true
endscript
}
sudo logrotate -d /etc/logrotate.d/myappsudo logrotate -f /etc/logrotate.d/myapp四 安全加固与运维建议
五 常见问题排查