【发布时间】:2019-07-25 14:18:45
【问题描述】:
在我的主函数中,我打开一个记录文本文件以使用延迟关闭方法在应用程序退出后将其关闭。但是,在每个新的一天开始时,我希望开始写入第二天的日志文件,但我不知道如何关闭前一天的文件并开始写入当前文件。
在我的主要功能中:
func main() {
f, err := os.OpenFile("2019-07-24.txt", os.O_RDWR | os.O_CREATE | os.O_APPEND, 0644)
if err != nil {
log.Fatalf("Error opening log file: %v", err)
}
defer f.Close()
log.SetOutput(f)
}
现在,当我在另一个包裹中收到新的一天的消息时:
func gateway() {
f, err := os.OpenFile("2019-07-25.txt", os.O_RDWR | os.O_CREATE | os.O_APPEND, 0644)
if err != nil {
log.Fatalf("Error opening log file: %v", err)
}
defer f.Close()
log.SetOutput(f)
}
如何从另一个包中获取指向前一天日志文件的指针,然后关闭它(除非应用程序完全关闭,否则不会调用延迟调用?
【问题讨论】:
-
你可以通过渠道来做。当打开一个新文件时 - 结果,返回一个通道。当你想打开另一个文件时,向通道发送一个信号(然后关闭前一个文件)并打开新的。
-
这是一个很好的建议,谢谢。
-
这个问题已经得到了很好的回答,但提供了一个可供考虑的替代方案——通常应用程序不应该真正负责管理自己的日志文件;它应该只是盲目地写入标准输出。然后,操作员可以选择将其通过管道传输到文件,并使用 logrotate 等专用工具管理文件,或者他们可以将其流式传输到集中式日志管理器,或任何必要的东西。我不同意所有12 factors,但我绝对同意那个。
标签: go