likes
comments
collection
share

Go 编程 | 连载 22 - Go 的 Log

作者站长头像
站长
· 阅读数 12

一、Go 的 Log

日志是用来记录程序运行期间发生的情况,无论程序需不需要调试或者是否发生错误,都会产生日志,日志对于立即程序的运行过程或者排查错误原因非常有帮助。

很多应用程序都提供了日志功能,日志功能可以用来监听程序的健康状况、跟踪问题以及发现问题等。

Go 语言提供了 log 包,可以让应用程序能够将日志写入终端或者文件中。

package main

import (
   "fmt"
   "log"
)

func main(){

   log.Println("这是 Go 语言的日志信息")
   fmt.Println("fmt.Printf 标准输出函数信息")
   println("内置 print 函数输出")
}

执行上述代码,输出结果如下:

Go 编程 | 连载 22 - Go 的 Log

上述输出结果中 log 标准库下的 Println 函数的输出内容比较醒目而且带有日志输出的时间,fmt.Printlnfmt 包下的标准输出函数,println 是 Go 内置的标准输出\错误函数,虽然输出内容比 fmt.Println 醒目,但是没有日志输出时间。

Log 除了可以记录程序的运行过程外还可以记录程序发生的致命错误

package main

import (
   "errors"
   "fmt"
   "log"
)

func main(){

   div(1, 0)
   fmt.Println(div(2,1))
}

func div(x, y int) (res interface{}, err error){

   if y == 0 {
      res = nil
      err = errors.New("除数不能为 0")
      log.Fatal(err)
      return
   } else {
      res = x / y
      return
   }
}

执行上述代码,输出结果如下:

Go 编程 | 连载 22 - Go 的 Log

可以看出程序 log.Fatal 函数不仅输出了报错信息,并且使程序退出不再往下执行。

程序的日志不仅可以输出到终端,还可以记录到文件中,方便日后的追溯,将日志写入文件可以使用 Go 语言本身提供的功能也可以使用操作系统提供的功能

package main

import (
   "log"
   "os"
)

func main(){

   f, err := os.OpenFile("2022-09-02.log", os.O_APPEND | os.O_CREATE | os.O_RDWR, 0777)

   if err != nil {
      log.Fatal(err)
   }

   defer f.Close()

   log.SetOutput(f)

   for i := 1; i < 5; i++ {
      log.Printf("Log iteration %d", i)
   }

}

上述代码中 0777 表示存储日志信息文件的权限为可读可写可执行,执行上述代码,查看项目目录下的 2022-09-01.log 文件。

Go 编程 | 连载 22 - Go 的 Log

当然还可以使用操作系统提供的功能将日志输出从终端重定向到文件

// filename: ex3.go

package main

import (
   "log"
)

func main(){
   
   for i := 1; i < 5; i++ {
      log.Printf("Log iteration %d", i)
   }

}

在终端中执行命令 go run ex3.go > 2022-09-03.log 2>&1 既可将日志从控制台重定向到文件中。