Golang中为什么在init函数初始化的logger在函数外无法使用?

Golang中为什么在init函数初始化的logger在函数外无法使用? 我正在尝试创建一个将日志输出到文件而非标准输出的日志记录器。我在 init 函数中初始化了日志记录器,但在 init 函数外部它却无法工作,也就是说,如果在 init 函数之外进行日志写入,就无法再写入日志了。

以下是代码示例:

var logger *log.Logger

func init() {
	logFile, err := os.OpenFile("app-log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0664)

	if err != nil {
		fmt.Println("Failed to create the log file")
		fmt.Println(err)
		os.Exit(1)
	}

	defer logFile.Close()

	logger = log.New(logFile, "log-prefix-here:", log.Ldate)
} 

然后,如果我尝试在另一个函数中调用这个日志记录器,它就是不工作!!

func handlePanic() {
	if message := recover(); message != nil {
		logger.Fatalln("Panic occurred:", message)
	}
}

更多关于Golang中为什么在init函数初始化的logger在函数外无法使用?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中为什么在init函数初始化的logger在函数外无法使用?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我找到了日志记录器没有向日志文件写入任何内容的原因。这是因为当 init 函数结束时,文件会被关闭,从而阻止了日志记录器向其写入。我找到的解决方案是将文件声明为包级变量,然后将 file.Close() 的调用移到 main 函数内部,这样文件就会在程序退出时关闭。

var (
	logger  *log.Logger
	logFile *os.File
)

func init() {

	logFile, err := os.OpenFile("app-log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0664)

	if err != nil {
		fmt.Println("Failed to create the log file")
		fmt.Println(err)
		os.Exit(1)
	}

	logger = log.New(logFile, "log-prefix-here:", log.Ldate)
}

func main() {
	defer logFile.Close()
...
回到顶部