You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							358 lines
						
					
					
						
							8.4 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							358 lines
						
					
					
						
							8.4 KiB
						
					
					
				
								---
							 | 
						|
								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
							 | 
						|
								
							 |