2016-05-16 19 views
0

我有一些非常簡單的代碼,我將一些錯誤信息記錄到文件中。爲什麼本機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") 
} 

但是,無論何時在運行程序後打開文件,它總是空的。我究竟做錯了什麼?

+2

是不是'defer logFile.Close()'運行在init函數的結尾?這是否意味着你正在關閉記錄器下的文件? –

+0

@ChrisTavares GAH。所以我應該在'main()'中運行它呢? –

+0

@DougSmith把延期放在主位置,剩下的都不起作用;將所有的日誌配置移動到主要作品的頂部......例如這裏所建議的https://stackoverflow.com/questions/32619318/logging-to-a-file-in-golang – Snowman

回答

2

正如Doug已經指出的那樣,init()函數將始終在main()之前被調用,並且依次如此。這意味着當init()完成時,將在init()內排隊defer s,在這種情況下將關閉您的日誌。

在大多數情況下,您根本不打算撥打log.Close()。請注意,在log所有Fatal功能將os.Exit

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

和文檔上os.Exit明確地說defer s的不運行

// 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紅色函數。