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
iOS - Stream logs from connected device
xcrun devicectl device log stream --device
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" Method 2: devicectl (CLI - Recommended)
List connected devices
xcrun devicectl list devices
Stream logs from specific device
xcrun devicectl device log stream --device
Stream with predicate filter
xcrun devicectl device log stream --device
Stream specific log levels
xcrun devicectl device log stream --device
Save to file
xcrun devicectl device log stream --device
Method 3: simctl for Simulators
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
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)
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 Create saved filters for quick access Method 3: pidcat (Better CLI Tool)
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
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
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
Copy crash logs from device
xcrun devicectl device copy crashlog --device
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
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:
// 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
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
iOS
xcrun simctl spawn booted log stream \ --predicate 'subsystem == "com.apple.network"'
Android
adb logcat -s "NetworkSecurityConfig:" "OkHttp:"
Monitor Memory
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 devices to verify connection Try adb kill-server && adb start-server Issue: Too Many Logs
Use filters:
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
Enable debug logs
xcrun simctl spawn booted log stream --level debug
Android: Ensure log level is set correctly
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