为什么本地 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")

}

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


泛舟湖上清波郎朗
浏览 192回答 1
1回答

慕斯709654

正如 Doug 已经指出的那样,该init()函数将始终在 之前调用main(),并且顺序如此。这意味着当init()完成时,队列中的defersinit()将执行,在这种情况下关闭你的日志。在大多数情况下,您根本不打算打电话log.Close()。请注意,所有Fatal功能log都将os.Exit:https://golang.org/src/log/log.go?s=9087:9131#L295并且os.Exit明确说defers 的文档没有运行// 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) {因此,您可能会说标准库会log.Close()在发生致命错误时强制您不要这样做。有点暗示这没什么大不了的。Panic但是请注意,函数将defer在退出之前运行红色函数。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go