Concatenates the values of all fields with the same name and an array suffix into a value in a new field. Such array fields typically come as output from either parseJson() or splitString().

All array fields starting with index from and ending with index to are selected. If some index is missing, the concatenation stops with the previous index, thus if only index 0, 1 and 3 are present, only index 0 and 1 are concatenated. If the first index is missing, no field is added to the event.

ParameterTypeRequiredDefault ValueDescription
asstringoptional[a] _concatArray Name of output field.
field[b]stringrequired   Base name for array fields to concatenate.
fromnumberoptional[a] 0 First array index to include [0..∞].
prefixstringoptional[a]   Prefix to prepend to the generated string.
separatorstringoptional[a]   Separator between values.
suffixstringoptional[a]   Suffix to append to the generated string.
tonumberoptional[a]   Last array index to include (leave out to get all). Must be equal to or larger than from.

[a] Optional parameters use their default value unless explicitly set.

[b] The parameter name field can be omitted.

Hide omitted argument names for this function

Show omitted argument names for this function

concatArray() Examples

Click + next to an example below to get the full details.

Concatenate Values From Deeply Nested Array Elements

Concatenate deeply nested objects and arrays using objectArray:eval() function with itself

Query
logscale
objectArray:eval(
        "in[]",
        asArray="out[]",
        function={
objectArray:eval("in.others[]", asArray="tmp[]", function={tmp := "in.others.d"})
| out := concatArray(tmp)
          }
          )
Introduction

In this example, the objectArray:eval() function is used with itself to concatenate a deeply nested arrays of objects values in the array in[] and return the concatenated values in the output field out[].

Example incoming data might look like this:

