将Golang日志输出设置为文件不会在函数声明之外持久化
我有以下代码:将Golang日志输出设置为文件不会在函数声明之外持久化,go,logging,Go,Logging,我有以下代码: func main(){ initSetLogOutput() log.Println(“另一个日志”) } func initSetLogOutput(){ f、 err:=os.OpenFile(“errors.log”,os.O_RDWR | os.O_CREATE | os.O_APPEND,0666) 如果错误!=零{ log.Fatalf(“打开文件时出错:%v”,错误) } 延迟f.关闭() log.SetOutput(f) Println(“这是一个测试日志条目”
func main(){
initSetLogOutput()
log.Println(“另一个日志”)
}
func initSetLogOutput(){
f、 err:=os.OpenFile(“errors.log”,os.O_RDWR | os.O_CREATE | os.O_APPEND,0666)
如果错误!=零{
log.Fatalf(“打开文件时出错:%v”,错误)
}
延迟f.关闭()
log.SetOutput(f)
Println(“这是一个测试日志条目”)
}
编译后,我运行应用程序,得到第一个日志这是一个测试日志条目
,但第二个日志不会写入日志文件。这是什么原因造成的?log.SetOutput
的声明是否仅限于函数的范围?如何使日志输出选项在整个应用程序中保持不变
我的输出日志如下所示:
2019/01/10 15:53:36 This is a test log entry
2019/01/10 15:54:27 This is a test log entry
2019/01/10 15:55:43 This is a test log entry
2019/01/10 15:57:40 This is a test log entry
2019/01/10 16:02:27 This is a test log entry
在
initSetLogOutput()
中,您有一行defer f.Close()
行,这意味着在initSetLogOutput()
返回之前,文件将被关闭
而是在main()
的末尾将其关闭,如下所示:
func main() {
initSetLogOutput()
log.Println("Another log")
closeLogOutput()
}
var logFile *os.File
func initSetLogOutput() {
var err error
logFile, err = os.OpenFile("errors.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
log.Fatalf("error opening file: %v", err)
}
log.SetOutput(logFile)
log.Println("This is a test log entry")
}
func closeLogOutput() {
logFile.Close()
}
在
initSetLogOutput()
中,您有一行defer f.Close()
行,这意味着在initSetLogOutput()
返回之前,文件将被关闭
而是在main()
的末尾将其关闭,如下所示:
func main() {
initSetLogOutput()
log.Println("Another log")
closeLogOutput()
}
var logFile *os.File
func initSetLogOutput() {
var err error
logFile, err = os.OpenFile("errors.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
log.Fatalf("error opening file: %v", err)
}
log.SetOutput(logFile)
log.Println("This is a test log entry")
}
func closeLogOutput() {
logFile.Close()
}
您的
initSetLogOutput
在返回时关闭f
(defer f.Close()
),因此一旦它返回并且main
恢复,文件指针将关闭,记录器将无处写入。好的,我想知道这是否是原因,但我不确定什么是最佳做法。因此,我应该在应用程序关闭时编写一些代码关闭文件。您的initSetLogOutput
在返回时关闭f
(defer f.close()
),因此一旦它返回并且main
恢复,文件指针将关闭,记录器将无处写入。好的,我想知道这是否是原因,但我不确定什么是最佳实践。因此,我应该在应用程序关闭时编写一些代码关闭文件。感谢您帮助我更好地了解golang的流程工作方式感谢您帮助我更好地了解golang的流程工作方式