--- alwaysApply: false --- # Logging Migration — Patterns and Examples > **Agent role**: Reference this file for specific migration patterns and examples when converting console.* calls to logger usage. ## Migration — Auto‑Rewrites (Apply Every Time) ### Exact Transforms - `console.debug(...)` → `logger.debug(...)` - `console.log(...)` → `logger.log(...)` (or `logger.info(...)` when clearly stateful) - `console.info(...)` → `logger.info(...)` - `console.warn(...)` → `logger.warn(...)` - `console.error(...)` → `logger.error(...)` ### Multi-arg Handling - First arg becomes `message` (stringify safely if non-string). - Remaining args map 1:1 to `...args`: `console.info(msg, a, b)` → `logger.info(String(msg), a, b)` ### Sole `Error` - `console.error(err)` → `logger.error(err.message, err)` ### Object-wrapping Cleanup Replace `{{ userId, meta }}` wrappers with separate args: `logger.info('User signed in', userId, meta)` ## Level Guidelines with Examples ### DEBUG Examples ```typescript logger.debug('[HomeView] reloadFeedOnChange() called'); logger.debug('[HomeView] Current filter settings', settings.filterFeedByVisible, settings.filterFeedByNearby, settings.searchBoxes?.length ?? 0); logger.debug('[FeedFilters] Toggling nearby filter', this.isNearby, this.settingChanged, this.activeDid); ``` **Avoid**: Vague messages (`'Processing data'`). ### INFO Examples ```typescript logger.info('[StartView] Component mounted', process.env.VITE_PLATFORM); logger.info('[StartView] User selected new seed generation'); logger.info('[SearchAreaView] Search box stored', searchBox.name, searchBox.bbox); logger.info('[ContactQRScanShowView] Contact registration OK', contact.did); ``` **Avoid**: Diagnostic details that belong in `debug`. ### WARN Examples ```typescript logger.warn('[ContactQRScanShowView] Invalid scan result – no value', resultType); logger.warn('[ContactQRScanShowView] Invalid QR format – no JWT in URL'); logger.warn('[ContactQRScanShowView] JWT missing "own" field'); ``` **Avoid**: Hard failures (those are `error`). ### ERROR Examples ```typescript logger.error('[HomeView Settings] initializeIdentity() failed', err); logger.error('[StartView] Failed to load initialization data', error); logger.error('[ContactQRScanShowView] Error processing contact QR', error, rawValue); ``` **Avoid**: Expected user cancels (use `info`/`debug`). ## Context Hygiene Examples ### Component Context ```typescript const log = logger.withContext('UserService'); log.info('User created', userId); log.error('Failed to create user', error); ``` If not using `withContext`, prefix message with `[ComponentName]`. ### Emoji Guidelines Recommended set for visual scanning: - Start/finish: 🚀 / ✅ - Retry/loop: 🔄 - External call: 📡 - Data/metrics: 📊 - Inspection: 🔍 ## Quick Before/After ### **Before** ```typescript console.log('User signed in', user.id, meta); console.error('Failed to update profile', err); console.info('Filter toggled', this.hasVisibleDid); ``` ### **After** ```typescript import { logger } from '@/utils/logger'; logger.info('User signed in', user.id, meta); logger.error('Failed to update profile', err); logger.debug('[FeedFilters] Filter toggled', this.hasVisibleDid); ``` ## Checklist (for every PR) - [ ] No `console.*` (or properly pragma'd in the allowed locations) - [ ] Correct import path for `logger` - [ ] Rest-parameter call shape (`message, ...args`) - [ ] Right level chosen (debug/info/warn/error) - [ ] No secrets / oversized payloads / throwaway context objects - [ ] Component context provided (scoped logger or `[Component]` prefix) **See also**: `.cursor/rules/development/logging_standards.mdc` for the core standards and rules. # Logging Migration — Patterns and Examples > **Agent role**: Reference this file for specific migration patterns and examples when converting console.* calls to logger usage. ## Migration — Auto‑Rewrites (Apply Every Time) ### Exact Transforms - `console.debug(...)` → `logger.debug(...)` - `console.log(...)` → `logger.log(...)` (or `logger.info(...)` when clearly stateful) - `console.info(...)` → `logger.info(...)` - `console.warn(...)` → `logger.warn(...)` - `console.error(...)` → `logger.error(...)` ### Multi-arg Handling - First arg becomes `message` (stringify safely if non-string). - Remaining args map 1:1 to `...args`: `console.info(msg, a, b)` → `logger.info(String(msg), a, b)` ### Sole `Error` - `console.error(err)` → `logger.error(err.message, err)` ### Object-wrapping Cleanup Replace `{{ userId, meta }}` wrappers with separate args: `logger.info('User signed in', userId, meta)` ## Level Guidelines with Examples ### DEBUG Examples ```typescript logger.debug('[HomeView] reloadFeedOnChange() called'); logger.debug('[HomeView] Current filter settings', settings.filterFeedByVisible, settings.filterFeedByNearby, settings.searchBoxes?.length ?? 0); logger.debug('[FeedFilters] Toggling nearby filter', this.isNearby, this.settingChanged, this.activeDid); ``` **Avoid**: Vague messages (`'Processing data'`). ### INFO Examples ```typescript logger.info('[StartView] Component mounted', process.env.VITE_PLATFORM); logger.info('[StartView] User selected new seed generation'); logger.info('[SearchAreaView] Search box stored', searchBox.name, searchBox.bbox); logger.info('[ContactQRScanShowView] Contact registration OK', contact.did); ``` **Avoid**: Diagnostic details that belong in `debug`. ### WARN Examples ```typescript logger.warn('[ContactQRScanShowView] Invalid scan result – no value', resultType); logger.warn('[ContactQRScanShowView] Invalid QR format – no JWT in URL'); logger.warn('[ContactQRScanShowView] JWT missing "own" field'); ``` **Avoid**: Hard failures (those are `error`). ### ERROR Examples ```typescript logger.error('[HomeView Settings] initializeIdentity() failed', err); logger.error('[StartView] Failed to load initialization data', error); logger.error('[ContactQRScanShowView] Error processing contact QR', error, rawValue); ``` **Avoid**: Expected user cancels (use `info`/`debug`). ## Context Hygiene Examples ### Component Context ```typescript const log = logger.withContext('UserService'); log.info('User created', userId); log.error('Failed to create user', error); ``` If not using `withContext`, prefix message with `[ComponentName]`. ### Emoji Guidelines Recommended set for visual scanning: - Start/finish: 🚀 / ✅ - Retry/loop: 🔄 - External call: 📡 - Data/metrics: 📊 - Inspection: 🔍 ## Quick Before/After ### **Before** ```typescript console.log('User signed in', user.id, meta); console.error('Failed to update profile', err); console.info('Filter toggled', this.hasVisibleDid); ``` ### **After** ```typescript import { logger } from '@/utils/logger'; logger.info('User signed in', user.id, meta); logger.error('Failed to update profile', err); logger.debug('[FeedFilters] Filter toggled', this.hasVisibleDid); ``` ## Checklist (for every PR) - [ ] No `console.*` (or properly pragma'd in the allowed locations) - [ ] Correct import path for `logger` - [ ] Rest-parameter call shape (`message, ...args`) - [ ] Right level chosen (debug/info/warn/error) - [ ] No secrets / oversized payloads / throwaway context objects - [ ] Component context provided (scoped logger or `[Component]` prefix) **See also**: `.cursor/rules/development/logging_standards.mdc` for the core standards and rules. ## Model Implementation Checklist ### Before Logging Migration - [ ] **Code Review**: Identify all `console.*` calls in the codebase - [ ] **Logger Import**: Verify logger utility is available and accessible - [ ] **Context Planning**: Plan component context for each logging call - [ ] **Level Assessment**: Determine appropriate log levels for each call ### During Logging Migration - [ ] **Import Replacement**: Replace `console.*` with `logger.*` calls - [ ] **Context Addition**: Add component context using scoped logger or prefix - [ ] **Level Selection**: Choose appropriate log level (debug/info/warn/error) - [ ] **Parameter Format**: Use rest-parameter call shape (`message, ...args`) ### After Logging Migration - [ ] **Console Check**: Ensure no `console.*` methods remain (unless pragma'd) - [ ] **Context Validation**: Verify all logging calls have proper context - [ ] **Level Review**: Confirm log levels are appropriate for each situation - [ ] **Testing**: Test logging functionality across all platforms