4.5 日志与调试
log 包基础
go
import "log"
// 标准日志
log.Println("普通日志")
log.Printf("格式化日志:%s", "info")
// 输出到文件
file, _ := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
defer file.Close()
log.SetOutput(file)
// 自定义前缀
log.SetPrefix("[APP] ")
// 添加日期时间
log.SetFlags(log.LstdFlags | log.Lmicroseconds | log.Lshortfile)结构化日志
go
// zap
import "go.uber.org/zap"
logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("用户登录",
zap.String("username", "alice"),
zap.Int("user_id", 123),
)
// zerolog
import "github.com/rs/zerolog"
logger := zerolog.New(os.Stdout).With().Timestamp().Logger()
logger.Info().
Str("username", "alice").
Int("user_id", 123).
Msg("用户登录")pprof 性能分析
go
import (
_ "net/http/pprof"
"runtime/pprof"
)
// HTTP pprof
// 访问 http://localhost:6060/debug/pprof/
func main() {
http.ListenAndServe("localhost:6060", nil)
}
// CPU 分析
f, _ := os.Create("cpu.prof")
defer f.Close()
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
// 内存分析
f, _ = os.Create("mem.prof")
defer f.Close()
runtime.GC()
pprof.WriteHeapProfile(f)
// 使用分析文件
// go tool pprof cpu.prof
// go tool pprof -http=:8080 cpu.proftrace 工具
bash
# 生成 trace 文件
go test -trace=trace.out
# 查看 trace
go tool trace trace.out