将Golang日志输出设置为文件不会在函数声明之外持久化

将Golang日志输出设置为文件不会在函数声明之外持久化,go,logging,Go,Logging,我有以下代码: func main(){ initSetLogOutput() log.Println(“另一个日志”) } func initSetLogOutput(){ f、 err:=os.OpenFile(“errors.log”,os.O_RDWR | os.O_CREATE | os.O_APPEND,0666) 如果错误!=零{ log.Fatalf(“打开文件时出错:%v”,错误) } 延迟f.关闭() log.SetOutput(f) Println(“这是一个测试日志条目”

我有以下代码:

func main(){
initSetLogOutput()
log.Println(“另一个日志”)
}
func initSetLogOutput(){
f、 err:=os.OpenFile(“errors.log”,os.O_RDWR | os.O_CREATE | os.O_APPEND,0666)
如果错误!=零{
log.Fatalf(“打开文件时出错:%v”,错误)
}
延迟f.关闭()
log.SetOutput(f)
Println(“这是一个测试日志条目”)
}
编译后,我运行应用程序,得到第一个日志
这是一个测试日志条目
,但第二个日志不会写入日志文件。这是什么原因造成的?
log.SetOutput
的声明是否仅限于函数的范围?如何使日志输出选项在整个应用程序中保持不变

我的输出日志如下所示:

2019/01/10 15:53:36 This is a test log entry
2019/01/10 15:54:27 This is a test log entry
2019/01/10 15:55:43 This is a test log entry
2019/01/10 15:57:40 This is a test log entry
2019/01/10 16:02:27 This is a test log entry

initSetLogOutput()
中,您有一行
defer f.Close()
行,这意味着在
initSetLogOutput()
返回之前,文件将被关闭

而是在
main()
的末尾将其关闭,如下所示:

func main() {
    initSetLogOutput()
    log.Println("Another log")
    closeLogOutput()
}

var logFile *os.File

func initSetLogOutput() {
    var err error
    logFile, err = os.OpenFile("errors.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
    if err != nil {
        log.Fatalf("error opening file: %v", err)
    }

    log.SetOutput(logFile)
    log.Println("This is a test log entry")
}

func closeLogOutput() {
    logFile.Close()
}

initSetLogOutput()
中,您有一行
defer f.Close()
行,这意味着在
initSetLogOutput()
返回之前,文件将被关闭

而是在
main()
的末尾将其关闭,如下所示:

func main() {
    initSetLogOutput()
    log.Println("Another log")
    closeLogOutput()
}

var logFile *os.File

func initSetLogOutput() {
    var err error
    logFile, err = os.OpenFile("errors.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
    if err != nil {
        log.Fatalf("error opening file: %v", err)
    }

    log.SetOutput(logFile)
    log.Println("This is a test log entry")
}

func closeLogOutput() {
    logFile.Close()
}

您的
initSetLogOutput
在返回时关闭
f
defer f.Close()
),因此一旦它返回并且
main
恢复,文件指针将关闭,记录器将无处写入。好的,我想知道这是否是原因,但我不确定什么是最佳做法。因此,我应该在应用程序关闭时编写一些代码关闭文件。您的
initSetLogOutput
在返回时关闭
f
defer f.close()
),因此一旦它返回并且
main
恢复,文件指针将关闭,记录器将无处写入。好的,我想知道这是否是原因,但我不确定什么是最佳实践。因此,我应该在应用程序关闭时编写一些代码关闭文件。感谢您帮助我更好地了解golang的流程工作方式感谢您帮助我更好地了解golang的流程工作方式