JSON Dotted Key Transformer (mmjsontransform)#
Module Name: |
mmjsontransform |
Author: |
|
Available since: |
8.2410.0 |
Note
mmjsontransform is a fresh module. Parameter names and behavior may
still change as real-world feedback arrives, so expect possible breaking
adjustments in upcoming releases.
Purpose#
mmjsontransform restructures JSON properties whose names contain dotted
segments. The action reads a JSON object from the configured input property and
stores the transformed tree under a dedicated output property. By default the
module expands dotted keys into nested containers (unflatten mode) so
pipelines that consume option.jsonfTree data can normalize payloads inline.
When mode="flatten" is selected, the action collapses nested objects back
into dotted keys.
Failure conditions#
mmjsontransform aborts the action when any of the following occur:
The input property does not resolve to a JSON object.
The output property already exists on the message.
Rewriting a key would overwrite an existing incompatible value (for example,
{"a": 1}combined with{"a.b": 2}).
Notable Features#
Transformation modes — bidirectional conversion between dotted keys and nested containers.
Conflict handling — detailed conflict reporting to locate incompatible payloads quickly.
Configuration Parameters#
Note
Parameter names are case-insensitive. For readability, camelCase is recommended.
Action Parameters#
Transformation modes#
mmjsontransform supports two modes controlled by the mode parameter. Both modes rewrite the entire input
object before assigning it to the configured output property.
Unflatten dotted keys#
mode="unflatten" (the default) expands dotted keys into nested containers.
For example {"a.b": 1, "a.c": 2} becomes {"a": {"b": 1, "c": 2}}.
When the module encounters a dotted path that points to an existing
non-object value, it stops processing, leaves the output unset, and reports the
conflicting path.
Flatten nested containers#
mode="flatten" performs the reverse operation. Nested objects become dotted
key paths ({"nested": {"value": 1}} is rewritten to
{"nested.value": 1}), while arrays are preserved with their elements
recursively flattened. If flattening would overwrite an existing scalar with a
different value, the action fails and reports the mismatch.
Conflict handling#
The module tracks the full dotted path responsible for a hierarchy conflict and logs a user-facing error when a mismatch occurs. Review the reported path to identify which input property must be renamed or preprocessed before retrying the transformation.
Examples#
Normalize and persist dotted JSON#
The following snippet receives JSON payloads, normalizes dotted keys into
nested objects, and writes both the structured tree and a flattened
representation to /tmp/out.json:
module(load="mmjsontransform")
module(load="imtcp")
input(type="imtcp" port="10514" ruleset="process-json")
ruleset(name="process-json") {
action(type="mmjsontransform" input="$!raw" output="$!normalized")
action(type="mmjsontransform" mode="flatten"
input="$!normalized" output="$!normalized_flat")
action(type="omfile" file="/tmp/out.json"
template="json-template")
}
template(name="json-template" type="string"
string="%$!normalized%\n%$!normalized_flat%\n")
Troubleshooting#
When a hierarchy conflict occurs (for example, mode="unflatten" sees
"a": "value" and "a.b": 1), mmjsontransform logs an error that
includes the conflicting path. Inspect the reported path to determine which
input property needs to be renamed or moved before retrying the transformation.
Support: rsyslog Assistant | GitHub Discussions | GitHub Issues: rsyslog source project
Contributing: Source & docs: rsyslog source project
© 2008–2026 Rainer Gerhards and others. Licensed under the Apache License 2.0.