Logging Setup Generator
Replace print() statements with Apple's structured logging system (os.log/Logger) for better debugging, privacy controls, and Console.app integration.
When This Skill Activates
Use this skill when the user:
- Asks to "add logging" or "set up logging"
- Wants to "replace print statements"
- Mentions "os.log", "Logger", or "structured logging"
- Asks about "debug logging" or "production logging"
- Wants to audit print() usage in their codebase
Why Logger Over print()
| print() | Logger | |---------|--------| | Always executes | Debug logs compiled out in Release | | No filtering | Filter by subsystem/category in Console.app | | No privacy | .private, .public, .sensitive annotations | | String interpolation always runs | Deferred evaluation (performance) | | Not in Console.app | Full system integration |
Pre-Generation Checks
1. Project Context Detection
- [ ] Check deployment target (Logger requires iOS 14+ / macOS 11+)
- [ ] Search for existing Logger/os.log usage
- [ ] Identify source file locations (Sources/, App/, etc.)
2. Conflict Detection
Search for existing logging:
Glob: **/*Logger*.swift
Grep: "import OSLog" or "os_log"
If found, ask user:
- Extend existing logging?
- Replace with new implementation?
- Create separate logger?
Modes of Operation
Mode 1: Audit
Find all print() statements and report:
Grep: print\s*\(
Report format:
- File:line - print statement
- Severity: Info/Warning/Error (based on context)
- Suggested Logger level
Mode 2: Generate
Create logging infrastructure from scratch.
Mode 3: Migrate
Convert existing print() to Logger with suggestions.
Configuration Questions
Ask user via AskUserQuestion:
-
Categories needed?
- Network, Auth, UI, Data (defaults)
- Custom categories?
-
Include migration helpers?
- Extension on String for quick migration
- Temporary print-to-log bridge
Generation Process
Step 1: Create AppLogger.swift
Read template from templates/AppLogger.swift and customize:
- Set subsystem from Bundle.main.bundleIdentifier
- Add user-specified categories
- Include usage examples in comments
Step 2: Determine File Location
Check project structure:
- If
Sources/exists →Sources/Logging/AppLogger.swift - If
App/exists →App/Logging/AppLogger.swift - Otherwise →
Logging/AppLogger.swift
Step 3: Provide Migration Guidance
Show examples of converting common print patterns:
// Before
print("User logged in: \(email)")
// After
AppLogger.auth.info("User logged in: \(email, privacy: .private)")
Output Format
After generation, provide:
Files Created
[Path]/Logging/AppLogger.swift
Integration Steps
- Import in files:
import OSLog(not needed if using AppLogger) - Replace print() calls with AppLogger.[category].level
- Add privacy annotations for sensitive data
Privacy Annotations Guide
.public- Safe to log (IDs, counts, non-sensitive).private- Redacted in release (emails, names).sensitive- Always redacted (passwords, tokens)
Console.app Usage
- Open Console.app
- Filter by subsystem:
com.yourapp - Filter by category:
Network,Auth, etc.
Testing Instructions
- Add a test log:
AppLogger.general.debug("Test log") - Run app, check Xcode console
- Open Console.app, filter by your app's subsystem
References
- logger-patterns.md - Best practices and privacy levels
- migration-guide.md - Converting print() to Logger
- templates/AppLogger.swift - Template file