1

我看到 Uber Zap 实现中有日志级别:

    const (
            // DebugLevel logs are typically voluminous, and are usually disabled in
            // production.
            DebugLevel Level = iota - 1
            // InfoLevel is the default logging priority.
            InfoLevel
            // WarnLevel logs are more important than Info, but don't need individual
            // human review.
            WarnLevel
            // ErrorLevel logs are high-priority. If an application is running smoothly,
            // it shouldn't generate any error-level logs.
            ErrorLevel
            // DPanicLevel logs are particularly important errors. In development the
            // logger panics after writing the message.
            DPanicLevel
            // PanicLevel logs a message, then panics.
            PanicLevel
            // FatalLevel logs a message, then calls os.Exit(1).
            FatalLevel
        ) 

当我在sigs.k8s.io/controller-runtime/pkg/log/zap记录器中设置级别时使用它,它go-logr在引擎盖下使用:

func determineLogLevel(verbosityLevel string) zapcore.Level {
    var zapLevel zapcore.Level
    verbosityLevel = strings.ToLower(verbosityLevel)
    switch verbosityLevel {
    case ERROR:
        zapLevel = zapcore.ErrorLevel
    case WARNING:
        zapLevel = zapcore.WarnLevel
    case INFO:
        zapLevel = zapcore.InfoLevel
    case DEBUG:
        zapLevel = zapcore.DebugLevel
    default:
        zapLevel = zapcore.InfoLevel
    }
    return zapLevel
}

// here zap is "sigs.k8s.io/controller-runtime/pkg/log/zap"
opts := zap.Options{
    StacktraceLevel: ... ,
    Level:           determineLogLevel("ERROR"),
    Encoder:         ... ,
    ZapOpts:         ...,
}

但也可以选择使用logr.Logger.V.

这里的水平值与 Uber Zap 的常量中的值相同吗?( DebugLevel, InfoLevel, WarnLevel, ....)

我也看到了这个:

flag --zap-log-level:Zap 级别以配置日志记录的详细程度。可以是“调试”、“信息”、“错误”或任何大于 0 的整数值之一,对应于增加详细程度的自定义调试级别”</p>

此标志值是否与'szapcore.Level中的相同?sigs.k8s.iozap.Options

的文档logr.Logger.V

    // V returns an Logger value for a specific verbosity level, relative to
    // this Logger.  In other words, V values are additive.  V higher verbosity
    // level means a log message is less important.  It's illegal to pass a log
    // level less than zero.
    V(level int) Logger
4

1 回答 1

2

go-logr和日志级别之间的对应关系go.uber.org/zap由下式给出:

zapLevel = -1 * logrLevel

换句话说,go-logr级别是级别的倒数zap。此信息可在go-logr/zapr包文档中找到:

logr 中的级别对应于 Zap 中的自定义调试级别。logr 中的任何给定级别都由其在 zap ( zapLevel = -1*logrLevel) 中的倒数表示。例如 V(2) 相当于 Zap 中的日志级别 -2,而 V(1) 相当于 Zap 的 DebugLevel。

您还可以通过查看logr.Logger.Vby zaprpackage 的实现来查看关卡如何初始化的具体示例:

func (zl *zapLogger) V(level int) logr.Logger {
    return &zapLogger{
        lvl: zl.lvl - zapcore.Level(level),
        l:   zl.l,
    }
}

该方法zapr.NewLogger构造一个zapr.zapLoggerwithlvl字段设置为zap.InfoLevel(您知道是0),因此每次调用V此实现时,它都会减去给定的 int 值,从而获得其负数。


该标志--zap-log-level从命令行(或 k8s yaml 配置)传递的字符串值映射到 Uber Zap 的级别,基于以下内容:

var levelStrings = map[string]zapcore.Level{
    "debug": zap.DebugLevel,
    "info":  zap.InfoLevel,
    "error": zap.ErrorLevel,
}

然后根据上面引用的文档的要求,将数值乘以-1然后设置为实现。logr.Logger

于 2021-11-01T14:26:20.447 回答