How to Configure Unified Log Stream Filtering, Predicate Syntax, and Log Archives in macOS

When diagnosing low-level kernel panics, intermittent Bluetooth peripheral disconnects, Spotlight indexing lockups, or background daemon crashes in macOS, traditional UNIX syslog files (/var/log/system.log) prove fundamentally inadequate. Modern macOS versions route all operating system telemetry, framework events, and application debugging output through Apple’s centralized Unified Logging System (ULS). Generating millions of events per minute, the ULS architecture utilizes high-speed in-memory circular ring buffers and compressed binary .tracev3 files.

Because the volume of unified logging telemetry is staggering, attempting to read raw log output results in overwhelming terminal noise. Mastering the log command-line utility and NSPredicate query syntax is indispensable for Apple systems administrators, Mac developers, and digital forensics examiners. By constructing targeted predicate filters, elevating private data visibility, and collecting forensic .logarchive bundles, engineers can pinpoint elusive system anomalies with surgical precision.

Architectural Overview: The macOS Unified Logging Engine

The Unified Logging System operates through an optimized kernel and userspace pipeline designed for minimal CPU overhead:

Component Technical Architecture Operational Behavior
In-Memory Ring Buffers Volatile Circular Kernel Buffers Captures high-frequency Debug and Info events in RAM; discarded after seconds if not persisted.
Persistent Datastores /var/db/diagnostics/ & uuidtext/ Stores Default, Error, and Fault messages compressed in proprietary .tracev3 binary files.
Privacy Masking Engine Automatic PII Redaction Dynamically replaces user strings (usernames, file paths, URLs) with <private> tokens to prevent data leaks.
Diagnostic Log Archive Self-Contained .logarchive Package Encapsulates trace files and UUID symbol tables into an offline bundle portable across Macs.

Streaming Live Logs with Precision NSPredicate Filters

The log stream subcommand provides real-time event tailing. Always pair it with --predicate to isolate relevant daemons.

Step 1: Filter by Subsystem and Category

In Apple’s logging framework, well-architected applications declare reverse-DNS Subsystems and functional Categories:

# Stream Time Machine backup events in real time
log stream --predicate 'subsystem == "com.apple.TimeMachine"'

# Stream Wi-Fi connectivity and airportd events
log stream --predicate 'subsystem == "com.apple.wifi" and category == "core"'

Step 2: Filter by Process and Executable Path

To inspect events originating strictly from a specific background process:

# Stream logs from the Spotlight indexing daemon (mds)
log stream --process mds

# Target background binaries matching a specific filesystem path prefix
log stream --predicate 'processImagePath BEGINSWITH "/Applications/EnterpriseApp.app"'

Step 3: Capture Volatile Debug and Info Messages

By default, log stream omits Info and Debug level messages to conserve terminal buffer bandwidth. Include them explicitly using the --level flag:

# Stream all levels including in-memory debug traces
log stream --level debug --predicate 'subsystem == "com.apple.securityd"'

NSPredicate String Syntax and Logical Operators

Apple’s predicate engine supports rich logical expressions, regular string evaluation, and comparison operators:

Predicate Expression Query Matching Logic Example Use Case
eventMessage CONTAINS[c] "keyword" Case-insensitive substring match inside log message body. --predicate 'eventMessage CONTAINS[c] "authentication failed"'
messageType == 16 Isolates Fault level events (Default=0, Info=1, Debug=2, Error=16, Fault=17). --predicate 'messageType == 17'
subsystem BEGINSWITH "com.apple.bluetooth" Matches any subsystem within the Bluetooth hierarchy. Isolates all Bluetooth audio, peripheral, and LE pairing daemons.
senderImagePath ENDSWITH "libsystem_kernel.dylib" Matches events originating from specific dynamic libraries. Debugs kernel-level system call faults.

Revealing Redacted Private Data in Diagnostic Logs

When inspecting network transactions or authentication failures, unified logs frequently display:

Sending request for user <private> to host <private> with token <private>

To lift privacy redactions on local test machines during software development and forensic investigations:

Step 1: Enable Private Data Logging System-Wide

Execute an elevated terminal command to toggle privacy masking:

# Enable private data logging across the operating system
sudo log config --mode "private_data:on"

Step 2: Stream with Visible Text Strings

Launch your filtered stream; unmasked text now renders in place of <private> tokens:

log stream --predicate 'subsystem == "com.enterprise.vpn"'

Step 3: Restore Privacy Protection

Always re-engage privacy masking when investigation concludes to protect sensitive user credentials:

# Re-enable privacy masking
sudo log config --mode "private_data:off"

Collecting and Analyzing Forensic .logarchive Bundles

When an incident occurs on an executive’s MacBook (such as a kernel crash or network breach), streaming live logs is too late. Collect a historical .logarchive snapshot containing past system state.

Step 1: Collect Historical Log Archive

Run the log collect command specifying the historical time window:

# Collect the last 2 hours of system-wide logs into a compressed bundle
sudo log collect --last 2h --output ~/Desktop/Incident_Report.logarchive

macOS aggregates active .tracev3 files from /var/db/diagnostics/ alongside symbol resolution tables from /var/db/uuidtext/ into a single directory package.

Step 2: Interrogate the Archive Offline

You can transport Incident_Report.logarchive to any Mac and inspect historical events without affecting the client machine:

# Query the offline archive using predicates
log show --archive ~/Desktop/Incident_Report.logarchive \
  --predicate 'subsystem == "com.apple.kernel" and messageType == 17' \
  --style compact

Troubleshooting macOS Unified Logging and Predicate Errors

Consult this diagnostic reference table to resolve query syntax faults and missing log events:

Issue / Error Message Underlying Root Cause Remediation Procedure
log: Invalid predicate: parse error Quotation mark collision or unsupported predicate operator in terminal shell. Enclose entire predicate in single quotes ('...') and internal string values in double quotes ("..."): --predicate 'subsystem == "com.apple.wifi"'.
Historical log events missing when querying past hours. High log volume pushed older events out of the circular buffer, or Mac went into deep sleep (Hibernate mode 25). Collect log archives immediately after an incident occurs. Increase log file retention in enterprise endpoint management profiles.
log collect consumes excessive disk space (>10GB). Specified time window is too broad (e.g. --last 7d) across a heavily utilised server. Constrain the collection window to --last 30m or --last 1h to keep archive bundles under 500MB.
log stream drops events with notice: “log: dropped X messages”. Terminal emulator stdout buffer cannot keep up with high log emission rates. Refine predicate filtering to eliminate high-volume subsystems, or redirect raw stream output directly to disk: log stream --predicate '...' > output.log.

Mastering Unified Log Stream filtering, NSPredicate query construction, and .logarchive collection transforms macOS troubleshooting from guesswork into a rigorous, forensic science, empowering administrators to isolate the root cause of complex operating system faults.

Get the best tech tips delivered straight to your inbox.

Join thousands of readers mastering Apple, Google, Microsoft, and Linux.