light 6 ヶ月 前
コミット
7e2240a532
3 ファイル変更51 行追加35 行削除
  1. 7 1
      go.mod
  2. 8 0
      go.sum
  3. 36 34
      utils/logger.go

+ 7 - 1
go.mod

@@ -1,6 +1,8 @@
 module go-policy-service
 
-go 1.19
+go 1.21
+
+toolchain go1.21.13
 
 require (
 	github.com/caarlos0/env/v9 v9.0.0
@@ -15,7 +17,9 @@ require (
 	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
 	github.com/golang/snappy v0.0.4 // indirect
 	github.com/klauspost/compress v1.16.7 // indirect
+	github.com/lestrrat-go/strftime v1.1.0 // indirect
 	github.com/montanaflynn/stats v0.7.1 // indirect
+	github.com/pkg/errors v0.9.1 // indirect
 	github.com/stretchr/testify v1.10.0 // indirect
 	github.com/xdg-go/pbkdf2 v1.0.0 // indirect
 	github.com/xdg-go/scram v1.1.2 // indirect
@@ -31,7 +35,9 @@ require (
 	github.com/go-sql-driver/mysql v1.7.0 // indirect
 	github.com/jinzhu/inflection v1.0.0 // indirect
 	github.com/jinzhu/now v1.1.5 // indirect
+	github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible
 	github.com/natefinch/lumberjack v2.0.0+incompatible
+	github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5
 	go.mongodb.org/mongo-driver v1.17.3
 	golang.org/x/sys v0.30.0 // indirect
 	golang.org/x/text v0.22.0 // indirect

+ 8 - 0
go.sum

@@ -23,6 +23,10 @@ github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
 github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
 github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I=
 github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
+github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible h1:Y6sqxHMyB1D2YSzWkLibYKgg+SwmyFU9dF2hn6MdTj4=
+github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible/go.mod h1:ZQnN8lSECaebrkQytbHj4xNgtg8CR7RYXnPok8e0EHA=
+github.com/lestrrat-go/strftime v1.1.0 h1:gMESpZy44/4pXLO/m+sL0yBd1W6LjgjrrD4a68Gapyg=
+github.com/lestrrat-go/strftime v1.1.0/go.mod h1:uzeIB52CeUJenCo1syghlugshMysrqUT51HlxphXVeI=
 github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE=
 github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
 github.com/natefinch/lumberjack v2.0.0+incompatible h1:4QJd3OLAMgj7ph+yZTuX13Ld4UpgHp07nNdFX7mqFfM=
@@ -30,8 +34,12 @@ github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6Yf
 github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
 github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
 github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 h1:mZHayPoR0lNmnHyvtYjDeq0zlVHn9K/ZXoy17ylucdo=
+github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5/go.mod h1:GEXHk5HgEKCvEIIrSpFI3ozzG5xOKA2DVlEX/gGnewM=
 github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
 github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=

+ 36 - 34
utils/logger.go

@@ -1,6 +1,7 @@
 package utils
 
 import (
+	"io"
 	"os"
 	"path/filepath"
 	"strings"
@@ -15,55 +16,56 @@ var Logger *logrus.Logger
 func InitLogger(logDir string, levelConf string) {
 	Logger = logrus.New()
 
-	// 获取项目根目录路径
-	projectRoot, err := os.Getwd()
+	// --- 目录准备(和之前一样) ---
+	cwd, err := os.Getwd()
 	if err != nil {
 		panic(err)
 	}
-
-	// 组合日志目录路径
-	logPath := filepath.Join(projectRoot, logDir)
-
-	// 确保日志目录存在
-	if err := os.MkdirAll(logPath, 0755); err != nil {
+	fullLogDir := filepath.Join(cwd, logDir)
+	if err := os.MkdirAll(fullLogDir, 0755); err != nil {
 		panic(err)
 	}
 
+	// --- 滚动文件 + stdout ---
 	currentDate := time.Now().Format("20060102")
-	logFile := filepath.Join(logPath, "policy-service-"+currentDate+".log")
-
-	// 配置日志切割
-	lumberjackLogger := &lumberjack.Logger{
-		Filename:   logFile,
-		MaxSize:    100,  // 每个日志文件最大100MB
-		MaxBackups: 30,   // 保留30个旧日志文件
-		MaxAge:     30,   // 保留30天
-		Compress:   true, // 压缩旧日志
-		LocalTime:  true, // 使用本地时间切割
+	fileWriter := &lumberjack.Logger{
+		Filename:   filepath.Join(fullLogDir, "policy-service-"+currentDate+".log"),
+		MaxSize:    100,
+		MaxBackups: 30,
+		MaxAge:     30,
+		Compress:   true,
+		LocalTime:  true,
 	}
+	mw := io.MultiWriter(fileWriter, os.Stdout)
+	Logger.SetOutput(mw)
+	Logger.SetFormatter(&logrus.JSONFormatter{
+		TimestampFormat: time.RFC3339,
+	})
 
-	Logger.SetOutput(lumberjackLogger)
-	Logger.SetFormatter(&logrus.JSONFormatter{})
-
-	// 从环境变量获取日志级别,默认为info
+	// --- 解析环境变量里的多个级别 ---
 	if levelConf == "" {
 		levelConf = "info"
 	}
-
-	// 分割多个级别
 	levelStrs := strings.Split(levelConf, ",")
-	var levels []logrus.Level
-	for _, lvlStr := range levelStrs {
-		level, err := logrus.ParseLevel(strings.TrimSpace(lvlStr))
-		if err != nil {
-			Logger.Warnf("无效的日志级别%s,跳过", lvlStr)
-			continue
+	var desired []logrus.Level
+	for _, s := range levelStrs {
+		if lvl, err := logrus.ParseLevel(strings.TrimSpace(s)); err == nil {
+			desired = append(desired, lvl)
+		} else {
+			Logger.Warnf("忽略无效日志级别:%q", s)
 		}
-		levels = append(levels, level)
 	}
-
-	if len(levels) == 0 {
-		levels = []logrus.Level{logrus.InfoLevel} // 默认级别
+	if len(desired) == 0 {
+		desired = []logrus.Level{logrus.InfoLevel}
 	}
 
+	// --- 在 desired 里找到“数值最大的那个”(也就是最低阈值) ---
+	threshold := desired[0]
+	for _, lvl := range desired[1:] {
+		if lvl > threshold {
+			threshold = lvl
+		}
+	}
+	Logger.SetLevel(threshold)
+	Logger.Infof("日志阈值已设置为 %s", threshold.String())
 }