【问题标题】:Go Test delete logger.SetLogging log fileGo Test 删除 logger.SetLogging 日志文件
【发布时间】:2018-06-26 19:32:53
【问题描述】:

我有一个用于定义日志文件路径的函数的 TestCase,然后设置记录器,以便将 log.* 语句写入标准输出和日志文件:

lf, err := os.Create(logFile)
mw := io.MultiWriter(os.Stdout, lf)
log.SetOutput(mw)

在我的测试用例中,我试图在最后进行清理,但文件上似乎仍然存在锁定,这意味着 Os.Remove() 调用不起作用(甚至返回错误)

我尝试将 SetOutput 设置为 nil 以及使用 defer 语句。

func TestSetLogging(t *testing.T) {
// do stuff
...
log.Println("this should be in logger file")

// cleanup
log.SetOutput(nil)
defer os.Remove(logFile)
}

然而,日志文件仍然出现在磁盘上。如何删除此文件?

【问题讨论】:

  • 你不应该在函数末尾有一个 defer 调用。您是否在// do stuff 中提前退出测试?也许发布你所有的代码让事情变得更容易。

标签: go


【解决方案1】:

尝试调用:

lf.Close()

之前

os.Remove(logFile)

或者你可以替换

defer os.Remove(logFile)

与:

defer func() {
  lf.Close()
  os.Remove(logFile)
}()

【讨论】:

  • 我明白了。嗯不幸的是,该文件是在一个函数中创建的,而 lf 超出了范围。它确实解释了为什么会发生这种情况。
  • 我修改了设置日志记录的函数也返回 *os.File 句柄。然后使用了你的建议,但我不得不颠倒 defer 语句的顺序: defer os.Remove(logFile);推迟 lf.Close()
  • 您必须在删除文件之前关闭文件句柄。在关闭最后一个句柄之前,不会真正删除该文件。
猜你喜欢
  • 1970-01-01
  • 2010-11-16
  • 2014-07-02
  • 1970-01-01
  • 1970-01-01
  • 2017-10-22
  • 2011-07-30
  • 2016-07-12
  • 2015-10-19
相关资源
最近更新 更多