日誌系統是任何軟體應用程式中不可或缺的一環。它為開發者和維運人員提供了洞察應用程式內部運作的窗口。一個好的日誌系統能幫助我們:
slog 是 Go 語言內建的日誌套件,旨在提供高效能且易於使用的日誌記錄功能。與其他第三方日誌庫相比,slog 的優勢在於:
在官方尚未提供 slog 之前,第三方的 log 工具如 logrus、zap 等已經廣泛使用,
這些工具各有特點,但在性能和易用性上可能存在差異。選擇適合的日誌工具能夠有效提升開發效率和系統穩定性。
有官方支持的 slog,能夠更好地與 Go 生態系統整合,減少外部依賴帶來的風險。
這就是為什麼選擇 slog 而不是其他的第三方 log 工具。
// internal/logger/logger.go
// Logger defines the interface for logging with context awareness.
type Logger interface {
With(ctx context.Context) Logger
WithAdditionalFields(fields map[string]any) Logger
Debug(ctx context.Context, msg string, args ...any)
Info(ctx context.Context, msg string, args ...any)
Warn(ctx context.Context, msg string, args ...any)
Error(ctx context.Context, msg string, args ...any)
}
// internal/logger/slogger.go
type slogger struct {
logger *slog.Logger
ctx context.Context
}
func NewSLogger(ctx context.Context, cfg config.LoggerConfig) Logger {
return &slogger{
logger: slog.New(getHandler(cfg)),
ctx: ctx,
}
}
func (l *slogger) With(ctx context.Context) Logger {
attrs := extractSlogAttributes(ctx)
return &slogger{
logger: l.logger.With(attrs...),
ctx: ctx,
}
}
func (l *slogger) WithAdditionalFields(fields map[string]any) Logger {
return &slogger{
logger: l.logger.With(l.getAttrs(fields, nil)...),
ctx: l.ctx,
}
}
...
internal/application/application.go
type Application struct {
Config *config.Config
Logger logger.Logger
}
func New(cfg *config.Config) (*Application, error) {
ctx := context.Background()
logger := logger.NewSLogger(ctx, cfg.Logger)
return &Application{
Config: cfg,
Logger: logger,
}, nil
}
cmd/api/main.go
// 在 main fucntion 添加
app, err := application.New(config)
if err != nil {
log.Fatalf("failed to create application: %v", err)
}
type Handler struct {
Logger logger.Logger
}
func NewHandler(logger logger.Logger) *Handler {
return &Handler{
Logger: logger,
}
}
func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
h.Logger.Info(ctx, "Received request", "method", r.Method, "url", r.URL)
// Handle the request...
}
在本篇文章中,我們探討了 Go 語言中的日誌系統設計問題,並介紹了 slog 作為解決方案。
透過 slog,我們能夠輕鬆地實現高效能的結構化日誌記錄,並在不同場景中保持一致性。
最終,我們實現了一個靈活的日誌系統,能夠支援上下文信息的捕獲與分析,提升了應用程式的可維護性與安全性。
在不斷添加資料夾跟檔案的當下,我們還沒有說明,
我們專案的 internel 資料夾底下的各個資料夾的分類用意
下一篇,我們來講講,專案架構的資料夾
以上程式碼的完整內容可以到 Github 觀看