Is it possible to wrap logrus.Logger functions without losing the line number prefix?
func Info(args ...interface{}) {
if logger.Level >= logrus.InfoLevel {
entry := logger.WithFields(logrus.Fields{})
entry.Data["file"] = fileInfo(2)
entry.Info(args...)
}
}
相同的错误在StackOverflow中找到了,大佬的思路主要是,通过自己调用runtime库将信息添加到fields上面。
上述解决方案可以虽然能解决问题,但是还存在一些美中不足的地方,比如打印的时候打印出两个显示行号的字段(fields),
fields.file="reader_writer_seqparation_test.go:70" file="reader_writer_seqparation_test.go:70
经过测试得出以下结论,由于没有分析源码,目前无法解答为什么会出现这样的问题
对于删除键值的"fields.file",也经过测试,但是效果是一样,也就说是肯定会有键值"fields.file"
func Info(args ...interface{}) {
if logger.Level >= logrus.InfoLevel {
// entry := logger.WithFields(logrus.Fields{}) // work!
entry := logrus.NewEntry(logger) // work!
// (x) double line info
entry.Data["file"] = fileInfo(2)
// (√) only one
entry.Data["fields.file"] = fileInfo(2)
entry.Info(args...)
}
}
如果用户恰好有一个同名的”file“字段不就被我们输出的行号信息给覆盖掉了吗?
在这种解决方法下,对于这个问题似乎没有根除的方法,当然都写这么key值复杂了,几乎没什么可能会重复。