Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
rshankras avatar

Logging Setup

  • 3 installs
  • 591 repo stars
  • Updated July 24, 2026
  • rshankras/claude-code-apple-skills

Generates structured logging using os.log/Logger to replace print() statements, with privacy controls and Console.app integration for iOS/macOS apps.

About

Replaces print() statements with Apple's structured os.log/Logger system, adding privacy controls and Console.app integration. A developer uses it to set up proper debug and production logging in an Apple app.

  • Migrates print() to os.log/Logger
  • Privacy controls and Console.app integration

Logging Setup by the numbers

  • 3 all-time installs (skills.sh)
  • +1 installs in the week ending Aug 5, 2026 (Skillselion tracking)
  • Ranked #458 of 596 Debugging skills by installs in the Skillselion catalog
  • Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/rshankras/claude-code-apple-skills --skill logging-setup

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs3
repo stars591
Last updatedJuly 24, 2026
Repositoryrshankras/claude-code-apple-skills

What it does

Generates structured logging using os.log/Logger to replace print() statements, with privacy controls and Console.app integration for iOS/macOS apps.

Files

SKILL.mdMarkdownGitHub ↗

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 executesDebug logs compiled out in Release
No filteringFilter by subsystem/category in Console.app
No privacy.private, .public, .sensitive annotations
String interpolation always runsDeferred evaluation (performance)
Not in Console.appFull 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:

// 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

Related skills

Debuggingmonitoring

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.