Hello,
In JTL, we employ two templating languages within each other. Consider
the following GelfLayout.json:
{
"version": "1.1",
"host": "${hostName}",
"short_message": "${json:message}",
"full_message": "${json:exception:stackTrace:text}",
"timestamp": "${json:timestamp:epoch:secs}",
"level": "${json:level:severity:code}",
"_logger": "${json:logger:name}",
"_thread": "${json:thread:name}",
"_mdc": "${json:mdc:flatten=_,stringify}"
}
First, a JSON template denoting the will be emitted JSON structure.
Second, a key-value pair configuration language. See the
"${json:mdc:flatten=_,stringify}" directive? How one would parse
"flatten" parameter here? What if it contains double-quotes, commas,
etc. I have already implemented an ad-hoc StringParameterParser to
read such parameters. Though I am really hesitant to employ this
further for two main reasons:
1. Every custom parser is a fertile ground to injection attacks.
2. Its capabilities are limited: no types, no structural nesting, etc.
For this purpose, I have been considering re-using the JSON also to
pass parameters to the resolvers and render the 2nd DSL redundant:
{
"version": "1.1",
"host": "${hostName}",
"short_message": {
"$resolver": "message"
},
"full_message": {
"$resolver": "exception",
"type": "stackTrace",
"output": "text"
},
"timestamp": {
"$resolver": "timestamp",
"type": "epoch",
"unit": "secs"
},
"level": {
"$resolver": "level",
"type": "severity",
"field": "code"
},
"_logger": {
"$resolver": "logger",
"field": "name"
},
"_thread": {
"$resolver": "thread",
"field": "name"
},
"_mdc": {
"$resolver": "mdc",
"flatten": {
"prefix": "_"
},
"stringify": true
}
}
Due to existing users, I kept on postponing this idea in
LogstashLayout. Though I feel like this is a good time to bring it up
again. What do you think?
Kind regards.