为什么本机 Golang 记录器在全局变量时不记录?



我有一些非常简单的代码,将一些错误信息记录到文件中。

package main
import (
    "log"
    "os"
)
var testLogger *log.Logger
func init() {
    logFile, openErr1 := os.OpenFile("/home/doug/logs/test.log", os.O_CREATE|os.O_RDWR|os.O_APPEND, 0666)
    if openErr1 != nil {
        log.Println("Uh oh! Could not open log file.")
    }
    defer logFile.Close()
    testLogger = log.New(logFile, "PREFIX", log.Lshortfile|log.Ldate|log.Ltime)
}
func main() {
    testLogger.Println("meep meep")
}

然而,每当我在运行程序后打开文件时,它总是空的。我做错了什么?

正如Doug已经指出的,init()函数将始终在main()之前调用,并且按顺序调用。这意味着当init()完成时,init()中排队的defer将执行,在这种情况下,将关闭日志。

在大多数情况下,您根本不应该调用log.Close()。注意,log上的所有Fatal函数都将os.Exit:

https://golang.org/src/log/log.go?s=9087:9131#L295

os.Exit上的文档明确表示defer没有运行

// Exit causes the current program to exit with the given status code.
// Conventionally, code zero indicates success, non-zero an error.
// The program terminates immediately; deferred functions are not run.
func Exit(code int) {

因此,您可能会说,在发生致命错误时,标准lib会强制您不要使用log.Close()。有点暗示这没什么大不了的。

请注意,Panic函数在退出之前将运行defer红色函数。

最新更新