func (log Logger) Warn(arg0 interface{}, args ...interface{}) error {
const (
lvl = WARNING
)
var msg string
switch first := arg0.(type) {
case string:
// Use the string as a format string
msg = fmt.Sprintf(first, args...)
case func() string:
// Log the closure (no other arguments used)
msg = first()
default:
// Build a format string so that it will be similar to Sprint
msg = fmt.Sprintf(fmt.Sprint(first)+strings.Repeat(" %v", len(args)), args...)
}
log.intLogf(lvl, msg)
return errors.New(msg)
}
func (log Logger) Info(arg0 interface{}, args ...interface{}) {
const (
lvl = INFO
)
switch first := arg0.(type) {
case string:
// Use the string as a format string
log.intLogf(lvl, first, args...)
case func() string:
// Log the closure (no other arguments used)
log.intLogc(lvl, first)
default:
// Build a format string so that it will be similar to Sprint
log.intLogf(lvl, fmt.Sprint(arg0)+strings.Repeat(" %v", len(args)), args...)
}
}
这两个功能来自log4go库的源代码,我不知道为什么Warn(实际上所有级别都高于Warn)与Info不同,为什么Warn函数Sprintf首先是msg而Info将所有args传递给iniLogf函数来处理日志记录?是因为如果在那个时间流程中止,关闭可能会被遗漏吗?
答案 0 :(得分:2)
最可能的解释是,由于Logger.Warn
方法返回error
值,因此重构为首先保存登录变量msg
所需的值,然后单独记录它,并将其作为错误返回。
Logger.Info
同时会在可能的情况下尽快记录消息,因为不需要返回消息。
这似乎是这些功能运作方式的唯一区别。