log 如何定位写日志的文件

屏幕快照 2019-08-20 下午8.30.01
clipboard.png
我简单的封装了下golang自带的log方法, 然后写个test:
屏幕快照 2019-08-20 下午8.31.16
clipboard.png

然后日志打印结果:
屏幕快照 2019-08-20 下午8.31.50
clipboard.png

实际我想要的是, test文件写的错误日志, 那么日志信息中的文件应该定位到file_test这个文件才对, 封装了下难道就获取不到最初调用日志记录的文件嘛

阅读 3.9k
2 个回答

golang的日志包中,打印日志文件的方法最终调用的是:

//log/log.go
func Println(v ...interface{}) {
    std.Output(2, fmt.Sprintln(v...))
}

这里调用了std.Output,且第一个参数为调用栈的深度。这里传入了2,正好是PrintlnOutput这两次调用的深度。而你代码中对此又封装了两层,导致获取的最终调用位置是错误的。

//实现获取调用方文件的方法
    if l.flag&(Lshortfile|Llongfile) != 0 {
        // Release lock while getting caller info - it's expensive.
        l.mu.Unlock()
        var ok bool
        _, file, line, ok = runtime.Caller(calldepth)
        if !ok {
            file = "???"
            line = 0
        }
        l.mu.Lock()
    }

你可以直接对Output方法再次封装,传入合适的调用深度,就能返回正确的文件了。

新手上路,请多包涵

你Error函数里面的实现,是获取当前代码的文件的行数吧,不是获取的调用当前函数的文件和行数

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题