home / skills / rshankras / claude-code-apple-skills / logging-setup

logging-setup skill

/skills/generators/logging-setup

This skill replaces print statements with a structured Swift Logger setup, improving privacy, performance, and debugging across modules.

npx playbooks add skill rshankras/claude-code-apple-skills --skill logging-setup

Review the files below or copy the command above to add this skill to your agents.

Files (4)
SKILL.md
3.8 KB
---
name: logging-setup
description: Generates structured logging infrastructure using os.log/Logger to replace print() statements. Use when user wants to add proper logging, replace print statements, or set up app logging.
allowed-tools: [Read, Write, Edit, Glob, Grep, Bash, AskUserQuestion]
---

# 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:

1. **Categories needed?**
   - Network, Auth, UI, Data (defaults)
   - Custom categories?

2. **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:
```swift
// 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
1. Import in files: `import OSLog` (not needed if using AppLogger)
2. Replace print() calls with AppLogger.[category].[level]()
3. 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
1. Open Console.app
2. Filter by subsystem: `com.yourapp`
3. Filter by category: `Network`, `Auth`, etc.

### Testing Instructions
1. Add a test log: `AppLogger.general.debug("Test log")`
2. Run app, check Xcode console
3. 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

Overview

This skill generates a structured logging infrastructure using Apple's os.log/Logger to replace print() statements. It helps teams add categorized, privacy-aware, and performant logging across Swift apps (iOS, macOS) and provides migration guidance from print().

How this skill works

The skill inspects the codebase for print() calls and any existing os.log/Logger usage, then offers audit results or generates a new AppLogger.swift with subsystem and categories. It can run in audit, generate, or migrate modes to report print locations, create a logging facade, or automatically convert print() calls to Logger invocations with privacy annotations.

When to use it

  • When you want to replace print() statements with structured logging
  • When adding app-wide logging with subsystem/category separation
  • When you need privacy-safe logging (.public/.private/.sensitive)
  • When preparing debug vs Release logging behavior
  • When auditing a codebase for ad-hoc print debugging

Best practices

  • Use categories (Network, Auth, UI, Data, etc.) to filter logs in Console.app
  • Annotate sensitive values with .private or .sensitive to avoid leaking data
  • Prefer deferred Logger interpolation for performance in Release builds
  • Keep a single AppLogger facade to centralize subsystem and category definitions
  • Run an audit pass to classify print() uses before bulk migration

Example use cases

  • Audit: produce a file-by-file report of print() occurrences and suggested severity
  • Generate: create Logging/AppLogger.swift with default categories and usage examples
  • Migrate: replace print("User: \(email)") with AppLogger.auth.info("User: \(email, privacy: .private)")
  • Setup: add a logging bridge during rollout to avoid breaking runtime behavior
  • Debugging: add temporary debug logs that compile out in Release builds

FAQ

Which deployment targets support Logger?

Logger requires iOS 14+/macOS 11+; check your deployment target before generating the logger.

Will migration break existing behavior?

No—Logger preserves runtime logging in Debug and defers costly interpolation; tests and an audit pass are recommended before wide replacement.