package log import ( "context" "io" "log/slog" "os" "path/filepath" "sync" ) func init() { // 如果没有设置 Logger, 则启动时使用默认的 kisDefaultSlog 对象 if Logger() == nil { MustNewKisDefaultSlog() } } func MustNewKisDefaultSlog(opts ...KisLogOptions) { defaultSlog := getKisDefaultSLog(opts...) initDefaultSlog(defaultSlog) SetLogger(defaultSlog) } // kisDefaultSlog 默认提供的日志对象 type kisDefaultSlog struct { location bool level slog.Level jsonFormat bool writer io.Writer mu sync.Mutex } type KisLogOptions func(k *kisDefaultSlog) func WithLocation(location bool) KisLogOptions { return func(k *kisDefaultSlog) { k.location = location } } func WithLevel(level slog.Level) KisLogOptions { return func(k *kisDefaultSlog) { k.level = level } } func WithJSONFormat(jsonFormat bool) KisLogOptions { return func(k *kisDefaultSlog) { k.jsonFormat = jsonFormat } } func WithWriter(writer io.Writer) KisLogOptions { return func(k *kisDefaultSlog) { k.writer = writer } } var defaultKisLog = &kisDefaultSlog{ location: true, level: slog.LevelDebug, jsonFormat: false, writer: os.Stdout, } func getKisDefaultSLog(opts ...KisLogOptions) *kisDefaultSlog { defaultKisSlog := defaultKisLog if opts == nil { return defaultKisSlog } for _, opt := range opts { opt(defaultKisSlog) } return defaultKisSlog } func (k *kisDefaultSlog) InfoX(ctx context.Context, str string, v ...interface{}) { slog.InfoContext(ctx, str, v...) } func (k *kisDefaultSlog) ErrorX(ctx context.Context, str string, v ...interface{}) { slog.ErrorContext(ctx, str, v...) } func (k *kisDefaultSlog) DebugX(ctx context.Context, str string, v ...interface{}) { slog.DebugContext(ctx, str, v...) } func (k *kisDefaultSlog) Info(str string, v ...interface{}) { slog.Info(str, v...) } func (k *kisDefaultSlog) Error(str string, v ...interface{}) { slog.Error(str, v...) } func (k *kisDefaultSlog) Debug(str string, v ...interface{}) { slog.Debug(str, v...) } func (k *kisDefaultSlog) SetDebugMode() { k.mu.Lock() defer k.mu.Unlock() k.level = slog.LevelDebug } func initDefaultSlog(kisLog *kisDefaultSlog) { replace := func(groups []string, a slog.Attr) slog.Attr { if a.Key == slog.SourceKey { source := a.Value.Any().(*slog.Source) source.Function = "" source.File = filepath.Base(source.File) } return a } ho := &slog.HandlerOptions{ AddSource: kisLog.location, Level: kisLog.level, ReplaceAttr: replace, } var logger *slog.Logger if kisLog.jsonFormat { logger = slog.New(slog.NewJSONHandler(kisLog.writer, ho)) } else { logger = slog.New(slog.NewTextHandler(kisLog.writer, ho)) } slog.SetDefault(logger) }