Go语言log库用法详解(附带实例)
Go 语言的 log 库用于执行简单的日志操作。log 库中的函数可以打印日志。
【实例 1】打印日志。使用 print 系列函数(即 Print()、Printf() 和 Println() 函数)打印日志;在使用 panic 系列函数打印日志的同时抛出 panic 异常(“致命错误!”)。代码如下:
其中,参数 flag 包含的内容如下:
【实例 2】使用标准 log 配置的函数打印日志。使用 Flags() 函数返回标准 log 输出配置;使用 SetFlags() 函数设置标准 log 输出配置(即日期、时间和“文件全路径名+行号”)。代码如下:
【实例 3】分别使用 Prefix() 函数和 SetPrefix() 函数,把日志的前缀设置为 MyLog: 后打印日志。代码如下:
【实例 4】分别使用 Prefix() 函数和 SetPrefix() 函数,把日志前缀设置为 MyLog: 并打印日志。代码如下:

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

图 2 运行程序后
Go语言log库中的函数
在 log 库中,包含 3 个用于打印日志的系列函数。这 3 个系列函数及其说明如下表所示。| 函数系列 | 说明 |
|---|---|
| 单纯地打印日志 | |
| 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 运行程序后
ICP备案:
公安联网备案: