The Log Explorer ships in two flavours, and each accepts a different filter syntax. Use the Modern UI / Legacy UI toggle in the top-right of the Log Explorer to switch between them. The list of filterable fields is the same in both UIs, but the expression power differs.

Legacy UI

The legacy explorer is a facet-driven interface. You build a query by:
  1. Clicking facet values in the left sidebar (Severity, Source, Host, Service). Each click adds an equality filter pill at the top.
  2. Typing field:value into the search bar, which adds the same kind of pill.
  3. Prefixing with - to negate (-hostname:web-canary).
  4. Typing bare text with no field:, which runs a contains search against the log message.
Each pill is AND-ed together. The legacy bar does not parse AND, OR, parentheses, wildcards, ranges, or IN (...); those tokens are treated as plain text. Examples that work in the legacy UI:
To express anything more complex (multiple values for the same field, wildcards, ranges, OR), switch to the Modern UI.

Modern UI

The modern explorer parses the search bar as a full query expression. It supports every feature listed in the table above.

Quick reference

Field names and string values are case sensitive. The keywords AND, OR, NOT, and IN are case insensitive.

Operators

Equality and inequality

field:value matches exact equality. !: and the NOT prefix both negate.

Comparison

Numeric and lexical comparison operators are written next to the colon:

Ranges

Use square brackets and the TO keyword for inclusive ranges:

IN / NOT IN

Match any value from a list:

Wildcards

* matches zero or more characters; ? matches exactly one character:
Bare terms (no field:) are matched against the log message body. Quote multi-word phrases:
A key:value term whose key isn’t one of the filterable fields is treated as free text too, so a log line written as label: value is searchable as-is. For example, apex_snap_images: apex upload verify matches that text in the message. Quote the whole phrase to match it as one contiguous substring:
You can combine free text with field filters in the same query:

Boolean operators and grouping

Combine clauses with AND, OR, and NOT (or !). Use parentheses to control precedence, because without them AND binds tighter than OR.

Filterable fields

These attributes are first-class fields on every log event. They are extracted by the agent or the ingest API and indexed for fast filtering. The same fields work in both the Legacy and Modern UIs. tags, sensitiveData, and sensitiveDataCatagory are arrays, so field:value matches if any element equals value.

Numeric vs string fields

The available comparison operators depend on the field’s type:
  • String fields support equality, negation, starts with, ends with, contains, and case-insensitive contains. In the Modern UI these surface as :, !:, and the wildcard syntax (prefix*, *suffix, *substr*).
  • Numeric fields (statusCode, urlPort) additionally support :>, :<, :>=, :<=, and :[a TO b] in the Modern UI.

Attribute access (@ prefix)

Logs carry arbitrary structured attributes, such as parsed JSON keys, ECS-standardised fields, and Kubernetes metadata. Use the @ prefix to match against them. This works in both UIs.
Special prefixes:
  • @<ecs_or_kube_field>: ECS-standardised fields (@host.name, @trace.id, etc.) and Kubernetes context fields (@kube_namespace, @kube_pod_name, etc.) are routed to the appropriate context column automatically.
  • @message.<path>: match a key inside a JSON message body, including nested keys (see Searching inside JSON messages below).
  • @sensitive_data:<value>: match a sensitive-data marker on the event.
  • @sensitive_data_catagory:<category>: match by sensitive-data category.
Any other @<key> is matched against the event’s parsed attribute map.

Searching inside JSON messages

When a log message is itself a JSON object, match against its keys with the @message. prefix. The key is read from the raw message at query time, so it works even for keys that aren’t promoted to first-class attributes.
Use dot notation for nested keys:
Wildcards and exclusion behave like any other field:
In the Modern UI log detail panel a JSON message renders as an expandable tree. Hover a value to filter by it, or right-click a field for Filter by / Exclude / Copy value. Each writes the matching @message.<path> filter into the search bar.

Examples

Find every 5xx response from the order-api service in the last hour (Modern UI):
Find errors that aren’t from internal cron jobs (Modern UI):
Find Kubernetes pod logs for a specific namespace with timeouts (Modern UI):
Search inside a JSON message body (match an account key and drop debug noise) (Modern UI):
Trace correlation (show all logs tied to a distributed trace) (both UIs):
Pattern drill-down (show every event matching a detected pattern) (both UIs):
The same expression you use in the search bar (Modern UI) is what gets sent to POST /v1/accounts/:accountId/logs/search as the filterConditions parameter; the Legacy UI sends its facet/pill selections as a filters array of field:value strings. Both formats accept the same set of fields. These Log Explorer views accept the same filter expression in the search bar: