log.Fatal — logs and exits (os.Exit(1)). log.Panic — logs and panics (panic()).
log.Fatal:
os.Exit(1) after logging.1func main() {2 defer cleanup() // Will NOT run34 if err := startServer(); err != nil {5 log.Fatal("Server failed: ", err)6 }7}
log.Panic:
panic() after logging.recover().1func main() {2 defer func() {3 if r := recover(); r != nil {4 log.Printf("Recovered: %v", r)5 }6 }()78 defer cleanup() // Will run910 if err := startServer(); err != nil {11 log.Panic("Server failed: ", err)12 }13}
Variants:
log.Fatalf(format, args...) — formatted Fatal.log.Panicf(format, args...) — formatted Panic.log.Fatalln(args...) — Fatal with newline.log.Panicln(args...) — Panic with newline.When to use log.Fatal:
When to use log.Panic:
Common mistakes:
log.Fatal when cleanup is needed.log.Panic without recover().log.Fatal skips deferred functions.log.Fatal in goroutines (exits entire process).