I have events like the following. The filed jobName contains "(W6) Power Quality Read - MT - IR Meters Pascal" delimited with a comma. Splunk is representing the field, jobName as containing "(W6)" truncating the remainder of the value. I don't believe it is terminating because of the ") " in the value. Please advise if you have a suggestion.
04/08/2025 17:35:33 runID = 79004968, jobID=72212875, jobName=(W6) Power Quality Read - MT - IR Meters Pascal, jobType=Meter Read Job,status = Failure,started = Tue Apr 08 09:35:13 GMT 2025,finished = Tue Apr 08 10:48:29 GMT 2025,elapsed = 1h 13m 16s ,Process_Index_=0,Write_Index_=0,device_count=625997,imu_device_count=0,devices_in_nicnac=0,members_success=625879,members_failed=118,members_timed_out=0,members_retry_complete=518,devices_not_in_cache=0,nicnac_sent_callback=3144189,nicnac_complete_callback=625879,nicnac_failed_callback=0,nicnac_timeout_callback=518,unresolved_devices=791,process_batch=12555,process_1x1=0,name_resolver_elapsed=384249,process_elapsed_ms=1145247,jdbc_local_elapsed_ms=0,jdbc_net_elapsed_ms=1036711,load_device_elapsed_ms=18697
This is a fantastic case study of how Splunk handles major breaker tokens.
Splunk is representing the field, jobName as containing "(W6)" truncating the remainder of the value. I don't believe it is terminating because of the ") " in the value.
After examining how other fields are extracted in this sample, I am convinced that it terminates the string exactly because the ")" closes the opening "(". I'm sure this is described in some linguistic documents but I don't know how to find them. So here's a series of tests to observe.
The simplest case:
| makeresults
| eval _raw = "no_separator=abcdef, quote1 = \"abc\"def, quote2 = 'abc'def, bracket1=(abc)def, bracket2=[abc]def, bracket3 = {abc}def, white_space=abc def"
| extract kvdelim="=" pairdelim=,
Here, I'm explicitly prescribing kvdelim and pairdelim to avoid additional weirdness.
bracket1 | bracket2 | bracket3 | no_separator | quote1 | quote2 | white_space |
(abc) | [abc] | {abc} | abcdef | abc | 'abc' | abc |
The second one is perhaps trivial except I added a trailing comma after whitespace entry:
| makeresults
| eval _raw = "quote1a = abc\"def\", quote2a = abc'def', bracket1a=abc(def), bracket2a=abc[def], bracket3a = abc{def}, white_space1=abc def,"
| extract kvdelim="=" pairdelim=,
bracket1a | bracket2a | bracket3a | quote1a | quote2a | white_space1 |
abc(def) | abc[def] | abc{def} | abc"def" | abc'def' | abc def |
By adding a trailing comma, white_space1 now includes the part after white space.
Among these, white space behaviors are the most intriguing. So, the following is dedicated to its weirdness:
| makeresults
| eval _raw = "white_space2=abc def, white_space3 =abc def, white_space4= abc def, white_space5 = abc def, white_space6 = abc def, white_space7 = abc def,"
| extract kvdelim="=" pairdelim=,
white_space2 | white_space3 | white_space5 | white_space6 | white_space7 |
abc def | abc def | abc def | abc | abc def |
Here, you see some dynamics between white space(s) before and after "="; white space(s) before and after the first consequential non-space string also have some dynamics.
White space dynamics also affects other brackets. Double quote is perhaps the best protection of intention:
| makeresults
| eval _raw = "quote1b=\"abc\" def, quote1c =\"abc\" def, quote1d= \"abc\" def, quote1e = \"abc\" def, quote1f = \"abc\" def, quote1g = \"abc\" def,"
| extract kvdelim="=" pairdelim=,
quote1b | quote1c | quote1e | quote1f | quote1g |
abc | abc | abc | abc | abc |
The takeaway from all these is that developers need to express their intention by properly quote values and, like @PickleRick suggests, judiciously use white spaces. Unprotected strings are subject to wild guesses by Splunk - or any other language.
To joggle Mark's memory: Pierre had launched an initiative to encourage/beg developers to standardize logging practice so logs are more Splunk-friendly. (I would qualify this as "machine-friendly", not just for Splunk.) Any treatment after logs are written - such as the workaround @livehybrid proposes, is bound to be broken again when careless developers make random decisions. Your best bet is to carry on the torch and give developers a good whip.
It is likely that the reason that "jobName=(W6) Power Quality Read - MT - IR Meters Pascal" is being extracted as only "jobName=(W6)" is because it breaks on the space due to the value not being enclosed in quotes.
You could create an eval field to extract the full jobName - the following is an example using the rex command:
| makeresults
| eval _raw="runID=79004968, jobID=72212875, jobName=(W6) Power Quality Read - MT - IR Meters Pascal, jobType=Meter Read Job, status=Failure"
| rex field=_raw "jobName=(?<fullJobName>[^,]+)"
🌟 Did this answer help you? If so, please consider:
Your feedback encourages the volunteers in this community to continue contributing
1. Your copied event contents are inconsistent, sometimes you have key=value, sometimes key = value (with spaces)
2. We don't know how are your extractions defined. Default automatic K/V extractions would probably stop at first space in all cases. If you have custom regex-based extractions, you have to check your regexes.