在 Go 專案中,日誌 (Logging) 是觀察系統行為、除錯與監控的關鍵。標準庫 log 與 Uber 開源的 zap 是最常見的兩大方案。本文針對 功能、效能、結構化能力、社群生態 等面向比較兩者,並提供選用建議與範例程式碼。

一、快速概覽

特性 log (標準庫) zap (Uber)
封裝位置 log 標準庫 go.uber.org/zap
API 風格 簡單函式:Println / Fatal 結構化:Info("msg", zap.String("k", v))
格式 純文字 JSON / Console (可切換)
性能 一般;使用 fmt.Fprintf 高性能;預先序列化、零 alloc path
日誌等級 無官方;需自管 Debug / Info / Warn / Error…
呼叫層級 全域 (package-level) 建議注入 *zap.Logger 物件
旋轉 / Hook 需第三方 (lumberjack) 同樣需組合 (lumberjack / zapcore)
社群生態 基本 豐富:zapcore, zaptest, logr adapter

二、用例對比

1. 標準庫 log

1
2
3
4
5
6
7
import "log"

func main() {
log.SetFlags(log.LstdFlags | log.Lshortfile) // 時間 + 行號
log.Println("server started")
log.Fatalf("fatal error: %v", err)
}

優勢:

  • 零依賴、跨版本穩定。
  • API 超簡單,新手友好。

限制:

  • 無等級,不利於動態過濾。
  • 無結構化欄位,難以與 ELK、Grafana Loki 解析。

2. zap (Sugared vs Non-Sugared)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import (
"go.uber.org/zap"
)

func main() {
// Production config:JSON + 時間戳 + caller
logger, _ := zap.NewProduction()
defer logger.Sync()

logger.Info("server started", zap.String("addr", ":8080"))

// Sugared logger:格式化 & key-value 混用
sugar := logger.Sugar()
sugar.Infof("user %d login", uid)
}

優勢:

  1. 零配置即可 JSON 結構化,天然支援集中式日誌平台。
  2. 超高性能:Benchmarks 指出 zap 在 JSON 模式下仍維持百萬級 QPS。
  3. 可插拔:自訂 zapcore.Core 輸出 Elastic、Kafka、stderr…。

劣勢:

  • API 相對複雜,需要理解 zap.FieldCore
  • 初始化成本高於 log,不適合簡單腳本。

三、性能實測 (參考官方 Benchmark)

logger 條件 logs/sec (ns/op)
log.Printf json 模擬 ~51k (19,500 ns)
zap (JSON) Production ~1.3M (770 ns)
zap (Console) Development ~600k

zap 採用 zapcore.BufferPool 與自訂 Encoder,減少動態 allocations,帶來量級差距。

四、選用時機

需求 建議
小工具、CLI、PoC 標準 log:不引入外部依賴
Web/微服務,需集中式 JSON zap (Production Config)
高頻寫入、大量欄位 zap:零 alloc 路徑
想保留 fmt 風格 zap.SugaredLoggerInfow, Errorf
需與 Kubernetes Loki / Elasticsearch 整合 zap + lumberjack / zapcore

五、彩蛋:將 log 轉發到 zap

1
2
3
logger, _ := zap.NewProduction()
zap.ReplaceGlobals(logger) // 全域 log 也導向 zap
log.SetOutput(zapwriter.Writer())

六、結語

標準庫 log 提供了 最簡單、最通用 的日誌方案;而 zap 則在 性能、結構化、等級控制 上全面升級,適合雲原生微服務與高流量應用。根據專案規模、觀測需求與效能瓶頸,選擇合適的 Logger,才能讓你的排錯體驗與系統可觀測性起飛。

Logging 不只是把字串寫出去,還關乎 可搜尋、可分析、可告警。選對工具,讓日誌成為你的超級雷達!