Browse Source

fix:新增指定日志打印级别的配置,同时修改dev环境默认打印级别为info

Jerry Liang 1 month ago
parent
commit
8d1c8686da
5 changed files with 54 additions and 8 deletions
  1. 3 0
      deploy/config.env.example
  2. 3 0
      service/.env
  3. 2 0
      service/config/config.go
  4. 45 7
      service/logger/logger.go
  5. 1 1
      service/main.go

+ 3 - 0
deploy/config.env.example

@@ -14,6 +14,9 @@
 APP_ENV="dev"
 # TODO: [确认] 后端监听端口(仅 localhost)。反向代理 /fwh-toolbox/api 指向此端口。
 APP_PORT="8301"
+# TODO: [可选] 日志级别强制指定:debug/info/warn/error,留空则使用环境默认级别
+#             (dev 默认 info,pro 默认 warn)。排查问题时可临时设为 debug。
+LOG_LEVEL=""
 # TODO: [确认] Asynqmon 任务监控面板监听端口
 ASYNQMON_PORT="8302"
 

+ 3 - 0
service/.env

@@ -1,6 +1,9 @@
 # APP CONFIG
 APP_ENV="dev"
 APP_PORT="8301"
+# 日志级别强制指定:可选 debug/info/warn/error,留空则使用对应环境的默认级别
+# (dev 默认 info,pro 默认 warn)。排查问题时可临时设为 debug,排查完请改回空。
+LOG_LEVEL=""
 REDIS_ADDR="localhost:6379"
 MYSQL_DSN="admin:V1hdkLzRoleI0YG6If24@tcp(34.211.183.235:3308)/home_energy_storage_server?charset=utf8mb4&parseTime=True&loc=Local"
 POSTGRES_DSN="host=localhost user=fwh_toolbox password=fwh_toolbox dbname=fwh_toolbox_db port=5432 sslmode=disable"

+ 2 - 0
service/config/config.go

@@ -11,6 +11,7 @@ import (
 type AppConfig struct {
 	AppEnv          string
 	AppPort         string
+	LogLevel        string
 	RedisAddr       string
 	MySQLDSN        string
 	PostgresDSN     string
@@ -175,6 +176,7 @@ func LoadConfig(configPaths ...string) (*Config, error) {
 		App: AppConfig{
 			AppEnv:          v.GetString("APP_ENV"),
 			AppPort:         v.GetString("APP_PORT"),
+			LogLevel:        v.GetString("LOG_LEVEL"),
 			RedisAddr:       v.GetString("REDIS_ADDR"),
 			MySQLDSN:        v.GetString("MYSQL_DSN"),
 			PostgresDSN:     v.GetString("POSTGRES_DSN"),

+ 45 - 7
service/logger/logger.go

@@ -2,25 +2,34 @@ package logger
 
 import (
 	"log"
+	"strings"
 
 	"go.uber.org/zap"
+	"go.uber.org/zap/zapcore"
 )
 
 var Log *zap.Logger
 var Sugar *zap.SugaredLogger
 var Std *log.Logger
 
-func Init(env string) error {
+// Init 初始化全局 zap 日志。
+//
+// env   环境标识:pro 使用生产配置(默认 Warn),其他使用开发配置(默认 Info)。
+// level 强制指定的日志级别(debug/info/warn/error),为空时使用对应环境的默认级别。
+func Init(env string, level string) error {
 	opt := zap.AddStacktrace(zap.ErrorLevel) // error 日志打印堆栈信息
 
+	// 解析强制指定的级别;未指定或非法时 forced 为 nil,表示使用环境默认级别。
+	forced := parseLevel(level)
+
 	var err error
 	if env == "pro" {
 		// Log, err = zap.NewProduction(opt)
-		Log, err = newProduction(opt)
+		Log, err = newProduction(forced, opt)
 		log.Println("zap init newProduction")
 	} else {
 		// Log, err = zap.NewDevelopment(opt)
-		Log, err = newDevelopment(opt)
+		Log, err = newDevelopment(forced, opt)
 		log.Println("zap init newDevelopment")
 	}
 
@@ -36,9 +45,34 @@ func Init(env string) error {
 	return err
 }
 
-func newProduction(options ...zap.Option) (*zap.Logger, error) {
+// parseLevel 解析级别字符串,支持 debug/info/warn(warning)/error,不区分大小写。
+// 无法识别(含空串)时返回 nil,调用方据此回退到环境默认级别。
+func parseLevel(level string) *zapcore.Level {
+	switch strings.ToLower(strings.TrimSpace(level)) {
+	case "debug":
+		l := zapcore.DebugLevel
+		return &l
+	case "info":
+		l := zapcore.InfoLevel
+		return &l
+	case "warn", "warning":
+		l := zapcore.WarnLevel
+		return &l
+	case "error":
+		l := zapcore.ErrorLevel
+		return &l
+	default:
+		return nil
+	}
+}
+
+func newProduction(forced *zapcore.Level, options ...zap.Option) (*zap.Logger, error) {
+	lvl := zapcore.WarnLevel // 生产环境默认 Warn
+	if forced != nil {
+		lvl = *forced
+	}
 	config := zap.Config{
-		Level:       zap.NewAtomicLevelAt(zap.WarnLevel),
+		Level:       zap.NewAtomicLevelAt(lvl),
 		Development: false,
 		Sampling: &zap.SamplingConfig{
 			Initial:    100,
@@ -52,9 +86,13 @@ func newProduction(options ...zap.Option) (*zap.Logger, error) {
 	return config.Build(options...)
 }
 
-func newDevelopment(options ...zap.Option) (*zap.Logger, error) {
+func newDevelopment(forced *zapcore.Level, options ...zap.Option) (*zap.Logger, error) {
+	lvl := zapcore.InfoLevel // 开发环境默认 Info
+	if forced != nil {
+		lvl = *forced
+	}
 	config := zap.Config{
-		Level:            zap.NewAtomicLevelAt(zap.DebugLevel),
+		Level:            zap.NewAtomicLevelAt(lvl),
 		Development:      true,
 		Encoding:         "console",
 		EncoderConfig:    zap.NewDevelopmentEncoderConfig(),

+ 1 - 1
service/main.go

@@ -39,7 +39,7 @@ func main() {
 	if err != nil {
 		panic(err)
 	}
-	err = logger.Init(cfg.App.AppEnv)
+	err = logger.Init(cfg.App.AppEnv, cfg.App.LogLevel)
 	if err != nil {
 		panic(err)
 	}