为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
泛舟湖上清波郎朗 2022-01-10 16:48:54
我有一些非常简单的代码,我将一些错误信息记录到文件中。package mainimport (    "log"    "os")var testLogger *log.Loggerfunc 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")}但是,每当我在运行程序后打开文件时,它总是为空的。我究竟做错了什么?
查看完整描述

1 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

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


在大多数情况下,您根本不打算打电话log.Close()。请注意,所有Fatal功能log都将os.Exit:


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


并且os.Exit明确说defers 的文档没有运行


// 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) {

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


Panic但是请注意,函数将defer在退出之前运行红色函数。


查看完整回答
反对 回复 2022-01-10
  • 1 回答
  • 0 关注
  • 191 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号