Skip to content

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.prof

trace 工具 ​

bash
# 生成 trace 文件
go test -trace=trace.out

# 查看 trace
go tool trace trace.out