【问题标题】:Why does logging to a file with a custom log.Logger fail?为什么使用自定义 log.Logger 记录到文件失败?
【发布时间】:2018-05-17 21:02:45
【问题描述】:

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

【问题讨论】:

  • 文件从init()返回时关闭。
  • 啊。我应该在哪里关闭它?

标签: go


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多