通过Golang记录器写日志

时间:2018-12-10 15:21:53

标签: go logging

我正在尝试使用log.Logger来写日志,我的代码就像下面这样。我不明白为什么可以在initLog函数中使用Error来写入日志,但是在main函数中却无法将其写入日志文件。
有人可以帮我解释一下吗?
谢谢。

package main

import (
    "log"
    "net/http"
    "os"
)

const (
    PORT = ":8081"
)

var (
    Error *log.Logger
)

func initLog() {
    errorFile, err := os.OpenFile("error.log", os.O_RDWR|os.O_APPEND, 0660)
    defer errorFile.Close()

    if err != nil {
        log.Fatal(err)
    }

    Error = log.New(errorFile, "ERROR: ", log.Ldate|log.Ltime)
    Error.SetOutput(errorFile)
    Error.Println("Log error will be written into error.log")

}

func main() {
    initLog()
    Error.Println("Test write log")
    http.ListenAndServe(PORT, http.FileServer(http.Dir('.')))
}

2 个答案:

答案 0 :(得分:0)

使用initLog()defer errorFile.Close()返回时,您正在关闭文件,因此在main()内部,文件errorFile已关闭。

因此请对此行发表评论:

defer errorFile.Close()

并将其移至main()

答案 1 :(得分:0)

您正在defer errorFile.Close()中呼叫initLog()initLog()一旦返回,就会执行defer,因此,当在您的main中调用Error.Println("Test write log")时,io.Writer已经关闭。

另外,您应该先检查错误,然后再像这样致电defer <what ever you need to do>

errorFile, err := os.OpenFile("error.log", os.O_RDWR|os.O_APPEND, 0660)
if err != nil {
    log.Fatal(err)
}
defer errorFile.Close()