企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
### 用 defer 打印日志 本节将介绍与日志记录相关的`defer`应用。该技术的目的是帮助你更好地组织功能的日志记录信息。该试例程序的名称是`logDefer.go`,它将分为三个部分。 第一部分代码: ```Go package main import ( "fmt" "log" "os" ) var LOGFILE = "/tmp/mGo.log" func one(aLog *log.Logger) { aLog.Println("-- FUNCTION one ------") defer aLog.Println("-- FUNCTION one ------") for i := 0; i < 10; i++ { aLog.Println(i) } } ``` 名为`one()`的函数正在使用`defer`来确保第二个`aLog.Println()`调用将在该函数即将返回之前执行。因此,该函数的所有日志消息都将被嵌入在打开`aLog.Println()`和关闭`aLog.Println()`之间。这样,在日志文件中查看该功能的日志消息就会容易得多。 第二部分代码: ```Go func two(aLog *log.Logger) { aLog.Println("---- FUNCTION two") defer aLog.Println("FUNCTION two ------") for i := 10; i > 0; i-- { aLog.Println(i) } } ``` 名为`two()`的函数仍然使用`defer`方便地对其日志消息进行分组。但是,这次`two()`使用的消息格式与函数`one()`略有不同,不过这完全取决于你。 最后一部分代码: ```Go func main() { f, err := os.OpenFile(LOGFILE,os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { fmt.Println(err) return } defer f.Close() iLog := log.New(f, "logDefer ", log.LstdFlags) iLog.Println("Hello there!") iLog.Println("Another log entry!") one(iLog) two(iLog) } ``` 执行`logDefer.go`将不会在控制台产生输出。但是,查看程序正在使用的日志文件`/tmp/mGo.log`的内容,你就知道`defer`到底有多方便了: ```shell $ cat /tmp/mGo.log logDefer 2019/01/19 21:15:11 Hello there! logDefer 2019/01/19 21:15:11 Another log entry! logDefer 2019/01/19 21:15:11 -- FUNCTION one ------ logDefer 2019/01/19 21:15:11 0 logDefer 2019/01/19 21:15:11 1 logDefer 2019/01/19 21:15:11 2 logDefer 2019/01/19 21:15:11 3 logDefer 2019/01/19 21:15:11 4 logDefer 2019/01/19 21:15:11 5 logDefer 2019/01/19 21:15:11 6 logDefer 2019/01/19 21:15:11 7 logDefer 2019/01/19 21:15:11 8 logDefer 2019/01/19 21:15:11 9 logDefer 2019/01/19 21:15:11 -- FUNCTION one ------ logDefer 2019/01/19 21:15:11 ---- FUNCTION two logDefer 2019/01/19 21:15:11 10 logDefer 2019/01/19 21:15:11 9 logDefer 2019/01/19 21:15:11 8 logDefer 2019/01/19 21:15:11 7 logDefer 2019/01/19 21:15:11 6 logDefer 2019/01/19 21:15:11 5 logDefer 2019/01/19 21:15:11 4 logDefer 2019/01/19 21:15:11 3 logDefer 2019/01/19 21:15:11 2 logDefer 2019/01/19 21:15:11 1 logDefer 2019/01/19 21:15:11 FUNCTION two ------ ```