52 lines
1.3 KiB
Go
52 lines
1.3 KiB
Go
|
|
// 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...)
|
||
|
|
}
|