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

零:

Logger在utils包的init()方法中创建了Global

```

 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("This is debug info")

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

方式:

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

obj的终结器计划在obj不可访问之后的任意时间运行。无法保证终结器会在程序退出之前运行,因此通常它们仅对在长时间运行的程序期间释放与对象关联的非内存资源有用。例如,当程序在不调用Close的情况下丢弃os.File时,os.File对象可以使用终结器关闭关联的操作系统文件描述符,但是依靠终结器来刷新内存中的I是错误的/ O缓冲区,例如bufio.Writer,因为该缓冲区不会在程序退出时刷新。

如果您不想依赖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语句来确保在应用程序退出时关闭处理程序。由于Logger.Out可能定义为io.Writer,因此我们需要测试是否Logger.Out也实现io.Closer,如果是,则将其关闭。如果Logger.Outos.File,我们还将调用Sync()以确保所有内容都已写入磁盘。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我应该在移动文件之前关闭它吗?

我应该在websocket中关闭mysql连接吗

我应该在哪里放置无主日志文件

我们还应该在Golang中关闭DB的.Prepare()吗?

我应该在Go中编写跨平台服务吗?

我应该在我的本机git repo中检查这个android文件夹吗?

我可以/应该在文件夹中组织我的30个课程吗?

我应该在我的.gitignore文件中添加yarn-error.log吗?

我应该在我的 .htaccess 文件中删除或添加一些东西吗?

我应该在.gitignore文件中添加Django迁移文件吗?

我应该在.gitingore文件中包括.vs文件夹吗?

我应该在公共GitHub存储库中包含build.gradle文件吗?

我应该在文件描述符中添加const吗?

我应该在自己的.py文件中创建每个类吗?

Ruby类设计-我应该在单独的文件中创建常量吗?

我应该在析构函数中写入文件末尾吗?

我应该在项目中的每个文件中添加__future__语句吗?

我应该在模板类头文件中包含所需的所有内容吗?

我应该在.gitignore文件中写jsconfig.json或tsconfig.json吗?

我应该在laravel 5.2中使用批量分配文件上传吗?

我应该在每个节点JS文件中调用dotenv吗?

我应该在virtualenv中pip install python吗?

我应该在备份中包含/ dev吗?

我应该在virtualenv中安装python 3吗?

我应该在构造函数中引发异常吗

我应该在Django模型中测试方法吗?

我应该在构造函数中构建对象吗?

我应该在模型中抛出HttpStatus异常吗?

我应该在onDestroyView中删除OnClickListener吗?