我有一些非常简单的代码,我将一些错误信息记录到一个文件中。
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) {
因此,您可能会说标准库会强制您在发生 fatal error 时不要log.Close()
。有点暗示这没什么大不了的。
请注意,Panic
函数将在退出前运行 defer
red 函数。
关于logging - 为什么本地 Golang 记录器在它是全局变量时不记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37264726/