Golang log.Fatal在致命错误中更改行号

huangapple go评论131阅读模式
英文:

Golang log.Fatal change line number in fatal error

问题

这个程序输出了以下内容:

app: 2015/10/24 11:28:15 example.go:22: 打开一些不存在的文件: 没有这样的文件或目录

这对应于fatal函数内部的一行代码,而不是逻辑上生成/处理错误的main函数内部。我有很多重复的错误处理代码,我想将其封装在一个函数中,但我不想失去具有信息性的行号的便利性。如何使我的fatal函数对与日志消息关联行号的机制透明,或者如何提前生成行号?

如果Go语言有预处理器/宏系统,这将是一个很好的用途。

package main

import (
	"log"
	"os"
)

// 配置为输出应用程序名称、行号、时间戳等的日志记录器
var mylog = log.New(os.Stderr, "app: ", log.LstdFlags|log.Lshortfile)

// 为了避免重复的错误处理代码,例如
//
// result, err := someOperation(argument0, argument1)
// if err != nil {
//     mylog.Fatal(err)
// }
//
// 我定义了以下函数

func fatal(err error) {
	if err != nil {
		mylog.Fatal(err)
	}
}

func main() {
	_, err := os.Open("some-crazy-non-existent-file")
	fatal(err)
}
英文:

This program emits
app: 2015/10/24 11:28:15 example.go:22: open some-crazy-non-existent-file: no such file or directory
which corresponds to a line inside the fatal function
instead of inside main where the error is logically being generated/handled. I have a lot of repetitive error handling code that I want to wrap in a function, but I don't want to lose the convenience of informative line numbers. How do I make my fatal function transparent to whatever mechanism associates line numbers with log messages, or generate the line number earlier?

This would be a wonderful use of a preprocessor / macro system if golang had one

package main

import (
	"log"
	"os"
)

// logger configured to emit app name, line number, timestamps etc.
var mylog = log.New(os.Stderr, "app: ", log.LstdFlags|log.Lshortfile)

// in order to avoid repetitive error handling code like
//
// result, err := someOperation(argument0, argument1)
// if err != nil {
//     mylog.Fatal(err)
// }
//
// I defined the following function

func fatal(err error) {
	if err != nil {
		mylog.Fatal(err)
	}
}

func main() {
	_, err := os.Open("some-crazy-non-existent-file")
	fatal(err)
}

答案1

得分: 3

你可以使用runtime.Caller(1)来获取调用你的致命函数的行号。

这里有一个在Play上的示例。

英文:

you can get the line number of whatever called your fatal function using runtime.Caller(1)

Here's an example on Play

huangapple
  • 本文由 发表于 2015年10月25日 02:38:09
  • 转载请务必保留本文链接:https://go.coder-hub.com/33321893.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定