首页 > 解决方案 > 为什么使用自定义 log.Logger 记录到文件失败?

问题描述

我无法让我的程序从 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,那就可以了。

标签: go

解决方案


defer 将在函数结束时执行,这意味着您的文件将在 init 函数结束时关闭,甚至在您运行 main 之前。在 main 结束之前你不应该关闭你的文件,所以也许考虑将你的 loggers 和文件的初始化移动到 main 而不是 init 的开头。


推荐阅读