仅将自定义字段添加到 logrus 中的错误日志

Add custom field only to error logs in logrus

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

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

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

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

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

有人可以建议我实现这个的方法吗??

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

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

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
}