我有一些非常简单的代码,将一些错误信息记录到文件中。
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
红色函数。