Add documentation for the new logging config options (output and level),
including usage examples, field reference table, and updated project
structure listing the internal/logging package.
Add a 'logging' section to config.yaml supporting:
- output: stderr (default), stdout, or a file path
- level: debug, info, warn, error (default: info)
Implementation:
- New internal/logging package with Setup() for output destination
and Logger struct with level-aware Debug/Info/Warn/Error methods
- Config struct extended with Logging section (output + level fields)
- Hub refactored to accept *logging.Logger via constructor injection
- main.go initializes logging early after config load
The leveled logger suppresses messages below the configured threshold
while maintaining the stdlib log format. File output uses append mode
with 0644 permissions for safe log rotation.
🤖 Assisted by the code-assist SOP
- Fix metrics: change MessagesTotal, ConnectionsTotal, DisconnectionsTotal
from Gauge to Counter with proper _total naming convention
- Fix broadcast write-error handling: failed clients now get properly
removed with accurate metrics updates
- Add graceful shutdown: SIGINT/SIGTERM handling with 10s timeout,
CloseGoingAway frame sent to clients before disconnect
- Add integration tests: 11 tests using real WebSocket connections
covering connect, broadcast, disconnect, concurrency, and shutdown
- Fix example client port: changed from 8000 to 8443 to match config
- Rewrite README.md to reflect current features and usage
- Add AGENTS.md and .agents/summary/ documentation for AI assistants