logging - 为什么本地 Golang 记录器在它是全局变量时不记录?

标签 logging go

我有一些非常简单的代码,我将一些错误信息记录到一个文件中。

package main

import (
    "log"
    "os"
)

var testLogger *log.Logger

func init() {
    logFile, openErr1 := os.OpenFile("/home/doug/logs/test.log", os.O_CREATE|os.O_RDWR|os.O_APPEND, 0666)

    if openErr1 != nil {
        log.Println("Uh oh! Could not open log file.")
    }

    defer logFile.Close()

    testLogger = log.New(logFile, "PREFIX", log.Lshortfile|log.Ldate|log.Ltime)
}

func main() {
    testLogger.Println("meep meep")
}

但是,每当我运行程序后打开文件时,它总是空的。我做错了什么?

最佳答案

正如 Doug 已经指出的那样,init() 函数将始终在 main() 之前被调用,并且顺序如此。这意味着当 init() 完成时,init() 中排队的 defer 将执行,在这种情况下关闭您的日志。

在大多数情况下,您根本不需要调用 log.Close()。请注意,log 上的所有 Fatal 函数都将 os.Exit:

https://golang.org/src/log/log.go?s=9087:9131#L295

os.Exit 上的文档明确说明 defer 未运行

// Exit causes the current program to exit with the given status code.
// Conventionally, code zero indicates success, non-zero an error.
// The program terminates immediately; deferred functions are not run.
func Exit(code int) {

因此,您可能会说标准库会强制您在发生 fatal error 时不要log.Close()。有点暗示这没什么大不了的。

请注意,Panic 函数将在退出前运行 deferred 函数。

关于logging - 为什么本地 Golang 记录器在它是全局变量时不记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37264726/

相关文章:

asp.net-mvc - 日志 MVC 管道

python - hadoop 流 : how to see application logs?

java - 如何将 spring-boot 指标保存为日志?

python - Sklearn,网格搜索 : how to print out progress during the execution?

go - 如何在 Go 中定义自己的类型转换器?

validation - Golang 是否允许使用元数据或属性?

arrays - 如何连接 Golang 中一个包的几个文件的数据?

go - 如何访问该“结构” slice 的新“类型”中的“结构”字段?

testing - 如何运行没有输出注释的 Go 示例?

java - 从 crontab 运行的 java 程序的日志结果 [权限被拒绝]