log
阅读提示
- 适用版本:Go 1.21+(示例在 Go 1.22 下验证;
log/slog需要 Go 1.21+)· 前置知识:语法基础-函数 · 阅读时长:约 8 分钟
Go 语言标准库 log 包实现了简单的日志。
go
func main() {
log.Println("日志")
log.Panicln("panic日志")
log.Fatalln("错误日志")
}Fatal 会在写入日志信息后调用os.exit(1),panic 则会抛出panic
前缀
go
func (l *Logger) Prefix() string //获取前缀
func (l *Logger) SetPrefix(prefix string) //设置前缀例子
go
func main() {
log.SetPrefix("[main]")
log.Println("日志")
log.Panicln("panic日志")
}Flag
方法
go
func (l *Logger) Flags() int //访问
func (l *Logger) SetFlags(flag int) //设置常量
go
const (
Ldate = 1 << iota // 日期
Ltime // 时间
Lmicroseconds // 微秒
Llongfile // 完成文件名称
Lshortfile // 短文件名称
LUTC // 时区
Lmsgprefix // 前缀
LstdFlags = Ldate | Ltime // 初始值
)例子
go
func main() {
log.SetFlags(log.Lshortfile | log.Lmicroseconds | log.Lmsgprefix | log.Ldate | log.Ltime)
log.Println("日志")
log.Panicln("panic日志")
}当然也可以使用log.SetOutput(w io.Writer)来设置日志的输出路径,也可以通过New方法创建自己的实例。
go
func New(out io.Writer, prefix string, flag int) *Logger总而言之,标准库的log包提供的功能并不够完善,我们通常会使用更加完善的第三方日志包,例如zap等等。
完整示例
下面的程序可以直接运行:复制到文件后执行 go run main.go,或粘贴到 Go Playground 运行。
go
package main
import (
"bytes"
"fmt"
"log"
)
func main() {
var buf bytes.Buffer
logger := log.New(&buf, "app: ", 0)
logger.Println("started")
logger.Printf("user=%s", "gopher")
fmt.Print(buf.String())
}预期输出:
text
app: started
app: user=gopher常见错误与踩坑
log.Fatal会调用os.Exit(1)。 延迟清理不会执行,库代码中不要使用。- 默认 logger 输出到 stderr。 可用
log.SetOutput重定向,或自建log.Logger。 - 时间戳需要设置 flag。
LstdFlags加日期时间,Lshortfile加调用位置。 - Logger 本身并发安全。 多个协程共用一个
*log.Logger没问题;但bytes.Buffer目标不是并发安全的。 - 可以看看
log/slog(Go 1.21+)。 结构化日志已经进入标准库,并能与 context 协作。
更新记录
- 2026-10-14:新增"阅读提示"、完整可运行示例(含预期输出)、常见错误与踩坑清单,以及本更新记录。
