>  기사  >  백엔드 개발  >  go zap의 SugaredLogger를 공부하도록 안내해 드리겠습니다!

go zap의 SugaredLogger를 공부하도록 안내해 드리겠습니다!

藏色散人
藏色散人앞으로
2021-09-13 15:41:242154검색
이 글은 주로 golang의 zap의 SugaredLogger를 연구합니다

SugaredLogger

zap@v1.16.0/sugar.go

type SugaredLogger struct {
    base *Logger
}

func (s *SugaredLogger) Named(name string) *SugaredLogger {
    return &SugaredLogger{base: s.base.Named(name)}
}

func (s *SugaredLogger) With(args ...interface{}) *SugaredLogger {
    return &SugaredLogger{base: s.base.With(s.sweetenFields(args)...)}
}

func (s *SugaredLogger) Debug(args ...interface{}) {
    s.log(DebugLevel, "", args, nil)
}

func (s *SugaredLogger) Info(args ...interface{}) {
    s.log(InfoLevel, "", args, nil)
}

func (s *SugaredLogger) Warn(args ...interface{}) {
    s.log(WarnLevel, "", args, nil)
}

func (s *SugaredLogger) Error(args ...interface{}) {
    s.log(ErrorLevel, "", args, nil)
}

func (s *SugaredLogger) DPanic(args ...interface{}) {
    s.log(DPanicLevel, "", args, nil)
}

func (s *SugaredLogger) Panic(args ...interface{}) {
    s.log(PanicLevel, "", args, nil)
}

func (s *SugaredLogger) Fatal(args ...interface{}) {
    s.log(FatalLevel, "", args, nil)
}

func (s *SugaredLogger) Debugf(template string, args ...interface{}) {
    s.log(DebugLevel, template, args, nil)
}

func (s *SugaredLogger) Infof(template string, args ...interface{}) {
    s.log(InfoLevel, template, args, nil)
}

func (s *SugaredLogger) Warnf(template string, args ...interface{}) {
    s.log(WarnLevel, template, args, nil)
}

func (s *SugaredLogger) Errorf(template string, args ...interface{}) {
    s.log(ErrorLevel, template, args, nil)
}

func (s *SugaredLogger) DPanicf(template string, args ...interface{}) {
    s.log(DPanicLevel, template, args, nil)
}

func (s *SugaredLogger) Panicf(template string, args ...interface{}) {
    s.log(PanicLevel, template, args, nil)
}

func (s *SugaredLogger) Fatalf(template string, args ...interface{}) {
    s.log(FatalLevel, template, args, nil)
}

func (s *SugaredLogger) Debugw(msg string, keysAndValues ...interface{}) {
    s.log(DebugLevel, msg, nil, keysAndValues)
}

func (s *SugaredLogger) Infow(msg string, keysAndValues ...interface{}) {
    s.log(InfoLevel, msg, nil, keysAndValues)
}

func (s *SugaredLogger) Warnw(msg string, keysAndValues ...interface{}) {
    s.log(WarnLevel, msg, nil, keysAndValues)
}

func (s *SugaredLogger) Errorw(msg string, keysAndValues ...interface{}) {
    s.log(ErrorLevel, msg, nil, keysAndValues)
}

func (s *SugaredLogger) DPanicw(msg string, keysAndValues ...interface{}) {
    s.log(DPanicLevel, msg, nil, keysAndValues)
}

func (s *SugaredLogger) Panicw(msg string, keysAndValues ...interface{}) {
    s.log(PanicLevel, msg, nil, keysAndValues)
}

func (s *SugaredLogger) Fatalw(msg string, keysAndValues ...interface{}) {
    s.log(FatalLevel, msg, nil, keysAndValues)
}

func (s *SugaredLogger) Sync() error {
    return s.base.Sync()
}

SugaredLogger는 디버그, 정보, 경고, 오류, 패닉, dpanic, 치명적 기능을 제공합니다. 메서드(fmt.Sprint의 기본 형식 사용), 형식을 지원하는 f가 포함된 메서드와 with 키-값 쌍을 지원하는 w가 포함된 메서드도 있습니다

level

zap@v1.16.0/level.go
const (
    // DebugLevel logs are typically voluminous, and are usually disabled in
    // production.
    DebugLevel = zapcore.DebugLevel
    // InfoLevel is the default logging priority.
    InfoLevel = zapcore.InfoLevel
    // WarnLevel logs are more important than Info, but don't need inpidual
    // human review.
    WarnLevel = zapcore.WarnLevel
    // ErrorLevel logs are high-priority. If an application is running smoothly,
    // it shouldn't generate any error-level logs.
    ErrorLevel = zapcore.ErrorLevel
    // DPanicLevel logs are particularly important errors. In development the
    // logger panics after writing the message.
    DPanicLevel = zapcore.DPanicLevel
    // PanicLevel logs a message, then panics.
    PanicLevel = zapcore.PanicLevel
    // FatalLevel logs a message, then calls os.Exit(1).
    FatalLevel = zapcore.FatalLevel
)
使用fmt.Sprint的默认格式),另外还有带f的支持format,带w的方法则支持with键值对

level

zap@v1.16.0/level.go

func dpanicInDevelopment() {
    logger, _ := zap.NewDevelopment()
    defer logger.Sync() // flushes buffer, if any
    sugar := logger.Sugar()
    sugar.DPanic("test dpanic")
    sugar.Info("this will not be logged")
}
zap内部的level分为debug、info、warn、error、dpanic、panic、fatal这几种

