centos

CentOS上Golang日志的权限管理

小樊
38
2025-12-07 17:52:18
栏目: 编程语言

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
}

四 使用 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)

五 常见权限问题排查与加固建议

0
看了该问题的人还看了