gpt4 book ai didi

go - 在其他函数中调用时记录器无法写入

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

注:golang语言新手

这是我编写的用于检查行为的示例程序 hello.go,我看到了一个问题,即我没有看到 Logger 在 init() 以外的任何函数中写入任何内容。

package main  
import (
"fmt"
"os"
"io"
"log"
)
var (
testLogger *log.Logger
)
func init() {
test_log := "/tmp/t1.log"
fmt.Printf("Logs are saved to %v\n", test_log)
f, err := os.OpenFile(test_log, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600)
if err != nil {
fmt.Printf("ERROR Can't create log file! Reason: %v \n", err)
os.Exit(1)
}
defer f.Close()
multiWriter := io.MultiWriter(f)
testLogger = log.New(multiWriter, "", log.Ldate|log.Ltime|log.Lshortfile)
testLogger.Printf("in init..")
}
func main() {
pretest()
test()
testLogger.Printf("Back to main ... ")
}
func pretest() {
testLogger.Printf("In pretest ... ")
}
func test() {
testLogger.Printf("in test..")
}

这是正在写入的文件的输出和内容:

➜ ./你好
日志保存到/tmp/t1.log
➜ cat/tmp/t1.log
2018/06/28 11:23:25 hello.go:27: 在初始化中..

据我所知,在同一个包中共享的 testLogger 应该可以被每个函数访问并且能够被使用。如果我的理解有误,请指正?我在代码中遗漏了什么吗?请提供有关此问题的任何指示或引用?谢谢。

最佳答案

defer f.Close()

您正在 init 函数中执行 defer,这意味着该文件将在 init 函数完成后立即关闭。

由于 init 函数在 main 之前运行,当您尝试从所有其他函数写入时,该文件将已经关闭。

defer 移至 main 函数,以便在程序退出时将其关闭。

请注意,在这种特定情况下,您甚至不需要关闭 os.File,因为默认情况下 File 有一个 finalizer 可以在收集时自行关闭由 GC(参见此处的 newFile 函数:https://golang.org/src/os/file_unix.go)。

关于go - 在其他函数中调用时记录器无法写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51089365/

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