51 lines
1.6 KiB
Markdown
51 lines
1.6 KiB
Markdown
# ADR-0005: Logging Framework
|
|
|
|
## Status
|
|
Accepted
|
|
|
|
## Context
|
|
The platform requires structured logging that:
|
|
- Supports multiple log levels
|
|
- Provides structured output (JSON for production)
|
|
- Allows adding contextual fields
|
|
- Performs well under load
|
|
- Integrates with observability tools
|
|
|
|
Options considered:
|
|
1. **go.uber.org/zap** - High-performance structured logging
|
|
2. **rs/zerolog** - Zero-allocation logger
|
|
3. **sirupsen/logrus** - Structured logger (maintenance mode)
|
|
4. **Standard library log** - Basic logging (insufficient)
|
|
|
|
## Decision
|
|
Use **go.uber.org/zap** (v1.26.0+) as the logging framework.
|
|
|
|
**Rationale:**
|
|
- Industry standard for high-performance Go applications
|
|
- Excellent structured logging with field support
|
|
- Very low overhead (designed for high-throughput systems)
|
|
- JSON output for production, human-readable for development
|
|
- Strong ecosystem integration
|
|
- Actively maintained by Uber
|
|
|
|
## Consequences
|
|
|
|
### Positive
|
|
- High performance (low latency, high throughput)
|
|
- Rich structured logging with fields
|
|
- Easy integration with observability tools
|
|
- Configurable output formats (JSON/console)
|
|
|
|
### Negative
|
|
- Slightly more verbose API than standard library
|
|
- Requires wrapping for common use cases (we'll abstract via interface)
|
|
|
|
### Implementation Notes
|
|
- Install: `go get go.uber.org/zap@v1.26.0`
|
|
- Create `pkg/logger/logger.go` interface to abstract zap
|
|
- Implement `internal/logger/zap_logger.go` as concrete implementation
|
|
- Use JSON encoder for production, console encoder for development
|
|
- Support request-scoped fields via context
|
|
- Export global logger via `pkg/logger` package
|
|
|