|
@@ -1,6 +1,7 @@
|
|
|
package utils
|
|
package utils
|
|
|
|
|
|
|
|
import (
|
|
import (
|
|
|
|
|
+ "io"
|
|
|
"os"
|
|
"os"
|
|
|
"path/filepath"
|
|
"path/filepath"
|
|
|
"strings"
|
|
"strings"
|
|
@@ -15,55 +16,56 @@ var Logger *logrus.Logger
|
|
|
func InitLogger(logDir string, levelConf string) {
|
|
func InitLogger(logDir string, levelConf string) {
|
|
|
Logger = logrus.New()
|
|
Logger = logrus.New()
|
|
|
|
|
|
|
|
- // 获取项目根目录路径
|
|
|
|
|
- projectRoot, err := os.Getwd()
|
|
|
|
|
|
|
+ // --- 目录准备(和之前一样) ---
|
|
|
|
|
+ cwd, err := os.Getwd()
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
panic(err)
|
|
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)
|
|
panic(err)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // --- 滚动文件 + stdout ---
|
|
|
currentDate := time.Now().Format("20060102")
|
|
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 == "" {
|
|
if levelConf == "" {
|
|
|
levelConf = "info"
|
|
levelConf = "info"
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- // 分割多个级别
|
|
|
|
|
levelStrs := strings.Split(levelConf, ",")
|
|
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())
|
|
|
}
|
|
}
|