Files
workspace/code/allapp/allapp-go/logx/logger.go
T
2026-01-13 22:18:01 +08:00

269 lines
6.1 KiB
Go

package logx
import (
"context"
"fmt"
"io"
"github.com/cloudwego/hertz/pkg/common/hlog"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
var _ hlog.FullLogger = (*Logger)(nil)
type Logger struct {
l *zap.Logger
config *config
}
func NewLogger(opts ...Option) *Logger {
config := defaultConfig()
// apply options
for _, opt := range opts {
opt.apply(config)
}
cores := make([]zapcore.Core, 0, len(config.coreConfigs))
for _, coreConfig := range config.coreConfigs {
cores = append(cores, zapcore.NewCore(coreConfig.Enc, coreConfig.Ws, coreConfig.Lvl))
}
logger := zap.New(
zapcore.NewTee(cores[:]...),
config.zapOpts...)
return &Logger{
l: logger,
config: config,
}
}
// GetExtraKeys get extraKeys from logger config
func (l *Logger) GetExtraKeys() []ExtraKey {
return l.config.extraKeys
}
// PutExtraKeys add extraKeys after init
func (l *Logger) PutExtraKeys(keys ...ExtraKey) {
for _, k := range keys {
if !InArray(k, l.config.extraKeys) {
l.config.extraKeys = append(l.config.extraKeys, k)
}
}
}
func (l *Logger) Log(level hlog.Level, kvs ...interface{}) {
if len(kvs) == 0 {
return
}
// 第一个参数作为 msg
msg := fmt.Sprint(kvs[0])
// 后续参数作为 zap.Field
fields := make([]zap.Field, 0, len(kvs)-1)
for _, v := range kvs[1:] {
if f, ok := v.(zap.Field); ok {
fields = append(fields, f)
}
}
switch level {
case hlog.LevelTrace, hlog.LevelDebug:
l.l.Debug(msg, fields...)
case hlog.LevelInfo:
l.l.Info(msg, fields...)
case hlog.LevelNotice, hlog.LevelWarn:
l.l.Warn(msg, fields...)
case hlog.LevelError:
l.l.Error(msg, fields...)
case hlog.LevelFatal:
l.l.Fatal(msg, fields...)
default:
l.l.Warn(msg, fields...)
}
}
func (l *Logger) Logf(level hlog.Level, format string, kvs ...interface{}) {
logger := l.l.Sugar().With()
switch level {
case hlog.LevelTrace, hlog.LevelDebug:
logger.Debugf(format, kvs...)
case hlog.LevelInfo:
logger.Infof(format, kvs...)
case hlog.LevelNotice, hlog.LevelWarn:
logger.Warnf(format, kvs...)
case hlog.LevelError:
logger.Errorf(format, kvs...)
case hlog.LevelFatal:
logger.Fatalf(format, kvs...)
default:
logger.Warnf(format, kvs...)
}
}
func (l *Logger) CtxLogf(level hlog.Level, ctx context.Context, format string, kvs ...interface{}) {
zLevel := hLevelToZapLevel(level)
if !l.config.coreConfigs[0].Lvl.Enabled(zLevel) {
return
}
zapLogger := l.l
if len(l.config.extraKeys) > 0 {
for _, k := range l.config.extraKeys {
if l.config.extraKeyAsStr {
v := ctx.Value(string(k))
if v != nil {
zapLogger = zapLogger.With(zap.Any(string(k), v))
}
} else {
v := ctx.Value(k)
if v != nil {
zapLogger = zapLogger.With(zap.Any(string(k), v))
}
}
}
}
log := zapLogger.Sugar()
switch level {
case hlog.LevelDebug, hlog.LevelTrace:
log.Debugf(format, kvs...)
case hlog.LevelInfo:
log.Infof(format, kvs...)
case hlog.LevelNotice, hlog.LevelWarn:
log.Warnf(format, kvs...)
case hlog.LevelError:
log.Errorf(format, kvs...)
case hlog.LevelFatal:
log.Fatalf(format, kvs...)
default:
log.Warnf(format, kvs...)
}
}
func (l *Logger) Trace(v ...interface{}) {
l.Log(hlog.LevelTrace, v...)
}
func (l *Logger) Debug(v ...interface{}) {
l.Log(hlog.LevelDebug, v...)
}
func (l *Logger) Info(v ...interface{}) {
l.Log(hlog.LevelInfo, v...)
}
func (l *Logger) Notice(v ...interface{}) {
l.Log(hlog.LevelNotice, v...)
}
func (l *Logger) Warn(v ...interface{}) {
l.Log(hlog.LevelWarn, v...)
}
func (l *Logger) Error(v ...interface{}) {
l.Log(hlog.LevelError, v...)
}
func (l *Logger) Fatal(v ...interface{}) {
l.Log(hlog.LevelFatal, v...)
}
func (l *Logger) Tracef(format string, v ...interface{}) {
l.Logf(hlog.LevelTrace, format, v...)
}
func (l *Logger) Debugf(format string, v ...interface{}) {
l.Logf(hlog.LevelDebug, format, v...)
}
func (l *Logger) Infof(format string, v ...interface{}) {
l.Logf(hlog.LevelInfo, format, v...)
}
func (l *Logger) Noticef(format string, v ...interface{}) {
l.Logf(hlog.LevelWarn, format, v...)
}
func (l *Logger) Warnf(format string, v ...interface{}) {
l.Logf(hlog.LevelWarn, format, v...)
}
func (l *Logger) Errorf(format string, v ...interface{}) {
l.Logf(hlog.LevelError, format, v...)
}
func (l *Logger) Fatalf(format string, v ...interface{}) {
l.Logf(hlog.LevelFatal, format, v...)
}
func (l *Logger) CtxTracef(ctx context.Context, format string, v ...interface{}) {
l.CtxLogf(hlog.LevelDebug, ctx, format, v...)
}
func (l *Logger) CtxDebugf(ctx context.Context, format string, v ...interface{}) {
l.CtxLogf(hlog.LevelDebug, ctx, format, v...)
}
func (l *Logger) CtxInfof(ctx context.Context, format string, v ...interface{}) {
l.CtxLogf(hlog.LevelInfo, ctx, format, v...)
}
func (l *Logger) CtxNoticef(ctx context.Context, format string, v ...interface{}) {
l.CtxLogf(hlog.LevelWarn, ctx, format, v...)
}
func (l *Logger) CtxWarnf(ctx context.Context, format string, v ...interface{}) {
l.CtxLogf(hlog.LevelWarn, ctx, format, v...)
}
func (l *Logger) CtxErrorf(ctx context.Context, format string, v ...interface{}) {
l.CtxLogf(hlog.LevelError, ctx, format, v...)
}
func (l *Logger) CtxFatalf(ctx context.Context, format string, v ...interface{}) {
l.CtxLogf(hlog.LevelFatal, ctx, format, v...)
}
func (l *Logger) SetLevel(level hlog.Level) {
lvl := hLevelToZapLevel(level)
l.config.coreConfigs[0].Lvl = lvl
cores := make([]zapcore.Core, 0, len(l.config.coreConfigs))
for _, coreConfig := range l.config.coreConfigs {
cores = append(cores, zapcore.NewCore(coreConfig.Enc, coreConfig.Ws, coreConfig.Lvl))
}
logger := zap.New(
zapcore.NewTee(cores[:]...),
l.config.zapOpts...)
l.l = logger
}
func (l *Logger) SetOutput(writer io.Writer) {
l.config.coreConfigs[0].Ws = zapcore.AddSync(writer)
cores := make([]zapcore.Core, 0, len(l.config.coreConfigs))
for _, coreConfig := range l.config.coreConfigs {
cores = append(cores, zapcore.NewCore(coreConfig.Enc, coreConfig.Ws, coreConfig.Lvl))
}
logger := zap.New(
zapcore.NewTee(cores[:]...),
l.config.zapOpts...)
l.l = logger
}
// Logger is used to return an instance of *zap.Logger for custom fields, etc.
func (l *Logger) Logger() *zap.Logger {
return l.l
}
func (l *Logger) Sync() {
_ = l.l.Sync()
}