package logx import ( "context" "fmt" "io" "log/slog" "os" "path" "path/filepath" "strings" "github.com/zeromicro/go-zero/core/logx" "gopkg.in/natefinch/lumberjack.v2" ) var workdir, _ = filepath.Abs(filepath.Dir(os.Args[0])) // Logger 包装 slog,并适配 go-zero 的 logx.Writer(按天日志) type Logger struct { *slog.Logger } func SetDefault(logger *Logger) { slog.SetDefault(logger.Logger) } // NewLogger 按配置创建按天日志 func NewLogger(conf LogConf) *Logger { logLevel := slog.LevelInfo switch strings.ToLower(conf.Level) { case "error": logLevel = slog.LevelError case "warn": logLevel = slog.LevelWarn case "debug": logLevel = slog.LevelDebug } if !strings.Contains(conf.TimeFormat, "2006") { conf.TimeFormat = "2006-01-02 15:04:05" } if !path.IsAbs(conf.Filename) { conf.Filename = filepath.Join(workdir, conf.Filename) } var fileWriter io.Writer if conf.Daily { fileWriter = newDailyWriter(conf) } else { fileWriter = &lumberjack.Logger{ Filename: conf.Filename, MaxSize: conf.MaxSize, MaxBackups: conf.MaxBackups, MaxAge: conf.MaxAge, Compress: conf.Compress, } } var writer io.Writer = fileWriter if conf.Console { writer = io.MultiWriter(writer, os.Stdout) } opts := &slog.HandlerOptions{Level: logLevel, AddSource: conf.AddSource} var h slog.Handler if strings.EqualFold(conf.Format, "json") { h = slog.NewJSONHandler(writer, opts) } else { h = slog.NewTextHandler(writer, opts) } return &Logger{Logger: slog.New(h)} } func (l *Logger) Close() error { return nil } func (l *Logger) buildAttrs(fields []logx.LogField) []slog.Attr { attrs := make([]slog.Attr, 0, len(fields)) for _, f := range fields { attrs = append(attrs, slog.Any(f.Key, f.Value)) } return attrs } func (l *Logger) logAttrs(level slog.Level, msg string, attrs ...slog.Attr) { l.Logger.LogAttrs(context.Background(), level, msg, attrs...) } // --- 实现 logx.Writer 接口 --- func (l *Logger) Write(p []byte) (int, error) { l.logAttrs(slog.LevelInfo, strings.TrimSpace(string(p))) return len(p), nil } func (l *Logger) Alert(v any) { l.logAttrs(slog.LevelError, fmt.Sprint(v)) } func (l *Logger) Debug(v any, fields ...logx.LogField) { l.logAttrs(slog.LevelDebug, fmt.Sprint(v), l.buildAttrs(fields)...) } func (l *Logger) Error(v any, fields ...logx.LogField) { l.logAttrs(slog.LevelError, fmt.Sprint(v), l.buildAttrs(fields)...) } func (l *Logger) Info(v any, fields ...logx.LogField) { l.logAttrs(slog.LevelInfo, fmt.Sprint(v), l.buildAttrs(fields)...) } func (l *Logger) Severe(v any) { l.logAttrs(slog.LevelError, fmt.Sprint(v)) } func (l *Logger) Slow(v any, fields ...logx.LogField) { l.logAttrs(slog.LevelWarn, fmt.Sprint(v), l.buildAttrs(fields)...) } func (l *Logger) Stack(v any) { l.logAttrs(slog.LevelError, fmt.Sprintf("%+v", v)) } func (l *Logger) Stat(v any, fields ...logx.LogField) { l.logAttrs(slog.LevelInfo, fmt.Sprint(v), l.buildAttrs(fields)...) }