log 如何定位写日志的文件

发布于 2022-09-11 21:52:17 字数 490 浏览 31 评论 0

屏幕快照 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这个文件才对, 封装了下难道就获取不到最初调用日志记录的文件嘛

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

面犯桃花 2022-09-18 21:52:17

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方法再次封装,传入合适的调用深度,就能返回正确的文件了。

西瓜 2022-09-18 21:52:17

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文