我正在尝试使用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('.')))
}
答案 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()