gpt4 book ai didi

logging - 是否可以在不丢失行号前缀的情况下包装 log.Logger 函数?

转载 作者:IT王子 更新时间:2023-10-29 01:08:29 26 4
gpt4 key购买 nike

当使用log.Lshortfile 标志时,记录器会在所有日志行前加上记录器函数调用的文件名和行号,例如:

myfile.go:14: Hello, world!

If I wrap the log function like this, for instance:

func info(pattern string, args ...interface{}) {
myLogger.Printf(pattern + "\n", args...)
}

此函数发出的每一行都将以 Printf 调用的行号作为前缀。这是预期的,但所需的行为是为每一行添加调用 info 的行的行号作为前缀。

有什么解决办法吗?

最佳答案

log.Logger的方法调用Logger.Output()方法将消息发送到适当的输出。 Logger.Output() 允许您传递 调用深度(要跳过的帧数)。

不幸的是,log.Logger 的方法包含 calldepth“已连接”,因此您无法提供偏移量来跳过包装函数的帧。

但更好的替代方法是从您的包装器中调用此 Logger.Output(),这样您就不必自己为帧和行操心了。另请注意,您不需要附加换行符 "\n",因为如果要记录的消息不以结尾,log.Logger 类型已经这样做了一个换行符。

所以更好更短的选择:

var myLogger = log.New(os.Stdout, "[my]", log.Lshortfile)

func info(pattern string, args ...interface{}) {
myLogger.Output(2, fmt.Sprintf(pattern, args...))
}

测试它:

func main() {
log.SetFlags(log.Lshortfile)
log.Println("hello")
info("world")
}

输出(在 Go Playground 上尝试):

main.go:11: hello
[my]main.go:12: world

如您所见,info() 打印出正确的行号(与上一行中 log.Println() 打印的行号相比 +1) .

关于logging - 是否可以在不丢失行号前缀的情况下包装 log.Logger 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42762391/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com