2024-07-22 12:42:30 +08:00
|
|
|
package utils
|
|
|
|
|
|
|
|
|
|
import (
|
2024-07-24 11:07:04 +08:00
|
|
|
"encoding/json"
|
|
|
|
|
"fmt"
|
|
|
|
|
"os"
|
|
|
|
|
|
2024-07-22 12:42:30 +08:00
|
|
|
"go.uber.org/zap"
|
2024-07-24 11:07:04 +08:00
|
|
|
"go.uber.org/zap/zapcore"
|
|
|
|
|
"gopkg.in/natefinch/lumberjack.v2"
|
2024-07-22 12:42:30 +08:00
|
|
|
)
|
|
|
|
|
|
2024-07-24 11:07:04 +08:00
|
|
|
const (
|
|
|
|
|
TestConfigFileName = "./configs/logger.test.json"
|
|
|
|
|
ProdConfigFileName = ".configs/logger.json"
|
|
|
|
|
DevelopmentConfigFileName = "./configs/logger.dev.json"
|
|
|
|
|
EnvTest = "test"
|
|
|
|
|
EnvProd = "prod"
|
|
|
|
|
EnvDev = "dev"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type LoggerConfig struct {
|
|
|
|
|
ZapConfig zap.Config `json:"zapConfig"`
|
|
|
|
|
LumberjackConfig LumberjackConfig `json:"lumberjackConfig"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type LumberjackConfig struct {
|
|
|
|
|
Filename string `json:"filename"`
|
|
|
|
|
MaxSize int `json:"maxSize"`
|
|
|
|
|
MaxBackups int `json:"maxBackups"`
|
|
|
|
|
MaxAge int `json:"maxAge"`
|
|
|
|
|
Compress bool `json:"compress"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
|
sugar *zap.SugaredLogger
|
|
|
|
|
log *zap.Logger
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func load() {
|
|
|
|
|
if log == nil {
|
|
|
|
|
env := getEnv()
|
2024-07-24 14:43:22 +08:00
|
|
|
fmt.Printf("Environment: %s\n", env)
|
2024-07-24 11:07:04 +08:00
|
|
|
configFile := getConfigFile(env)
|
2024-07-24 14:21:02 +08:00
|
|
|
|
2024-07-24 11:07:04 +08:00
|
|
|
config, err := loadConfig(configFile)
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Printf("Error loading config: %v\n", err)
|
2024-07-24 14:21:02 +08:00
|
|
|
log, _ = zap.NewDevelopment()
|
|
|
|
|
sugar = log.Sugar()
|
2024-07-24 11:07:04 +08:00
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var logWriter zapcore.WriteSyncer
|
|
|
|
|
if env == EnvProd {
|
|
|
|
|
logWriter = zapcore.AddSync(&lumberjack.Logger{
|
|
|
|
|
Filename: config.LumberjackConfig.Filename,
|
|
|
|
|
MaxSize: config.LumberjackConfig.MaxSize,
|
|
|
|
|
MaxBackups: config.LumberjackConfig.MaxBackups,
|
|
|
|
|
MaxAge: config.LumberjackConfig.MaxAge,
|
|
|
|
|
Compress: config.LumberjackConfig.Compress,
|
|
|
|
|
})
|
|
|
|
|
} else {
|
|
|
|
|
logWriter = zapcore.AddSync(os.Stdout)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
encoder := zapcore.NewJSONEncoder(config.ZapConfig.EncoderConfig)
|
|
|
|
|
level := parseLogLevel(config.ZapConfig.Level.String())
|
|
|
|
|
|
|
|
|
|
core := zapcore.NewCore(
|
|
|
|
|
encoder,
|
|
|
|
|
logWriter,
|
|
|
|
|
level,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
log = zap.New(core, zap.AddCaller(), zap.AddStacktrace(zapcore.ErrorLevel))
|
|
|
|
|
sugar = log.Sugar()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func GetSugaredLogger() *zap.SugaredLogger {
|
|
|
|
|
load()
|
|
|
|
|
return log.Sugar()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func getEnv() string {
|
|
|
|
|
env := os.Getenv("TELE_MODE")
|
|
|
|
|
if env == "" {
|
|
|
|
|
env = EnvDev
|
|
|
|
|
}
|
|
|
|
|
return env
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func getConfigFile(env string) string {
|
|
|
|
|
switch env {
|
|
|
|
|
case EnvTest:
|
|
|
|
|
return TestConfigFileName
|
|
|
|
|
case EnvProd:
|
|
|
|
|
return ProdConfigFileName
|
|
|
|
|
default:
|
|
|
|
|
return DevelopmentConfigFileName
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func loadConfig(configFile string) (LoggerConfig, error) {
|
|
|
|
|
file, err := os.Open(configFile)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return LoggerConfig{}, fmt.Errorf("error opening file: %v", err)
|
|
|
|
|
}
|
|
|
|
|
defer file.Close()
|
|
|
|
|
|
|
|
|
|
var config LoggerConfig
|
|
|
|
|
if err := json.NewDecoder(file).Decode(&config); err != nil {
|
|
|
|
|
return LoggerConfig{}, fmt.Errorf("error decoding config: %v", err)
|
|
|
|
|
}
|
|
|
|
|
return config, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func GetLogger() *zap.SugaredLogger {
|
|
|
|
|
if sugar == nil {
|
|
|
|
|
load()
|
|
|
|
|
}
|
|
|
|
|
return sugar
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func parseLogLevel(level string) zapcore.Level {
|
|
|
|
|
switch level {
|
|
|
|
|
case "debug":
|
|
|
|
|
return zapcore.DebugLevel
|
|
|
|
|
case "info":
|
|
|
|
|
return zapcore.InfoLevel
|
|
|
|
|
case "warn":
|
|
|
|
|
return zapcore.WarnLevel
|
|
|
|
|
case "error":
|
|
|
|
|
return zapcore.ErrorLevel
|
|
|
|
|
case "dpanic":
|
|
|
|
|
return zapcore.DPanicLevel
|
|
|
|
|
case "panic":
|
|
|
|
|
return zapcore.PanicLevel
|
|
|
|
|
case "fatal":
|
|
|
|
|
return zapcore.FatalLevel
|
|
|
|
|
default:
|
|
|
|
|
return zapcore.InfoLevel
|
|
|
|
|
}
|
|
|
|
|
}
|