在其他功能中调用时记录仪无法写入

时间:2018-06-28 18:37:13

标签: go

注意:golang语言的新手

这是示例程序hello.go,我编写该程序是为了检查行为,并且看到的问题是,除了init()之外,其他任何函数都没有Logger编写任何东西。

package main  
import (
    "fmt"
    "os"
    "io"
    "log"
)  
var (
  testLogger *log.Logger
)  
func init() {
    test_log := "/tmp/t1.log"
    fmt.Printf("Logs are saved to %v\n", test_log)
    f, err := os.OpenFile(test_log, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600)
    if err != nil {
        fmt.Printf("ERROR  Can't create log file! Reason: %v \n", err)
        os.Exit(1)
    }
    defer f.Close()
    multiWriter := io.MultiWriter(f)
    testLogger = log.New(multiWriter, "", log.Ldate|log.Ltime|log.Lshortfile)
    testLogger.Printf("in init..")
}  
func main() {
    pretest()
    test()
    testLogger.Printf("Back to main ... ")
}  
func pretest() {
    testLogger.Printf("In pretest ... ")
}  
func test() {
  testLogger.Printf("in test..")    
}

这是正在写入的文件的输出和内容:

➜./hello
日志保存到/tmp/t1.log
➜cat /tmp/t1.log
2018/06/28 11:23:25 hello.go:27:初始化..

AFAIK,在同一软件包中共享的testLogger应该可以被每个函数访问并能够使用。如果我的理解是错误的,请纠正我?我在代码中缺少任何内容吗?请提供有关此问题的任何指针或参考?谢谢。

1 个答案:

答案 0 :(得分:4)

defer f.Close()

您正在defer函数中执行init,这意味着init函数完成后,文件将立即关闭。

由于init函数在main之前运行,因此当您尝试从所有其他函数进行写入时,该文件将已经关闭。

defer移至主要功能,以便在程序退出时将其关闭。

请注意,在这种特定情况下,您甚至不需要关闭os.File,因为默认情况下,当GC收集文件时,文件具有一个finalizer可以自行关闭(请参阅{{1 }}的功能:https://golang.org/src/os/file_unix.go)。