feat: add independent platform modules and multi-provider storage

This commit is contained in:
2026-09-23 14:51:14 +08:00
parent f91034477b
commit 208a9c3fbd
57 changed files with 4890 additions and 48 deletions

View File

@@ -21,14 +21,14 @@ import (
// standard stream. File takes precedence over Output and appends to the named
// file.
type Config struct {
Level string
Format string
Output string
File string
Service string
Environment string
AddSource bool
Writer io.Writer
Level string `json:"level"`
Format string `json:"format"`
Output string `json:"output"`
File string `json:"file"`
Service string `json:"service"`
Environment string `json:"environment"`
AddSource bool `json:"addSource"`
Writer io.Writer `json:"-"`
}
// Default returns the default production-friendly logger configuration.
@@ -45,6 +45,7 @@ func Default() Config {
type Logger struct {
logger *slog.Logger
closer *closeState
level *slog.LevelVar
}
type closeState struct {
@@ -78,7 +79,9 @@ func New(cfg Config) (*Logger, error) {
return nil, err
}
opts := &slog.HandlerOptions{Level: level, AddSource: cfg.AddSource}
dynamicLevel := new(slog.LevelVar)
dynamicLevel.Set(level)
opts := &slog.HandlerOptions{Level: dynamicLevel, AddSource: cfg.AddSource}
var handler slog.Handler
if cfg.Format == "text" {
handler = slog.NewTextHandler(writer, opts)
@@ -97,7 +100,7 @@ func New(cfg Config) (*Logger, error) {
if closeWriter != nil {
closer = &closeState{fn: closeWriter}
}
return &Logger{logger: logger, closer: closer}, nil
return &Logger{logger: logger, closer: closer, level: dynamicLevel}, nil
}
// Setup replaces the process-wide logger used by the package-level helpers.
@@ -152,14 +155,27 @@ func (l *Logger) With(args ...any) *Logger {
if l == nil || l.logger == nil {
return defaultLogger.Load().With(args...)
}
return &Logger{logger: l.logger.With(args...), closer: l.closer}
return &Logger{logger: l.logger.With(args...), closer: l.closer, level: l.level}
}
func (l *Logger) WithGroup(name string) *Logger {
if l == nil || l.logger == nil {
return defaultLogger.Load().WithGroup(name)
}
return &Logger{logger: l.logger.WithGroup(name), closer: l.closer}
return &Logger{logger: l.logger.WithGroup(name), closer: l.closer, level: l.level}
}
// SetLevel atomically changes the threshold shared by this logger and children.
func (l *Logger) SetLevel(value string) error {
if l == nil || l.level == nil {
return errors.New("logx: logger does not support dynamic levels")
}
level, err := parseLevel(value)
if err != nil {
return err
}
l.level.Set(level)
return nil
}
// Close releases resources owned by the root logger. It is safe to call more