public final class CaseConverterResolver extends Object implements EventResolver
config = case , input , [ locale ] , [ errorHandlingStrategy ] input = JSON case = "case" -> ( "upper" | "lower" ) locale = "locale" -> ( language | ( language , "_" , country ) | ( language , "_" , country , "_" , variant ) ) errorHandlingStrategy = "errorHandlingStrategy" -> ( "fail" | "pass" | "replace" ) replacement = "replacement" -> JSON
input
can be any available template value; e.g., a JSON literal,
a lookup string, an object pointing to another resolver.
Unless provided, locale
points to the one returned by
JsonTemplateLayoutDefaults.getLocale()
, which is configured by
log4j.layout.jsonTemplate.locale
system property and by default set
to the default system locale.
errorHandlingStrategy
determines the behavior when either the
input
doesn't resolve to a string value or case conversion throws an
exception:
fail
propagates the failure
pass
causes the resolved value to be passed as is
replace
suppresses the failure and replaces it with the
replacement
, which is set to null
by default
errorHandlingStrategy
is set to replace
by default.
Most of the time JSON logs are persisted to a storage solution
(e.g., Elasticsearch) that keeps a statically-typed index on fields.
Hence, if a field is always expected to be of type string, using non-string
replacement
s or pass
in errorHandlingStrategy
might
result in type incompatibility issues at the storage level.
Unless the input
value is pass
ed intact or replace
d,
case conversion is not garbage-free.
{ "$resolver": "caseConverter", "case": "upper", "input": { "$resolver": "level", "field": "name" } }Convert the resolved
USER
environment variable to lower-case using
nl_NL
locale:
{ "$resolver": "caseConverter", "case": "lower", "locale": "nl_NL", "input": "${env:USER}" }Convert the resolved
sessionId
thread context data (MDC) to
lower-case:
{ "$resolver": "caseConverter", "case": "lower", "input": { "$resolver": "mdc", "key": "sessionId" } }Above, if
sessionId
MDC resolves to a, say, number, case conversion
will fail. Since errorHandlingStrategy
is set to replace
and
replacement
is set to null
by default, the resolved value
will be null
. One can suppress this behavior and let the resolved
sessionId
number be left as is:
{ "$resolver": "caseConverter", "case": "lower", "input": { "$resolver": "mdc", "key": "sessionId" }, "errorHandlingStrategy": "pass" }or replace it with a custom string:
{ "$resolver": "caseConverter", "case": "lower", "input": { "$resolver": "mdc", "key": "sessionId" }, "errorHandlingStrategy": "replace" "replacement": "unknown" }
Modifier and Type | Method and Description |
---|---|
boolean |
isFlattening()
Indicates if the resolution should be appended to the parent JSON object.
|
boolean |
isResolvable()
Indicates if the resolver if applicable at all.
|
boolean |
isResolvable(LogEvent logEvent)
Indicates if the resolver if applicable for the given
value . |
void |
resolve(LogEvent logEvent,
JsonWriter jsonWriter)
Resolves the given
value using the provided JsonWriter . |
void |
resolve(LogEvent logEvent,
JsonWriter jsonWriter,
boolean succeedingEntry)
Resolves the given
value using the provided JsonWriter . |
public boolean isFlattening()
TemplateResolver
For instance, ThreadContextDataResolver
, i.e., MDC resolver,
uses this flag to indicate whether the contents should be appended to the
parent JSON object or not.
isFlattening
in interface TemplateResolver<LogEvent>
public boolean isResolvable()
TemplateResolver
For instance, the source line resolver can be short-circuited using this check if the location information is disabled in the layout configuration.
isResolvable
in interface TemplateResolver<LogEvent>
public boolean isResolvable(LogEvent logEvent)
TemplateResolver
value
.
For instance, the stack trace resolver can be short-circuited using this check if the stack traces are disabled in the layout configuration.
isResolvable
in interface TemplateResolver<LogEvent>
public void resolve(LogEvent logEvent, JsonWriter jsonWriter)
TemplateResolver
value
using the provided JsonWriter
.resolve
in interface TemplateResolver<LogEvent>
public void resolve(LogEvent logEvent, JsonWriter jsonWriter, boolean succeedingEntry)
TemplateResolver
value
using the provided JsonWriter
.resolve
in interface TemplateResolver<LogEvent>
succeedingEntry
- false, if this is the first element in a collection; true, otherwiseCopyright © 1999-1969 The Apache Software Foundation. All Rights Reserved.
Apache Logging, Apache Log4j, Log4j, Apache, the Apache feather logo, the Apache Logging project logo, and the Apache Log4j logo are trademarks of The Apache Software Foundation.