Class CaseConverterResolver
- java.lang.Object
-
- org.apache.logging.log4j.layout.template.json.resolver.CaseConverterResolver
-
- All Implemented Interfaces:
EventResolver,TemplateResolver<LogEvent>
public final class CaseConverterResolver extends java.lang.Object implements EventResolver
Converts the case of string values.Configuration
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" -> JSONinputcan be any available template value; e.g., a JSON literal, a lookup string, an object pointing to another resolver.Unless provided,
localepoints to the one returned byJsonTemplateLayoutDefaults.getLocale(), which is configured bylog4j.layout.jsonTemplate.localesystem property and by default set to the default system locale.errorHandlingStrategydetermines the behavior when either theinputdoesn't resolve to a string value or case conversion throws an exception:failpropagates the failurepasscauses the resolved value to be passed as isreplacesuppresses the failure and replaces it with thereplacement, which is set tonullby default
errorHandlingStrategyis set toreplaceby 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
replacements orpassinerrorHandlingStrategymight result in type incompatibility issues at the storage level.Unless the
inputvalue ispassed intact orreplaced, case conversion is not garbage-free.Examples
Convert the resolved log level strings to upper-case:{ "$resolver": "caseConverter", "case": "upper", "input": { "$resolver": "level", "field": "name" } }Convert the resolvedUSERenvironment variable to lower-case usingnl_NLlocale:{ "$resolver": "caseConverter", "case": "lower", "locale": "nl_NL", "input": "${env:USER}" }Convert the resolvedsessionIdthread context data (MDC) to lower-case:{ "$resolver": "caseConverter", "case": "lower", "input": { "$resolver": "mdc", "key": "sessionId" } }Above, ifsessionIdMDC resolves to a, say, number, case conversion will fail. SinceerrorHandlingStrategyis set toreplaceandreplacementis set tonullby default, the resolved value will benull. One can suppress this behavior and let the resolvedsessionIdnumber 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" }
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static classCaseConverterResolver.ErrorHandlingStrategy
-
Field Summary
Fields Modifier and Type Field Description private java.util.function.Function<java.lang.String,java.lang.String>converterprivate CaseConverterResolver.ErrorHandlingStrategyerrorHandlingStrategyprivate TemplateResolver<LogEvent>inputResolverprivate TemplateResolver<LogEvent>replacementResolver
-
Constructor Summary
Constructors Constructor Description CaseConverterResolver(EventResolverContext context, TemplateResolverConfig config)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private voidconvertCase(LogEvent logEvent, JsonWriter jsonWriter, int startIndex)private voidconvertCase(LogEvent logEvent, JsonWriter jsonWriter, int startIndex, java.lang.String json)private static java.util.function.Function<java.lang.String,java.lang.String>createConverter(TemplateResolverConfig config)private static TemplateResolver<LogEvent>createDelegate(EventResolverContext context, TemplateResolverConfig config)private static TemplateResolver<LogEvent>createReplacement(EventResolverContext context, TemplateResolverConfig config)(package private) static java.lang.StringgetName()booleanisFlattening()Indicates if the resolution should be appended to the parent JSON object.booleanisResolvable()Indicates if the resolver if applicable at all.booleanisResolvable(LogEvent logEvent)Indicates if the resolver if applicable for the givenvalue.private static CaseConverterResolver.ErrorHandlingStrategyreadErrorHandlingStrategy(TemplateResolverConfig config)voidresolve(LogEvent logEvent, JsonWriter jsonWriter)Resolves the givenvalueusing the providedJsonWriter.voidresolve(LogEvent logEvent, JsonWriter jsonWriter, boolean succeedingEntry)Resolves the givenvalueusing the providedJsonWriter.
-
-
-
Field Detail
-
inputResolver
private final TemplateResolver<LogEvent> inputResolver
-
converter
private final java.util.function.Function<java.lang.String,java.lang.String> converter
-
errorHandlingStrategy
private final CaseConverterResolver.ErrorHandlingStrategy errorHandlingStrategy
-
replacementResolver
private final TemplateResolver<LogEvent> replacementResolver
-
-
Constructor Detail
-
CaseConverterResolver
CaseConverterResolver(EventResolverContext context, TemplateResolverConfig config)
-
-
Method Detail
-
createDelegate
private static TemplateResolver<LogEvent> createDelegate(EventResolverContext context, TemplateResolverConfig config)
-
createConverter
private static java.util.function.Function<java.lang.String,java.lang.String> createConverter(TemplateResolverConfig config)
-
readErrorHandlingStrategy
private static CaseConverterResolver.ErrorHandlingStrategy readErrorHandlingStrategy(TemplateResolverConfig config)
-
createReplacement
private static TemplateResolver<LogEvent> createReplacement(EventResolverContext context, TemplateResolverConfig config)
-
getName
static java.lang.String getName()
-
isFlattening
public boolean isFlattening()
Description copied from interface:TemplateResolverIndicates if the resolution should be appended to the parent JSON object.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.- Specified by:
isFlatteningin interfaceTemplateResolver<LogEvent>
-
isResolvable
public boolean isResolvable()
Description copied from interface:TemplateResolverIndicates if the resolver if applicable at all.For instance, the source line resolver can be short-circuited using this check if the location information is disabled in the layout configuration.
- Specified by:
isResolvablein interfaceTemplateResolver<LogEvent>
-
isResolvable
public boolean isResolvable(LogEvent logEvent)
Description copied from interface:TemplateResolverIndicates if the resolver if applicable for the givenvalue.For instance, the stack trace resolver can be short-circuited using this check if the stack traces are disabled in the layout configuration.
- Specified by:
isResolvablein interfaceTemplateResolver<LogEvent>
-
resolve
public void resolve(LogEvent logEvent, JsonWriter jsonWriter)
Description copied from interface:TemplateResolverResolves the givenvalueusing the providedJsonWriter.- Specified by:
resolvein interfaceTemplateResolver<LogEvent>
-
resolve
public void resolve(LogEvent logEvent, JsonWriter jsonWriter, boolean succeedingEntry)
Description copied from interface:TemplateResolverResolves the givenvalueusing the providedJsonWriter.- Specified by:
resolvein interfaceTemplateResolver<LogEvent>succeedingEntry- false, if this is the first element in a collection; true, otherwise
-
convertCase
private void convertCase(LogEvent logEvent, JsonWriter jsonWriter, int startIndex)
-
convertCase
private void convertCase(LogEvent logEvent, JsonWriter jsonWriter, int startIndex, java.lang.String json)
-
-