Symptom
When sending Cisco ISE syslog events that contain multiple Step= fields within a single event, only a single Step value is retained. The remaining Step values are not preserved as multi-value data and appear to be overwritten or discarded.
Environment
- Cisco ISE generating syslog authentication/authorization events
- Splunk Enterprise or Splunk Cloud as the analytics platform
- Cribl Stream in the data path (syslog in, Splunk indexers or Splunk HEC out)
- Cisco ISE Technology Add-on (TA) for Splunk
Resolution
-
Decide where to handle the repeated
Stepfields based on how data is being delivered to Splunk:-
If sending raw syslog from Cisco ISE (with or without Cribl Stream in the middle), configure Splunk to treat
Stepas a multivalue field usingMV_ADD = trueat index time or a search-timerexwithmax_match=0. -
If sending structured JSON via HEC from Cribl Stream, normalize repeated
Stepvalues into a JSON array before sending to Splunk, so thatStepis ingested as a multivalue field.
-
-
For raw syslog into Splunk (recommended, lowest risk):
-
Create or update a
transforms.confstanza to extractStepas a multivalue field:# transforms.conf[ise_step_extract]REGEX = Step=(\d+)FORMAT = Step::$1MV_ADD = true -
In
props.conffor the Cisco ISE sourcetype (for example,cisco:ise:syslog), reference this transform:# props.conf
[cisco:ise:syslog]
REPORT-step = ise_step_extract -
Restart or reload Splunk as appropriate so the new extraction takes effect.
-
Verify in Splunk search that
Stepappears as a multivalue field, for example:index=<IndexName> sourcetype=cisco:ise:syslog
| stats values(Step) as Step by _time hostYou should see all ISE
Stepvalues in a single event (for example,Step = 11001 11017 15049 22072).
-
-
For search-time-only extraction (when index-time changes are not possible):
-
In Splunk search, extract
Stepas a multivalue field usingrex:index=<IndexName> sourcetype=cisco:ise:syslog
| rex max_match=0 "Step=(?<Step>\d+)"
| stats values(Step) as Step by _time host -
Use this pattern in saved searches or dashboards where multivalue
Stepis required, understanding that this is a search-time workaround and can be more expensive at scale than index-time extraction.
-
-
For structured JSON delivery through Cribl Stream into Splunk HEC:
-
In Cribl Stream, parse the raw ISE syslog and extract all occurrences of
Step=<number>from_raw. -
Use a function (for example, a JavaScript or code function in a pipeline) to build an array from all matches and assign it to a
Stepfield in the event:const matches = __e['_raw'].match(/Step=(\d+)/g);
if (matches) {
__e['Step'] = matches.map(m => m.replace('Step=', ''));
} -
Ensure the Cribl route to Splunk HEC is configured to send events as JSON so that the
Steparray is preserved. -
In Splunk, confirm that
Stepis ingested as a multivalue field directly from the JSON payload without additional extraction.
-
-
Avoid renaming repeated
Stepfields into unique names (for example,Step{0},Step{1},Step{2}) unless there is a strong schema requirement to do so. Renaming can break compatibility with the Cisco ISE TA and other content that expects a singleStepfield with multivalue semantics.
Cause
This can be caused by:
- Cisco ISE emitting the same field name (
Step) multiple times in a single syslog event. - Default Splunk key-value extraction behavior only preserving a single value for a repeated field name when multivalue accumulation (
MV_ADD) is not configured. - Forwarding Cisco ISE events through Cribl Stream without normalizing repeated
Stepvalues when using structured JSON delivery to Splunk HEC.
Additional Information
- When using the Cisco ISE TA, confirm which sourcetypes and field extractions it defines for
Stepfields, and adjustprops.confandtransforms.confin line with the TA’s expectations. - For lowest risk and maximum compatibility with Splunk add-ons, keep the raw event shape unchanged and solve multivalue handling on the Splunk side when possible.
- Normalizing to arrays in Cribl Stream is a good fit when the environment is already standardized on structured JSON delivery and downstream consumers expect or prefer JSON arrays for repeated values.
- These regexes assume Step= is always immediately followed by digits with no whitespace (e.g., Step=11001). If there's ever a space like Step= 11001, you'd need Step=\s*(\d+). Based on standard Cisco ISE syslog formatting, there is no space, so the current patterns are correct as-is.
