自定义Logger包装logrus.Logger导致丢失行号和文件名信息

论坛的解决思路

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值复杂了,几乎没什么可能会重复。

你可能感兴趣的:(golang,logrus)