仅将自定义字段添加到 logrus 中的错误日志
Add custom field only to error logs in logrus
我正在使用 logrus
登录 golang。我使用以下语句进行日志记录。
logger.Info("")
logger.Errorf("Error message")
我的要求是仅在具有以下约束的 Errorf
语句中具有自定义字段(严重性)。
- 如果在日志语句中指定(例如:
logrus.WithField("severity", "critical").Errorf("Error message")
),它应该打印指定的值,如下所示。
ERRO[0000] Error message severity=critical
- 如果没有指定,它应该打印一个默认值。例如,此 (
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
}
我正在使用 logrus
登录 golang。我使用以下语句进行日志记录。
logger.Info("")
logger.Errorf("Error message")
我的要求是仅在具有以下约束的 Errorf
语句中具有自定义字段(严重性)。
- 如果在日志语句中指定(例如:
logrus.WithField("severity", "critical").Errorf("Error message")
),它应该打印指定的值,如下所示。
ERRO[0000] Error message severity=critical
- 如果没有指定,它应该打印一个默认值。例如,此 (
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
}