gpt4 book ai didi

logging - 我应该在 Go 中关闭日志文件吗?

转载 作者:IT王子 更新时间:2023-10-29 01:44:43 26 4
gpt4 key购买 nike

我在 utils 包的 init() 方法中创建了一个全局 Logger

```

 package utils

var Logger *log.Logger

func init() {

logFile, _ := config.Configure.String("log_file")
if len(logFile) == 0 {
appRoot, _ := os.Getwd()
logFile = filepath.Join(appRoot, "app_runtime.log")
}

f, err := os.OpenFile(logFile, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
//Look HERE!!!

if err != nil {
panic(err)
}
Logger = log.New()

//Log as JSON
Logger.Formatter = &log.JSONFormatter{}

//Output to stdout
//When production, use file
Logger.Out = f

// Only log the debug severity or above.
Logger.Level = log.DebugLevel
}

```

所以,我可以这样使用它:

utils.Logger.Info("这是调试信息")

我的问题是:我应该关闭日志文件吗?怎么办?

最佳答案

默认情况下,os.File将在应用程序退出时由垃圾收集器 (GC) 完成。来自 SetFinalizer文档

The finalizer for obj is scheduled to run at some arbitrary time after obj becomes unreachable. There is no guarantee that finalizers will run before a program exits, so typically they are useful only for releasing non-memory resources associated with an object during a long-running program. For example, an os.File object could use a finalizer to close the associated operating system file descriptor when a program discards an os.File without calling Close, but it would be a mistake to depend on a finalizer to flush an in-memory I/O buffer such as a bufio.Writer, because the buffer would not be flushed at program exit.

如果不想依赖GC,可以在main函数中手动关闭,如下:

func main() {
//Close log writer when exit
defer func(){
if file, ok := Logger.Out.(*os.File); ok {
file.Sync()
file.Close()
} else if handler, ok := Logger.Out.(io.Closer); ok {
handler.Close()
}
}()

//Your original codes
//...
}

在上面的代码中,我们使用defer 语句来确保handler 在应用程序退出时关闭。由于 Logger.Out 可能被定义为 io.Writer,我们需要测试 Logger.Out 是否也实现了 io.Closer ,如果是,则关闭。如果 Logger.Out 是一个 os.File,我们还调用 Sync() 以确保所有内容都写入磁盘。

编辑
引用文档并添加 file.Sync() 以确保将文件内容写入磁盘。

关于logging - 我应该在 Go 中关闭日志文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44667733/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com