You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
1.7 KiB
93 lines
1.7 KiB
package logger
|
|
|
|
import (
|
|
"context"
|
|
"strings"
|
|
"sync"
|
|
|
|
"go.uber.org/zap"
|
|
"go.uber.org/zap/zapcore"
|
|
)
|
|
|
|
var (
|
|
defaultLogger *Engine
|
|
level zap.AtomicLevel
|
|
onceLevelObserver sync.Once
|
|
)
|
|
|
|
type Engine struct {
|
|
*zap.Logger
|
|
}
|
|
|
|
func Logger(ctx context.Context) *Engine {
|
|
if defaultLogger == nil {
|
|
panic("logger has not been initialized, call SetupDefaultLogger() before use")
|
|
}
|
|
|
|
return defaultLogger.WithContext(ctx)
|
|
}
|
|
|
|
func (l *Engine) SetLevel(lvl zapcore.Level) {
|
|
level.SetLevel(lvl)
|
|
}
|
|
|
|
func New(logger *zap.Logger) *Engine {
|
|
return &Engine{
|
|
Logger: logger,
|
|
}
|
|
}
|
|
|
|
func (l *Engine) WithContext(ctx context.Context) *Engine {
|
|
if ctx == nil {
|
|
return l
|
|
}
|
|
|
|
logger := l.Logger
|
|
|
|
mtx.RLock()
|
|
for field := range logKeys {
|
|
fieldName := string(field)
|
|
fieldNameParts := strings.Split(fieldName, ".")
|
|
fieldName = fieldNameParts[len(fieldNameParts)-1]
|
|
|
|
value := ctx.Value(field)
|
|
if value == nil {
|
|
continue
|
|
}
|
|
|
|
if valueStr, ok := value.(string); ok && valueStr != "" {
|
|
logger = logger.With(zap.String(fieldName, valueStr))
|
|
}
|
|
}
|
|
mtx.RUnlock()
|
|
|
|
// оборачиваем полями из fieldStorage
|
|
logger = withStorageFields(ctx, logger)
|
|
|
|
return &Engine{Logger: logger}
|
|
}
|
|
|
|
func (l *Engine) AddHook(f func(zapcore.Entry)) {
|
|
l.Logger = l.Logger.WithOptions(zap.Hooks(func(entry zapcore.Entry) error {
|
|
f(entry)
|
|
return nil
|
|
}))
|
|
}
|
|
|
|
func initLogger(options ...ConfigOption) *zap.Logger {
|
|
level = zap.NewAtomicLevelAt(zap.InfoLevel)
|
|
config := zap.NewProductionConfig()
|
|
config.Level = level
|
|
config.Sampling = &zap.SamplingConfig{
|
|
Initial: 1000,
|
|
Thereafter: 10,
|
|
}
|
|
|
|
for _, opt := range options {
|
|
config = opt(config)
|
|
}
|
|
|
|
logger, _ := config.Build()
|
|
|
|
return logger
|
|
}
|
|
|