为什么包日志实例不能与Golang中的另一个包共享

时间:2016-02-26 02:20:35

标签: go

我的项目有一些软件包,我不想将日志实例从一个函数传递到另一个函数,而是在包中使用全局日志实例。

这是我已经完成的演示,但是运行go run main.go,在logs / replica.log中没有打印。

我的代码出了什么问题?

├── log
│   └── replica.log
├── logs
│   └── logs.go
├── main.go



$ cat main.go
package main

import (
    "./logs"
)

func main() {
    logs.Debug("hello")
}

$ cat logs/logs.go
package logs

import (
    logging "github.com/op/go-logging"
    "os"
)

var log = logging.MustGetLogger("replica")
var format = logging.MustStringFormatter(
    `%{time:2006-01-02 15:04:05} [%{level:.4s}] %{shortfile}: %{message}`,
)

func init() {
    f, err := os.OpenFile("log/replica.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
    if err != nil {
        panic(err)
    }
    defer f.Close()

    backend1 := logging.NewLogBackend(f, "", 0)
    backend1Formatter := logging.NewBackendFormatter(backend1, format)
    logging.SetBackend(backend1Formatter)
}

func Debug(args ...interface{}) {
    log.Debug(args)
}

1 个答案:

答案 0 :(得分:1)

是的,log / logs.go:init()中的延迟是个问题。为什么这个问题?我们来看看Go Language Spec,特别是关于Defer statements的部分:

  

“defer”语句调用一个函数,该函数的执行被推迟到周围函数[...]到达函数体[...]结束的那一刻。

当到达 init 函数体的末尾时,文件将关闭。请记住,没有好办法优雅地关闭全局文件。