# Story 0.3: Structured Logging System ## Metadata - **Story ID**: 0.3 - **Title**: Structured Logging System - **Epic**: 0 - Project Setup & Foundation - **Status**: Completed - **Priority**: High - **Estimated Time**: 4-6 hours - **Dependencies**: 0.1, 0.2 ## Goal Implement a production-ready logging system with structured JSON output, request correlation, and configurable log levels that can be used by all modules. ## Description This story implements a complete logging system using Zap that provides structured logging, request correlation via request IDs, and context-aware logging. The system must support both development (human-readable) and production (JSON) formats. ## Deliverables ### 1. Logger Interface (`pkg/logger/logger.go`) Define `Logger` interface with: - `Debug(msg string, fields ...Field)` - Debug level logging - `Info(msg string, fields ...Field)` - Info level logging - `Warn(msg string, fields ...Field)` - Warning level logging - `Error(msg string, fields ...Field)` - Error level logging - `With(fields ...Field) Logger` - Create child logger with fields - `WithContext(ctx context.Context) Logger` - Create logger with context fields - `Field` type for structured fields - Package-level convenience functions ### 2. Zap Implementation (`internal/logger/zap_logger.go`) Implement `Logger` interface using Zap: - Structured JSON logging for production mode - Human-readable console logging for development mode - Configurable log levels (debug, info, warn, error) - Request-scoped fields support - Context-aware logging (extract request ID, user ID from context) - Field mapping to Zap fields - Error stack trace support ### 3. Request ID Middleware (`internal/logger/middleware.go`) Gin middleware for request correlation: - Generate unique request ID per HTTP request - Add request ID to request context - Add request ID to all logs within request context - Return request ID in response headers (`X-Request-ID`) - Support for existing request IDs in headers ### 4. Global Logger Export (`pkg/logger/global.go`) - Export default logger instance - Package-level convenience functions - Thread-safe logger access ### 5. DI Integration - Provider function for Logger - Register in DI container - Make configurable via FX ## Implementation Steps 1. **Install Dependencies** ```bash go get go.uber.org/zap@v1.26.0 ``` 2. **Create Logger Interface** - Define `Logger` interface in `pkg/logger/logger.go` - Define `Field` type for structured fields - Add package documentation 3. **Implement Zap Logger** - Create `internal/logger/zap_logger.go` - Implement all interface methods - Support both JSON and console encoders - Handle log levels and field mapping 4. **Create Request ID Middleware** - Create `internal/logger/middleware.go` - Implement Gin middleware - Generate and propagate request IDs - Add to response headers 5. **Add Global Logger** - Create `pkg/logger/global.go` - Export default logger - Add convenience functions 6. **Integrate with DI** - Create provider function - Register in DI container - Test injection ## Acceptance Criteria - [x] `Logger` interface is defined and documented - [x] Zap implementation supports JSON and console formats - [x] Log levels are configurable and respected - [x] Request IDs are generated and included in all logs - [x] Request ID middleware works with Gin - [x] Context-aware logging extracts request ID and user ID - [x] Logger can be injected via DI container - [x] All modules can use logger through interface - [x] Request correlation works across service boundaries - [x] Structured fields work correctly ## Related ADRs - [ADR-0005: Logging Framework](../../adr/0005-logging-framework.md) - [ADR-0012: Logger Interface Design](../../adr/0012-logger-interface-design.md) ## Implementation Notes - Use Zap's production and development presets - Request IDs should be UUIDs or similar unique identifiers - Context should be propagated through all service calls - Log levels should be configurable via configuration system - Consider adding log sampling for high-volume production - Support for log rotation and file output (future enhancement) ## Testing ```bash # Test logger interface go test ./pkg/logger/... # Test Zap implementation go test ./internal/logger/... # Test request ID middleware go test ./internal/logger/... -run TestRequestIDMiddleware ``` ## Files to Create/Modify - `pkg/logger/logger.go` - Logger interface - `pkg/logger/global.go` - Global logger export - `internal/logger/zap_logger.go` - Zap implementation - `internal/logger/middleware.go` - Request ID middleware - `internal/di/providers.go` - Add logger provider - `config/default.yaml` - Add logging configuration