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 运行程序后