123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- package zlog
- import (
- "context"
- "fmt"
- "log"
- "os"
- "sync"
- "github.com/rotisserie/eris"
- "github.com/spf13/viper"
- "go.uber.org/zap"
- "go.uber.org/zap/zapcore"
- "sikey.com/websocket/utils/keys"
- )
- var (
- l *Logger
- once = sync.Once{}
- )
- type Logger struct {
- log *zap.Logger
- ctx context.Context
- }
- func NewZapLogger() *Logger {
- var name = viper.GetString("name")
- var env = viper.GetString("environment")
- var path = viper.GetString("logPath")
- var err error
- var writer Writer
- writer, err = NewZeroWriter(name, path, env)
- if err != nil {
- log.Fatalln(err)
- }
- return NewLogger(writer)
- }
- func NewSLSLogger(cfg SLSWriterConfig) *Logger {
- var writer Writer
- writer = NewSLSWriter(cfg)
- return NewLogger(writer)
- }
- func NewLogger(writer Writer) *Logger {
- // 限制日志输出级别, >= DebugLevel 会打印所有级别的日志
- // 生产环境中一般使用 >= ErrorLevel
- lowPriority := zap.LevelEnablerFunc(func(lv zapcore.Level) bool {
- return lv >= zapcore.DebugLevel
- })
- // 控制台展示方便调试,使用 TEXT 的方式
- consoleEncoderConfig := zap.NewDevelopmentEncoderConfig()
- consoleEncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
- consoleEncoderConfig.EncodeTime = zapcore.TimeEncoderOfLayout("2006-01-02 15:04:05")
- consoleEncoder := zapcore.NewConsoleEncoder(consoleEncoderConfig)
- stdCore := zapcore.NewCore(consoleEncoder, zapcore.Lock(os.Stdout), lowPriority)
- // 日志格式化
- productionEncoderConfig := zap.NewProductionEncoderConfig()
- productionEncoderConfig.EncodeTime = zapcore.TimeEncoderOfLayout("2006-01-02 15:04:05")
- jsonEnc := zapcore.NewJSONEncoder(productionEncoderConfig)
- // 使用 JSON 格式日志
- var core zapcore.Core
- if writer.GetEnv() != notPushEnvironment {
- syncer := zapcore.AddSync(writer)
- esCore := zapcore.NewCore(jsonEnc, syncer, lowPriority).With([]zap.Field{zap.String("env", writer.GetEnv())})
- core = zapcore.NewTee(stdCore, esCore)
- } else {
- core = stdCore
- }
- // logger 输出到 console 且标识调用代码行
- l := zap.New(core).WithOptions(zap.AddCallerSkip(1), zap.AddCaller())
- return &Logger{log: l}
- }
- func NewLoggerWithZapCode(l *zap.Logger) *Logger {
- return &Logger{log: l}
- }
- func WithContext(ctx context.Context) *Logger {
- requestId := ctx.Value(keys.HeaderRequestId)
- l := NewLoggerWithZapCode(l.log)
- if requestId != nil {
- if id, ok := requestId.(string); ok {
- l.log = l.log.With(zap.String(keys.HeaderRequestId, id))
- }
- }
- return l
- }
- func WithZapLogger(log *Logger) {
- once.Do(func() {
- l = log
- })
- }
- func (l *Logger) WithField(key, value string) *Logger {
- return NewLoggerWithZapCode(
- l.log.With(zap.String(key, value)),
- )
- }
- // Debug logs a message at info level.
- func (l *Logger) Debug(args ...any) {
- l.log.Debug(fmt.Sprint(args...))
- }
- // Debugf logs a message at info level.
- func (l *Logger) Debugf(msg string, args ...any) {
- l.log.Debug(fmt.Sprintf(msg, args...))
- }
- // Debugv logs a message at info level.
- func (l *Logger) Debugv(arg any) {
- l.log.Debug(fmt.Sprint(arg))
- }
- // Debugw logs a message at info level.
- func (l *Logger) Debugw(msg string, fields ...zap.Field) {
- l.log.Debug(fmt.Sprintf(msg, toValues(fields)...))
- }
- // Error logs a message at error level.
- func (l *Logger) Error(args ...any) {
- l.log.Error(fmt.Sprint(args...))
- }
- func (l *Logger) ErrorStack(err error) {
- format := eris.NewDefaultStringFormat(eris.FormatOptions{
- InvertOutput: true,
- WithTrace: true,
- InvertTrace: true,
- })
- formattedStr := eris.ToCustomString(err, format)
- l.log.Error(formattedStr)
- }
- // Errorf logs a message at error level.
- func (l *Logger) Errorf(msg string, args ...any) {
- l.log.Error(fmt.Sprintf(msg, args...))
- }
- // Errorv logs a message at error level.
- func (l *Logger) Errorv(arg any) {
- l.log.Error(fmt.Sprint(arg))
- }
- // Errorw logs a message at error level.
- func (l *Logger) Errorw(msg string, fields ...zap.Field) {
- l.log.Error(fmt.Sprintf(msg, toValues(fields)...))
- }
- // Info logs a message at info level.
- func (l *Logger) Info(args ...any) {
- l.log.Info(fmt.Sprint(args...))
- }
- // Infof logs a message at info level.
- func (l *Logger) Infof(msg string, args ...any) {
- l.log.Info(fmt.Sprintf(msg, args...))
- }
- // Infov logs a message at info level.
- func (l *Logger) Infov(arg any) {
- l.log.Info(fmt.Sprint(arg))
- }
- // Infow logs a message at info level.
- func (l *Logger) Infow(msg string, fields ...zap.Field) {
- l.log.Info(fmt.Sprintf(msg, toValues(fields)...))
- }
- // Debug logs a message at info level.
- func Debug(args ...any) {
- l.log.Debug(fmt.Sprint(args...))
- }
- // Debugf logs a message at info level.
- func Debugf(msg string, args ...any) {
- l.log.Debug(fmt.Sprintf(msg, args...))
- }
- // Debugv logs a message at info level.
- func Debugv(arg any) {
- l.log.Debug(fmt.Sprint(arg))
- }
- // Debugw logs a message at info level.
- func Debugw(msg string, fields ...zap.Field) {
- l.log.Debug(fmt.Sprintf(msg, toValues(fields)...))
- }
- // Error logs a message at error level.
- func Error(args ...any) {
- l.log.Error(fmt.Sprint(args...))
- }
- func ErrorStack(err error) {
- format := eris.NewDefaultStringFormat(eris.FormatOptions{
- InvertOutput: true,
- WithTrace: true,
- InvertTrace: true,
- })
- formattedStr := eris.ToCustomString(err, format)
- l.log.Error(formattedStr)
- }
- // Errorf logs a message at error level.
- func Errorf(msg string, args ...any) {
- l.log.Error(fmt.Sprintf(msg, args...))
- }
- // Errorv logs a message at error level.
- func Errorv(arg any) {
- l.log.Error(fmt.Sprint(arg))
- }
- // Errorw logs a message at error level.
- func Errorw(msg string, fields ...zap.Field) {
- l.log.Error(fmt.Sprintf(msg, toValues(fields)...))
- }
- // Info logs a message at info level.
- func Info(args ...any) {
- l.log.Info(fmt.Sprint(args...))
- }
- // Infof logs a message at info level.
- func Infof(msg string, args ...any) {
- l.log.Info(fmt.Sprintf(msg, args...))
- }
- // Infov logs a message at info level.
- func Infov(arg any) {
- l.log.Info(fmt.Sprint(arg))
- }
- // Infow logs a message at info level.
- func Infow(msg string, fields ...zap.Field) {
- l.log.Info(fmt.Sprintf(msg, toValues(fields)...))
- }
- func addLineBreakSymbol(msg string) string {
- return fmt.Sprintln(msg)
- }
- func toValues(fields []zap.Field) []any {
- var str []any = make([]any, len(fields))
- for i, field := range fields {
- str[i] = field.String
- }
- return str
- }
|