0

我正在使用logrus登录golang。我使用以下语句进行日志记录。

logger.Info("")
logger.Errorf("Error message")

我的要求是仅在Errorf具有以下约束的语句中具有自定义字段(严重性)。

  1. 如果在日志语句中指定(例如:)logrus.WithField("severity", "critical").Errorf("Error message"),它应该打印指定的值,如下所示。
ERRO[0000] Error message            severity=critical
  1. 如果未指定,则应打印默认值。例如 this( logger.Errorf("Error message")) 日志语句应打印以下内容。
ERRO[0000] Error message            severity=normal

注意:这应该只发生在Errorf语句上,这意味着其他人应该正常工作。

有人可以建议我实现这一目标的方法吗?

4

1 回答 1

2

编写自定义Hook,将检查条目是否severity设置了字段,如果没有插入默认值。将该钩子附加到默认全局或您自己的记录器。

logrus.ErrorLevel您可以通过在返回值中仅包含该级别来限制挂钩仅在条目上触发Hook.Levels()

type ErrorHook struct {
}

func (h *ErrorHook) Levels() []logrus.Level {
    // fire only on ErrorLevel (.Error(), .Errorf(), etc.)
    return []logrus.Level{logrus.ErrorLevel}
}

func (h *ErrorHook) Fire(e *logrus.Entry) error {
    // e.Data is a map with all fields attached to entry
    if _, ok := e.Data["severity"]; !ok {
        e.Data["severity"] = "normal"
    }
    return nil
}

func main() {
    logrus.AddHook(&ErrorHook{})

    logrus.WithFields(logrus.Fields{"animal": "walrus"}).Info("A walrus appears")
    // time="2009-11-10T23:00:00Z" level=info msg="A walrus appears" animal=walrus
    logrus.WithFields(logrus.Fields{"animal": "walrus"}).Error("A error walrus appears")
    // time="2009-11-10T23:00:00Z" level=error msg="A error walrus appears" animal=walrus severity=normal
    logrus.WithFields(logrus.Fields{"animal": "walrus", "severity": "high"}).Error("An overriden severity error walrus appears")
    // time="2009-11-10T23:00:00Z" level=error msg="An overriden severity error walrus appears" animal=walrus severity=high
}
于 2022-01-07T07:58:47.773 回答