DPanic

DPanic stands for "panic in development." In development, it logs at PanicLevel; otherwise, it logs at ErrorLevel. DPanic makes it easier to catch errors that are theoretically possible, but shouldn't actually happen, without crashing in production.

DPanic in development

func dpanicInProduction() {
    logger, _ := zap.NewProduction()
    defer logger.Sync() // flushes buffer, if any
    sugar := logger.Sugar()
    sugar.DPanic("test dpanic logged as error in not development mode")
    sugar.Info("this will be logged")
}
DPanic在development下的效果跟panic效果类似,最后的info不会被输出

DPanic in production

func (log *Logger) check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry {
    // check must always be called directly by a method in the Logger interface
    // (e.g., Check, Info, Fatal).
    const callerSkipOffset = 2

    // Check the level first to reduce the cost of disabled log calls.
    // Since Panic and higher may exit, we skip the optimization for those levels.
    if lvl < zapcore.DPanicLevel && !log.core.Enabled(lvl) {
        return nil
    }

    // Create basic checked entry thru the core; this will be non-nil if the
    // log message will actually be written somewhere.
    ent := zapcore.Entry{
        LoggerName: log.name,
        Time:       time.Now(),
        Level:      lvl,
        Message:    msg,
    }
    ce := log.core.Check(ent, nil)
    willWrite := ce != nil

    // Set up any required terminal behavior.
    switch ent.Level {
    case zapcore.PanicLevel:
        ce = ce.Should(ent, zapcore.WriteThenPanic)
    case zapcore.FatalLevel:
        onFatal := log.onFatal
        // Noop is the default value for CheckWriteAction, and it leads to
        // continued execution after a Fatal which is unexpected.
        if onFatal == zapcore.WriteThenNoop {
            onFatal = zapcore.WriteThenFatal
        }
        ce = ce.Should(ent, onFatal)
    case zapcore.DPanicLevel:
        if log.development {
            ce = ce.Should(ent, zapcore.WriteThenPanic)
        }
    }

    // Only do further annotation if we're going to write this message; checked
    // entries that exist only for terminal behavior don't benefit from
    // annotation.
    if !willWrite {
        return ce
    }

    // Thread the error output through to the CheckedEntry.
    ce.ErrorOutput = log.errorOutput
    if log.addCaller {
        frame, defined := getCallerFrame(log.callerSkip + callerSkipOffset)
        if !defined {
            fmt.Fprintf(log.errorOutput, "%v Logger.check error: failed to get caller\n", time.Now().UTC())
            log.errorOutput.Sync()
        }

        ce.Entry.Caller = zapcore.EntryCaller{
            Defined:  defined,
            PC:       frame.PC,
            File:     frame.File,
            Line:     frame.Line,
            Function: frame.Function,
        }
    }
    if log.addStack.Enabled(ce.Entry.Level) {
        ce.Entry.Stack = StackSkip("", log.callerSkip+callerSkipOffset).String
    }

    return ce
}
DPanic在非development下则退化为error模式,最后的info照样会输出,这样子在production下比较安全一点。

logger.check

zap@v1.16.0/logger.go

rrreee
logger.check方法会判断lvl,如果是zapcore.DPanicLevel,则会进一步判断是否是development模式,如果是会设置ce.Should(ent, zapcore.WriteThenPanic)

小结

  • zap内部的level分为debug、info、warn、error、dpanic、panic、fatal这几种
  • SugaredLogger提供了debug、info、warn、error、panic、dpanic、fatal这几种方法(使用fmt.Sprint的默认格式zap 내부 레벨은 디버그, 정보, 경고, 오류, dpanic, 패닉, 치명적
  • DPanic
  • DPanic은 "개발 중 패닉"을 의미합니다. " 개발 중에는 PanicLevel에 기록하고, 그렇지 않으면 ErrorLevel에 기록합니다. DPanic을 사용하면 이론적으로는 가능하지만 실제로는 발생해서는 안 되는 오류를 프로덕션 환경에서 충돌 없이 포착하기가 더 쉽습니다.

    개발 중인 DPanic

    개발 시 rrreee
DPanic의 효과는 패닉 효과와 유사합니다. 최종 정보는 출력되지 않습니다.

프로덕션의 DPanic

rrreee
DPanic은 비정상 모드에서 오류 모드로 변질됩니다. 개발 모드 및 최종 정보는 여전히 출력되므로 프로덕션에서는 더 안전합니다. 🎜logger.check🎜🎜zap@v1.16.0/logger.go🎜rrreee🎜logger.check 메소드는 lvl을 결정합니다. zapcore.DPanicLevel이면 개발 모드인지 여부를 추가로 결정합니다. , ce.Shoud(ent, zapcore.WriteThenPanic)🎜Summary🎜
    🎜zap 내부 레벨은 debug, info, warning, error, dpanic, 패닉으로 구분됩니다. fatal🎜 🎜SugaredLogger는 디버그, 정보, 경고, 오류, 패닉, dpanic, 치명적인 메소드(fmt.Sprint의 기본 형식 사용)를 제공하며 f 및 w 형식도 지원합니다. 키-값 쌍 사용🎜🎜개발 중인 DPanic은 패닉과 비슷한 효과를 가지며, 개발되지 않은 상태에서는 오류 모드로 변질됩니다🎜🎜🎜

위 내용은 go zap의 SugaredLogger를 공부하도록 안내해 드리겠습니다!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제