iOS and Android Device Logs
Complete guide to viewing and filtering device logs on iOS and Android.
When to Use This Skill
- •User needs to see device logs
- •User is debugging crashes
- •User wants to filter logs by app
- •User needs real-time log streaming
- •User asks "how to see logs"
Quick Commands
bash
# iOS - Stream logs from connected device xcrun devicectl device log stream --device <UUID> # iOS - Stream from simulator xcrun simctl spawn booted log stream # Android - Stream all logs adb logcat # Android - Filter by package adb logcat --pid=$(adb shell pidof com.yourapp.id)
iOS Logs
Method 1: Console.app (GUI)
- •Open Console.app (Applications > Utilities)
- •Select your device in sidebar
- •Click "Start Streaming"
- •Use search to filter:
- •By process:
process:YourApp - •By subsystem:
subsystem:com.yourapp - •By message:
"error"
- •By process:
Method 2: devicectl (CLI - Recommended)
bash
# List connected devices xcrun devicectl list devices # Stream logs from specific device xcrun devicectl device log stream --device <DEVICE_UUID> # Stream with predicate filter xcrun devicectl device log stream --device <DEVICE_UUID> \ --predicate 'process == "YourApp"' # Stream specific log levels xcrun devicectl device log stream --device <DEVICE_UUID> \ --level error # Save to file xcrun devicectl device log stream --device <DEVICE_UUID> \ --predicate 'process == "YourApp"' > app_logs.txt
Method 3: simctl for Simulators
bash
# Stream logs from booted simulator xcrun simctl spawn booted log stream # Filter by process xcrun simctl spawn booted log stream --predicate 'process == "YourApp"' # Filter by subsystem xcrun simctl spawn booted log stream --predicate 'subsystem == "com.yourapp"' # Show only errors xcrun simctl spawn booted log stream --level error # Combine filters xcrun simctl spawn booted log stream \ --predicate 'process == "YourApp" AND messageType == error'
Method 4: Xcode Device Logs
- •Window > Devices and Simulators
- •Select device
- •Click "Open Console"
- •Or: View device logs for crash reports
iOS Log Predicate Examples
bash
# Process name --predicate 'process == "YourApp"' # Contains text --predicate 'eventMessage contains "error"' # Subsystem --predicate 'subsystem == "com.yourapp.plugin"' # Category --predicate 'category == "network"' # Log level --predicate 'messageType == error' # Combined --predicate 'process == "YourApp" AND messageType >= error' # Time-based (last 5 minutes) --predicate 'timestamp > now - 5m'
iOS Log Levels
| Level | Description |
|---|---|
default | Default messages |
info | Informational |
debug | Debug (hidden by default) |
error | Error conditions |
fault | Fault/critical |
Android Logs
Method 1: adb logcat (CLI)
bash
# Basic log stream adb logcat # Clear logs first, then stream adb logcat -c && adb logcat # Filter by tag adb logcat -s MyTag:D # Filter by priority adb logcat *:E # Only errors and above # Filter by package name adb logcat --pid=$(adb shell pidof com.yourapp.id) # Filter by multiple tags adb logcat -s "MyPlugin:D" "Capacitor:I" # Save to file adb logcat > logs.txt # Save to file with timestamp adb logcat -v time > logs.txt
Method 2: Android Studio Logcat (GUI)
- •View > Tool Windows > Logcat
- •Use filter dropdown:
- •Package:
package:com.yourapp - •Tag:
tag:MyPlugin - •Level:
level:error
- •Package:
- •Create saved filters for quick access
Method 3: pidcat (Better CLI Tool)
bash
# Install pidcat pip install pidcat # Stream logs for package pidcat com.yourapp.id # With tag filter pidcat -t MyPlugin com.yourapp.id
Android Log Priority Levels
| Letter | Priority |
|---|---|
| V | Verbose |
| D | Debug |
| I | Info |
| W | Warn |
| E | Error |
| F | Fatal |
| S | Silent |
adb logcat Format Options
bash
# Different output formats adb logcat -v brief # Default adb logcat -v process # PID only adb logcat -v tag # Tag only adb logcat -v time # With timestamp adb logcat -v threadtime # With thread and time adb logcat -v long # All metadata # Colorized output adb logcat -v color # Show recent logs (last N lines) adb logcat -d -t 100 # Show logs since timestamp adb logcat -v time -T "01-25 10:00:00.000"
Common Android Filters
bash
# Capacitor core logs adb logcat -s "Capacitor:*" # Plugin-specific logs adb logcat -s "CapacitorNativeBiometric:*" # WebView logs (JavaScript console) adb logcat -s "chromium:*" # JavaScript errors adb logcat | grep -i "js error\|uncaught" # Crash logs adb logcat | grep -iE "fatal|crash|exception" # Network logs adb logcat -s "OkHttp:*" "NetworkSecurityConfig:*"
Viewing Crash Logs
iOS Crash Logs
bash
# Copy crash logs from device xcrun devicectl device copy crashlog --device <UUID> ./crashes/ # View in Console.app # User Diagnostics Reports section # Or find at: # Device: Settings > Privacy > Analytics & Improvements > Analytics Data # Mac: ~/Library/Logs/DiagnosticReports/
Android Crash Logs
bash
# Get tombstone (native crash) adb shell cat /data/tombstones/tombstone_00 # Get ANR traces adb pull /data/anr/traces.txt # Get bugreport (comprehensive) adb bugreport > bugreport.zip
MCP Integration
Use MCP tools to fetch logs programmatically:
typescript
// Example MCP tool for fetching iOS logs
const logs = await mcp.ios.streamLogs({
device: 'booted',
predicate: 'process == "YourApp"',
level: 'debug',
});
// Example MCP tool for Android logs
const androidLogs = await mcp.android.logcat({
package: 'com.yourapp.id',
level: 'D',
});
Log Parsing Tips
Extract JavaScript Errors
bash
# iOS - JavaScript console logs xcrun simctl spawn booted log stream \ --predicate 'eventMessage contains "JS:"' # Android - WebView console adb logcat chromium:I *:S | grep "console"
Filter Network Requests
bash
# iOS xcrun simctl spawn booted log stream \ --predicate 'subsystem == "com.apple.network"' # Android adb logcat -s "NetworkSecurityConfig:*" "OkHttp:*"
Monitor Memory
bash
# iOS - Memory pressure xcrun simctl spawn booted log stream \ --predicate 'eventMessage contains "memory"' # Android - Memory info adb shell dumpsys meminfo com.yourapp.id
Troubleshooting
Issue: No Logs Showing
iOS:
- •Ensure device is trusted: Xcode > Window > Devices
- •Try restarting log stream
- •Check Console.app filters
Android:
- •Enable USB debugging
- •Run
adb devicesto verify connection - •Try
adb kill-server && adb start-server
Issue: Too Many Logs
Use filters:
bash
# iOS - Only your app --predicate 'process == "YourApp" AND messageType >= info' # Android - Only your package adb logcat --pid=$(adb shell pidof com.yourapp.id)
Issue: Missing Debug Logs
iOS: Debug logs are hidden by default
bash
# Enable debug logs xcrun simctl spawn booted log stream --level debug
Android: Ensure log level is set correctly
kotlin
Log.d("Tag", "Debug message") // D level
Best Practices
- •Use structured logging - Include context in log messages
- •Add timestamps - Helps correlate events
- •Filter early - Don't stream all logs
- •Save important logs - Redirect to file for later analysis
- •Use log levels appropriately - Debug for dev, error for production
Resources
- •iOS Unified Logging: https://developer.apple.com/documentation/os/logging
- •Android Logcat: https://developer.android.com/studio/debug/logcat
- •devicectl Reference: https://developer.apple.com/documentation/devicemanagement