tercul-backend/internal/observability/logger.go
Damir Mukimov d50722dad5
Some checks failed
Test / Integration Tests (push) Successful in 4s
Build / Build Binary (push) Failing after 2m9s
Docker Build / Build Docker Image (push) Failing after 2m32s
Test / Unit Tests (push) Failing after 3m12s
Lint / Go Lint (push) Failing after 1m0s
Refactor ID handling to use UUIDs across the application
- Updated database models and repositories to replace uint IDs with UUIDs.
- Modified test fixtures to generate and use UUIDs for authors, translations, users, and works.
- Adjusted mock implementations to align with the new UUID structure.
- Ensured all relevant functions and methods are updated to handle UUIDs correctly.
- Added necessary imports for UUID handling in various files.
2025-12-27 00:33:34 +01:00

61 lines
1.7 KiB
Go

package observability
import (
"context"
"os"
"time"
"github.com/rs/zerolog"
"go.opentelemetry.io/otel/trace"
)
// Logger is a wrapper around zerolog.Logger to provide a consistent logging interface.
type Logger struct {
*zerolog.Logger
}
// NewLogger creates a new Logger instance.
// It writes to a human-friendly console in "development" environment,
// and writes JSON to stdout otherwise.
func NewLogger(serviceName, environment string) *Logger {
var logger zerolog.Logger
if environment == "development" {
logger = zerolog.New(zerolog.ConsoleWriter{Out: os.Stderr, TimeFormat: time.RFC3339}).With().
Timestamp().
Str("service", serviceName).
Logger()
} else {
zerolog.TimeFieldFormat = time.RFC3339
logger = zerolog.New(os.Stdout).With().
Timestamp().
Str("service", serviceName).
Logger()
}
return &Logger{&logger}
}
// Ctx returns a new logger with context-specific fields, such as trace and span IDs.
func (l *Logger) Ctx(ctx context.Context) *Logger {
log := l.Logger // log is a *zerolog.Logger
span := trace.SpanFromContext(ctx)
if span.SpanContext().IsValid() {
// .Logger() returns a value, not a pointer.
// We create a new logger value...
newLogger := log.With().
Str("trace_id", span.SpanContext().TraceID().String()).
Str("span_id", span.SpanContext().SpanID().String()).
Logger()
// ...and then use its address.
log = &newLogger
}
// `log` is now the correct *zerolog.Logger, so we wrap it.
return &Logger{log}
}
// With adds a key-value pair to the logger's context.
func (l *Logger) With(key string, value interface{}) *Logger {
newLogger := l.Logger.With().Interface(key, value).Logger()
return &Logger{&newLogger}
}