确保传递给log.SetOutput的文件已正确关闭

时间:2016-06-10 18:44:28

标签: logging go

考虑这个根据环境配置日志记录适配器的包,并允许在运行时更改日志记录输出。

package mylog

import (
    "log"
    "os"
    "io"
)

const StdOut = "STDOUT"

var logger *log.Logger

func init() {
    outputLocation := os.Getenv("MY_LOG_OUTPUT")
    if outputLocation == "" || outputLocation == StdOut {
        log.SetOutput(os.Stdout)
        return
    }

    f, _ := getFile(outputLocation)
    log.SetOutput(f)
}

func getFile(path string) (*os.File, error) {
    openFlags := os.O_WRONLY | os.O_APPEND | os.O_CREATE
    f, err := os.OpenFile(path, openFlags, 0666)
    if err != nil {
        return nil, err
    }

    return f, nil
}

func SetOutput(w io.Writer) {
    logger.SetOutput(w)
}

func Debug(v ...interface{}) {
    log.Println(v...)
}

我有两个问题:

  1. 无法确定传递给w的{​​{1}}是SetOutput
  2. 即使我可以肯定(反思?),我什么时候关闭呢?
  3. 编辑: 很难给出导致问题的用例的简单示例。例如,我将这个包导入一个运行和退出的简单程序,我可以公开一个方法来关闭日志文件并在该程序完成执行之前调用它(使用Closer或不使用)。真正的问题是长时间运行的进程(如Web服务器),除非进程终止,否则您不希望关闭日志。

    所以我的问题的一部分是,甚至有必要关闭文件吗?

0 个答案:

没有答案