in[0].others[0].d: 1
in[0].others[1].d: 2
in[0].others[2].d: 3
in[1].others[0].d: 4
in[1].others[1].d: 5
in[1].others[2].d: 6
Step-by-Step
  1. Starting with the source repository events.

  2. logscale
    objectArray:eval(
            "in[]",
            asArray="out[]",
            function={

    Iterates over the array from start to end (or to the first empty index in the array, applies the given function, and returns the concatenated results in a new output array name field out[].

  3. logscale
    objectArray:eval("in.others[]", asArray="tmp[]", function={tmp := "in.others.d"})
    | out := concatArray(tmp)
              }
              )

    The nested objectArray:eval() performs the concatenation of the values within the nested array by calling the concatArray() function.

    Notice that in the nested call to objectArray:eval(), the given input array name is the nested array in.others[]. This works because it is translated to the field in[i].others[] by the parent objectArray:eval() current array index i.

    To return the concatenated array, the asArray parameter is set to the tmp[] field, and then when we assign the value of the concatenated value.

  4. Event Result set.

Summary and Results

The query is used to concatenate deeply nested arrays of objects. The use of this function in this way is often useful when incoming ingested data has been defined in a nested structure, but needs to be displayed or summarized. For example, importing the properties or configuration values may result in a list of potential values for a given property. Concatenating the values together makes them easier to use as a summary value for display in a table or graph.

Sample output from the incoming example data:

out[0]: 123
out[1]: 456

Concatenate Values in Arrays Into New Named Field

Concatenate values in flat arrays into new named field

Query
logscale
concatArray("email", as=servers)
Introduction

In this example, the concatArray() function concatenates the values of all fields with the same name into a value in a new defined field.

Example incoming data might look like this:

email[0] := "dopey"
email[1] := "sleepy"
email[2] := "doc"
email[3] := "happy"
email[4] := "sneezy"
Step-by-Step
  1. Starting with the source repository events.

  2. logscale
    concatArray("email", as=servers)

    Concatenates the values of fields email[0], email[1] and so on and returns the results in a field named servers.

  3. Event Result set.

Summary and Results

The query is used to concatenate (join) two or more arrays into a new array. Concatenation is useful in programming and computing because it allows you to store and combine multiple pieces of data when needed.

Sample output from the incoming example data:

email[0]email[1]email[2]email[3]email[4]servers
dopeysleepydochappysneezydopeysleepydochappysneezy

Concatenate Values in Arrays Using Pipe Separation

Concatenate values in flat arrays using pipe separation between the concatenated values

Query
logscale
concatArray(server, separator=" | ")
Introduction

In this example, the concatArray() function concatenates the values of all fields with the same name into pipe separated values in a new field.

Example incoming data might look like this:

server[0] := "dopey"
server[1] := "sleepy"
server[2] := "doc"
server[3] := "happy"
server[4] := "sneezy"
Step-by-Step
  1. Starting with the source repository events.

  2. logscale
    concatArray(server, separator=" | ")

    Concatenates the values of fields server[0], server[1] and so on and returns the results in a new array with a field named _concatArray where the concatenated values are separated by a pipe.

  3. Event Result set.

Summary and Results

The query is used to concatenate (join) the elements of the array into a new field where the concatenated values are separated by a pipe. Concatenation is useful in programming and computing because it allows you to store and combine multiple pieces of data when needed.

Sample output from the incoming example data:

server[0]server[1]server[2]server[3]server[4]_concatArray 
dopeysleepydochappysneezydopeydopey | sleepy | doc | happy | sneezy | dopey

Concatenate Values in Arrays With a Defined Prefix and Suffix

Concatenate values in flat arrays using prefix, suffix and separator

Query
logscale
concatArray(server, prefix="[", separator=",", suffix="]")
Introduction

In this example, the concatArray() function concatenates the values of all fields with the same name and an array suffix into a value in a new field, adding a prefix and a suffix to the generated output result.

Example incoming data might look like this:

server[0] := "dopey"
server[1] := "sleepy"
server[2] := "doc"
server[3] := "happy"
server[4] := "sneezy"
Step-by-Step
  1. Starting with the source repository events.

  2. logscale
    concatArray(server, prefix="[", separator=",", suffix="]")

    Concatenates the values of fields server[0], server[1] and so on and returns the results as a string named _concatArray enclosed in square brackets, and separated by a comma, which is similar to the written array format.

  3. Event Result set.

Summary and Results

This can be useful to summarize or format a list of items for use in another part of the query.

Sample output from the incoming example data:

server[0]server[1]server[2]server[3]server[4]_concatArray
dopeysleepydochappysneezy[dopey,sleepy,doc,happy,dopey]

Concatenate Values of All Fields With Same Name in an Array

Concatenate values of all fields with same name in a flat array

Query
logscale
concatArray(server)
Introduction

In this example, the concatArray() function concatenates the values of all fields with the same name into a value in a new field.

Example incoming data might look like this:

Raw Events
server[0] := "dopey"
server[1] := "sleepy"
server[2] := "doc"
server[3] := "happy"
server[4] := "sneezy"
Step-by-Step
  1. Starting with the source repository events.

  2. logscale
    concatArray(server)

    Concatenates the values of fields server[0], server[1] and so on and returns the results in a new array with a field named _concatArray. If no field is defined, the aggregate function always creates a field name beginning with underscore for the returned values.

  3. Event Result set.

Summary and Results

The query is used to concatenate (join) two or more arrays into a new array. Concatenation is useful in programming and computing because it allows you to store and combine multiple pieces of data when needed.

Sample output from the incoming example data:

email[0]email[1]email[2]email[3]email[4]_concatArray
dopeysleepydochappysneezydopeysleepydochappysneezy

Concatenate a Range of Values in Arrays

Concatenate values in flat arrays

Query
logscale
concatArray(server, from=1, to=3)
Introduction

In this example, the concatArray() function concatenates the values of all fields with the same name and index between 1 to 3 into a value in a new field.

Example incoming data might look like this:

server[0] := "dopey"
server[1] := "sleepy"
server[2] := "doc"
server[3] := "happy"
server[4] := "sneezy"
Step-by-Step
  1. Starting with the source repository events.

  2. logscale
    concatArray(server, from=1, to=3)

    Concatenates the values of fields server[1], server[2], and server[3], and returns the results in a new array with a field named _concatArray.

  3. Event Result set.

Summary and Results

The query is used to concatenate (join) two or more arrays into a new array. Concatenation is useful in programming and computing because it allows you to store and combine multiple pieces of data when needed.

Sample output from the incoming example data:

server[0]server[1]server[2]server[3]server[4]_concatArray
dopeysleepydochappysneezysleepydochappy

Transform Array Key-Value Pairs Into Top-Level Fields

Flatten structured array data into individual fields using the objectArray:eval() with concatArray() and array:drop()

Query
logscale
objectArray:eval(array="in[]", asArray="kvpairs[]", function={
  kvpairs:=format("%s=%s", field=[in.key, in.value])
})
| concatArray("kvpairs", separator=" ")
| kvParse(field="_concatArray")
| drop([_concatArray])
| array:drop("kvpairs[]")
Introduction

In this example, the objectArray:eval() function is used to iterate over an array of key-value pair objects stored in the in[] array field, formatting each pair into a key=value string. The resulting strings are then concatenated into a single space-separated string, parsed with kvParse() to promote each key-value pair into a top-level field, and finally the intermediate working fields are removed using drop() and array:drop().

Example incoming data might look like this:

in[0].keyin[0].valuein[1].keyin[1].valuein[2].keyin[2].value@timestamp
foobarbazquxzapwham2026-03-30T08:15:00Z
alphabravocharliedeltaechofoxtrot2026-03-30T08:16:00Z
red42blue17green992026-03-30T08:17:00Z
pingpongflipflopzigzag2026-03-30T08:18:00Z
axbxcxdxexfx2026-03-30T08:19:00Z

Each event contains an array of objects under the in[] field, where each object has a key and a value sub-field. The goal is to promote these dynamic key-value pairs into individual top-level fields on each event, regardless of what the key names are.

Step-by-Step
  1. Starting with the source repository events.

  2. logscale
    objectArray:eval(array="in[]", asArray="kvpairs[]", function={
      kvpairs:=format("%s=%s", field=[in.key, in.value])
    })

    The objectArray:eval() function iterates over each element in the in[] array, as specified by the array parameter. The inner function block is applied to each element in turn. The asArray parameter specifies that the results of the inner function are collected into a new array named kvpairs[], updating the event with this new array field.

    Inside the function block, the format() function constructs a string in the form key=value for each array element by referencing in.key and in.value — the sub-fields of each object in the in[] array. The result is assigned to kvpairs for each iteration, producing an array of formatted strings such as foo=bar, baz=qux, and zap=wham for the first event.

  3. logscale
    | concatArray("kvpairs", separator=" ")

    The concatArray() function joins all elements of the kvpairs[] array into a single string, using a space character as the separator specified by the separator parameter. The result is returned in a new field named _concatArray, which is the default output field name for this function. For the first event, this produces a string such as foo=bar baz=qux zap=wham.

  4. logscale
    | kvParse(field="_concatArray")

    The kvParse() function parses the space-separated key=value string stored in _concatArray, as specified by the field parameter. Each key-value pair found in the string is promoted to a top-level field on the event. For example, the string foo=bar baz=qux zap=wham results in three new fields: foo with value bar, baz with value qux, and zap with value wham. The default separator used by kvParse() is a space, which matches the output of the previous step.

  5. logscale
    | drop([_concatArray])

    The drop() function removes the intermediate scalar field _concatArray from each event. This field was only needed as an intermediate representation during the parsing step and is no longer required in the final output.

  6. logscale
    | array:drop("kvpairs[]")

    The array:drop() function removes the intermediate array field kvpairs[] from each event. This array was created by objectArray:eval() as a working structure to hold the formatted key=value strings and is no longer needed once parsing is complete. Using array:drop() rather than drop() is required here because kvpairs[] is an array field, and array fields must be removed with the dedicated array:drop() function.

  7. Event Result set.

Summary and Results

The query is used to flatten structured array data — where each array element is an object containing a key and a value sub-field — into individual top-level fields on each event. It achieves this by iterating over the array with objectArray:eval(), formatting each pair as a key=value string, concatenating the strings with concatArray(), parsing the result with kvParse(), and finally cleaning up the intermediate scalar field with drop() and the intermediate array field with array:drop().

This query is useful, for example, to normalize events from systems that emit dynamic or variable sets of attributes as arrays of key-value objects — such as configuration management tools, metadata APIs, or enrichment pipelines — so that the attributes can be used directly in filters, aggregations, and dashboards without requiring knowledge of the specific key names in advance.

Sample output from the incoming example data:

foobazzapalphacharlieechoredbluegreenpingflipzigaxcxex
barquxwham<no value><no value><no value><no value><no value><no value><no value><no value><no value><no value><no value><no value>
<no value><no value><no value>bravodeltafoxtrot<no value><no value><no value><no value><no value><no value><no value><no value><no value>
<no value><no value><no value><no value><no value><no value>421799<no value><no value><no value><no value><no value><no value>
<no value><no value><no value><no value><no value><no value><no value><no value><no value>pongflopzag<no value><no value><no value>
<no value><no value><no value><no value><no value><no value><no value><no value><no value><no value><no value><no value>bxdxfx

Note that each event only contains values for the fields that were present in its own in[] array — fields from other events are absent for that row, since the key names are dynamic and differ between events. The field names in the output are entirely determined by the values of the key sub-fields in the input array, making this pattern flexible for any set of dynamic attribute names.