为什么使用自定义log.Logger记录到文件失败?

时间:2018-05-17 21:02:45

标签: go

我无法让我的程序从main()之外的函数写入日志文件 我确实看到了类似的https://stackoverflow.com/a/19966217/4374801,但没有解决我的确切问题 以下是我正在做的重要事项:

var (
    Info    *log.Logger
    Error   *log.Logger
)

func init() {  
    // set up log file                                                                                                       
    fileHandle, err := os.OpenFile("/var/log/checkcert", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)                          
    if err != nil {                                                                                                          
        log.Fatal(err)                                                                                                       
    }                                                                                                                        
    //defer to close when you're done with it                                                                                
    defer fileHandle.Close()                                                                                                 

    //set output of logs to fileHandle                                                                                       
    log.SetOutput(fileHandle)                                                                                                

    Info = log.New(fileHandle,                                                                                               
        "Log: ",                                                                                                             
        log.Ldate|log.Ltime|log.Lshortfile)                                                                                  

    Error = log.New(fileHandle,                                                                                              
        "Error: ",                                                                                                           
        log.Ldate|log.Ltime|log.Lshortfile)                                                                                  
} 

// The function below is called from main()
// The version here is truncated to the pertinent bit
func checkDomain(){
    Info.Println("test inside checkDomain")
}

上面创建了日志文件,但没有写测试。 如果我在init()中放置一个测试Println,那就行了。

1 个答案:

答案 0 :(得分:2)

defer将在函数结束时执行,这意味着在你运行main之前,你的文件将在init函数结束时关闭。您不应该在主要结束之前关闭文件,因此可能考虑将记录器和文件的初始化移动到main的开头而不是init。