首页 > 编程笔记 > Go语言笔记 阅读:4

Go语言log库用法详解(附带实例)

Go 语言的 log 库用于执行简单的日志操作。log 库中的函数可以打印日志。

Go语言log库中的函数

在 log 库中,包含 3 个用于打印日志的系列函数。这 3 个系列函数及其说明如下表所示。

表:log 库中用于打印日志的 3 个系列函数及其说明
函数系列 说明
print 单纯地打印日志
panic 打印日志,抛出 panic 异常
fatal 打印日志,强制结束程序

【实例 1】打印日志。使用 print 系列函数(即 Print()、Printf() 和 Println() 函数)打印日志;在使用 panic 系列函数打印日志的同时抛出 panic 异常(“致命错误!”)。代码如下:
package main

import (
    "fmt"
    "log"
)

func main() {
    defer fmt.Println("发生了 panic 错误!")
    log.Print("my log")
    log.Printf("my log %d", 404)
    name := "David"
    age := 26
    log.Println(name, ":", age)
    log.Panic("致命错误!")
}
运行结果如下:

2023/09/29 09:48:08 my log
2023/09/29 09:48:09 my log 404
2023/09/29 09:48:09 David : 26
2023/09/29 09:48:09 致命错误!
发生了 panic 错误!
panic: 致命错误!

goroutine 1 [running]:
log.Panic(0xc00007bf10?, 0x5?, 0xc00007bf10?)
    D:/Go/src/log/log.go:388 +0x65
main.main()
    d:/VSCode/GoDemos/tempCodeRunnerFile.go:15 +0x18a
exit status 2

标准log配置

在默认情况下,log 只打印时间,但在开发过程中,开发者还需要获取文件名、代码行号等重要信息。为此,log 包还提供两个标准 log 配置函数。
func Flags() int     // 返回标准 log 输出配置
func SetFlags(flag int) // 设置标准 log 输出配置

其中,参数 flag 包含的内容如下:
const (
    // 控制输出日志信息的细节,不能控制输出的顺序和格式。
    // 输出的日志在每项后使用冒号分隔,
    // 例如:2023/09/29 10:07:11.123123 /a/b/c/d.go:23: message
    Ldate         = 1 << iota // 日期,2023/09/29
    Ltime                     // 时间,10:07:11
    Lmicroseconds             // 微秒级时间,10:07:11.123123(用于增强 Ltime)
    Llongfile                 // 文件全路径名+行号,/a/b/c/d.go:23
    Lshortfile                // 文件名+行号,d.go:23(会覆盖掉 Llongfile)
    LUTC                      // 使用 UTC 时间
    LstdFlags = Ldate | Ltime // 标准 logger 的初始值
)

【实例 2】使用标准 log 配置的函数打印日志。使用 Flags() 函数返回标准 log 输出配置;使用 SetFlags() 函数设置标准 log 输出配置(即日期、时间和“文件全路径名+行号”)。代码如下:
package main

import (
    "fmt"
    "log"
)

func main() {
    i := log.Flags()
    fmt.Printf("i: %v\n", i)
    log.SetFlags(log.Ldate | log.Ltime | log.Llongfile)
    log.Print("my log")
}
运行结果如下:

i: 3
2023/09/29 10:30:29 d:/VSCode/GoDemos/demo_5.go:12: my log

日志前缀配置

log 包还包含两个日志前缀配置的函数:
func Prefix() string        // 返回日志的前缀配置
func SetPrefix(prefix string) // 设置日志前缀

【实例 3】分别使用 Prefix() 函数和 SetPrefix() 函数,把日志的前缀设置为 MyLog: 后打印日志。代码如下:
package main

import (
    "fmt"
    "log"
)

func main() {
    log.SetPrefix("MyLog: ")
    s := log.Prefix()
    fmt.Printf("s: %v\n", s)
    log.Print()
}
运行结果为:

s: MyLog:
MyLog: 2023/09/29 11:08:28

把日志输出到文件中

在上面的实例中都是把日志打印在控制台上。如何把日志输出到文件呢?Go 语言的 log 库提供了 SetOutput() 函数。SetOutput() 函数的语法格式如下:
func SetOutput(w io.Writer)

【实例 4】分别使用 Prefix() 函数和 SetPrefix() 函数,把日志前缀设置为 MyLog: 并打印日志。代码如下:
package main

import (
    "log"
    "os"
)

func main() {
    f, err := os.OpenFile("demo_07.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
    if err != nil {
        log.Panic("打开日志文件时发生异常!")
    }
    log.SetOutput(f)
    log.Print("MyLog: 日志写入文件")
}
运行程序前,当前项目目录的结构如下图所示:


图 1 运行程序前

运行程序后,当前项目目录的结构如下图所示:


图 2 运行程序后

相关文章