template-monorepo/internal/library/errlog/log.go

52 lines
1.3 KiB
Go
Raw Permalink Normal View History

2026-05-19 11:00:28 +00:00
// Package errlog provides optional logging helpers for gateway/internal/library/errors.
// Keep logging out of the core errors package so callers can use slog, zap, or any logger.
package errlog
import (
"context"
"log/slog"
errs "gateway/internal/library/errors"
)
// Attrs builds structured fields for any logger from an *errs.Error.
func Attrs(e *errs.Error) []any {
if e == nil {
return nil
}
attrs := []any{
"code", e.DisplayCode(),
"scope", e.Scope(),
"category", e.Category(),
"detail", e.Detail(),
"http_status", e.HTTPStatus(),
"grpc_code", e.GRPCCode().String(),
}
if cause := e.Unwrap(); cause != nil {
attrs = append(attrs, "cause", cause)
}
return attrs
}
// Log writes a structured log line for e using slog.
func Log(ctx context.Context, log *slog.Logger, level slog.Level, e *errs.Error, msg string, attrs ...any) {
if log == nil || e == nil {
return
}
args := append(Attrs(e), attrs...)
log.Log(ctx, level, msg, args...)
}
// Error logs at slog.LevelError.
func Error(ctx context.Context, log *slog.Logger, e *errs.Error, msg string, attrs ...any) {
Log(ctx, log, slog.LevelError, e, msg, attrs...)
}
// Warn logs at slog.LevelWarn.
func Warn(ctx context.Context, log *slog.Logger, e *errs.Error, msg string, attrs ...any) {
Log(ctx, log, slog.LevelWarn, e, msg, attrs...)
}