Golang中为什么在init函数初始化的logger在函数外无法使用?
Golang中为什么在init函数初始化的logger在函数外无法使用?
我正在尝试创建一个将日志输出到文件而非标准输出的日志记录器。我在 init 函数中初始化了日志记录器,但在 init 函数外部它却无法工作,也就是说,如果在 init 函数之外进行日志写入,就无法再写入日志了。
以下是代码示例:
var logger *log.Logger
func init() {
logFile, err := os.OpenFile("app-log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0664)
if err != nil {
fmt.Println("Failed to create the log file")
fmt.Println(err)
os.Exit(1)
}
defer logFile.Close()
logger = log.New(logFile, "log-prefix-here:", log.Ldate)
}
然后,如果我尝试在另一个函数中调用这个日志记录器,它就是不工作!!
func handlePanic() {
if message := recover(); message != nil {
logger.Fatalln("Panic occurred:", message)
}
}
更多关于Golang中为什么在init函数初始化的logger在函数外无法使用?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于Golang中为什么在init函数初始化的logger在函数外无法使用?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我找到了日志记录器没有向日志文件写入任何内容的原因。这是因为当 init 函数结束时,文件会被关闭,从而阻止了日志记录器向其写入。我找到的解决方案是将文件声明为包级变量,然后将 file.Close() 的调用移到 main 函数内部,这样文件就会在程序退出时关闭。
var (
logger *log.Logger
logFile *os.File
)
func init() {
logFile, err := os.OpenFile("app-log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0664)
if err != nil {
fmt.Println("Failed to create the log file")
fmt.Println(err)
os.Exit(1)
}
logger = log.New(logFile, "log-prefix-here:", log.Ldate)
}
func main() {
defer logFile.Close()
...

