fmt.Println — output to stdout without metadata. log.Println — output to stderr with timestamp and optional file/line info.
fmt.Println:
os.Stdout.(n int, err error).1// User output2fmt.Println("Welcome, " + name)3// Output: Welcome, Alice45// Formatted output6fmt.Printf("Score: %.2f\n", score)78// To custom writer9fmt.Fprintf(w, "Response: %v\n", data)
log.Println:
os.Stderr.os.Exit(1) on write error.1// Application logging2log.Println("Request from", r.RemoteAddr)3// Output: 2024/01/15 10:30:45 Request from 192.168.1.145// With source info6log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)7log.Println("Debug point")8// Output: 2024/01/15 10:30:45 main.go:42 Debug point910// Formatted log11log.Printf("User %d logged in from %s\n", userID, ip)
Structured logging (Go 1.21+):
1import "log/slog"23slog.Info("server started", "port", 8080)4slog.Error("request failed", "error", err, "path", r.URL.Path)
When to use fmt:
When to use log:
Common mistakes:
fmt.Println for logs (no timestamps).log.Println for user output (stderr).log.Fatal which exits immediately.