npx claudepluginhub cap-go/capgo-skills --plugin capacitor-qualityThis skill uses the workspace's default tool permissions.
Complete guide to viewing and filtering device logs on iOS and Android.
References xclog CLI to capture iOS simulator console output for runtime crashes, print/NSLog/os_log analysis using launch, attach, list modes with JSON output and preferences.
Guides debugging Capacitor apps on iOS/Android: WebView inspection via Safari/Chrome DevTools, native debugging in Xcode/Android Studio, crash logs, network analysis, and common issues.
Debugs mobile app crashes, performance issues, platform-specific bugs, device constraints, and connectivity problems on iOS and Android using Xcode, logs, and memory inspection.
Share bugs, ideas, or general feedback.
Complete guide to viewing and filtering device logs on iOS and Android.
# 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)
process:YourAppsubsystem:com.yourapp"error"# 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
# 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'
# 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'
| Level | Description |
|---|---|
default | Default messages |
info | Informational |
debug | Debug (hidden by default) |
error | Error conditions |
fault | Fault/critical |
# 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
package:com.yourapptag:MyPluginlevel:error# Install pidcat
pip install pidcat
# Stream logs for package
pidcat com.yourapp.id
# With tag filter
pidcat -t MyPlugin com.yourapp.id
| Letter | Priority |
|---|---|
| V | Verbose |
| D | Debug |
| I | Info |
| W | Warn |
| E | Error |
| F | Fatal |
| S | Silent |
# 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"
# 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:*"
# 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/
# 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
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',
});
# iOS - JavaScript console logs
xcrun simctl spawn booted log stream \
--predicate 'eventMessage contains "JS:"'
# Android - WebView console
adb logcat chromium:I *:S | grep "console"
# iOS
xcrun simctl spawn booted log stream \
--predicate 'subsystem == "com.apple.network"'
# Android
adb logcat -s "NetworkSecurityConfig:*" "OkHttp:*"
# iOS - Memory pressure
xcrun simctl spawn booted log stream \
--predicate 'eventMessage contains "memory"'
# Android - Memory info
adb shell dumpsys meminfo com.yourapp.id
iOS:
Android:
adb devices to verify connectionadb kill-server && adb start-serverUse filters:
# iOS - Only your app
--predicate 'process == "YourApp" AND messageType >= info'
# Android - Only your package
adb logcat --pid=$(adb shell pidof com.yourapp.id)
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