feat: add independent platform modules and multi-provider storage
This commit is contained in:
40
logx/logx.go
40
logx/logx.go
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user