Files
hfb_sys/backend/internal/logging/logger.go
T

76 lines
1.8 KiB
Go

package logging
import (
"os"
"strings"
"time"
"hfb_sys/backend/internal/config"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
func New(cfg config.LogConfig) (*zap.Logger, error) {
location, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
location = time.FixedZone("Asia/Shanghai", 8*60*60)
}
level := zap.NewAtomicLevelAt(parseLevel(cfg.Level))
encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.TimeKey = "time"
encoderConfig.LevelKey = "level"
encoderConfig.MessageKey = "message"
encoderConfig.CallerKey = "caller"
encoderConfig.EncodeTime = func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString(t.In(location).Format("2006-01-02 15:04:05.000 -0700"))
}
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
encoderConfig.EncodeDuration = zapcore.StringDurationEncoder
encoderConfig.EncodeCaller = zapcore.ShortCallerEncoder
cores := make([]zapcore.Core, 0, 2)
if cfg.EnableConsole {
cores = append(cores, zapcore.NewCore(
zapcore.NewConsoleEncoder(encoderConfig),
zapcore.Lock(os.Stdout),
level,
))
}
if cfg.EnableFile {
writer := newDailyWriter(cfg.Dir, "app", location)
cores = append(cores, zapcore.NewCore(
zapcore.NewJSONEncoder(encoderConfig),
writer,
level,
))
}
if len(cores) == 0 {
cores = append(cores, zapcore.NewCore(
zapcore.NewConsoleEncoder(encoderConfig),
zapcore.Lock(os.Stdout),
level,
))
}
return zap.New(
zapcore.NewTee(cores...),
zap.AddCaller(),
zap.AddStacktrace(zapcore.PanicLevel),
), nil
}
func parseLevel(value string) zapcore.Level {
switch strings.ToLower(strings.TrimSpace(value)) {
case "debug":
return zapcore.DebugLevel
case "warn", "warning":
return zapcore.WarnLevel
case "error":
return zapcore.ErrorLevel
default:
return zapcore.InfoLevel
}
}