diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 7607f821..771e57ab 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -34,9 +34,10 @@ jobs:
- name: Build
run: ./mvnw --batch-mode --no-transfer-progress --show-version --settings .github/maven/settings.xml verify
- # Run tests against Jackson 2.12 to ensure runtime compatibility (do not recompile)
- - name: Test Jackson 2.12.x
- run: ./mvnw --batch-mode --no-transfer-progress --show-version --settings .github/maven/settings.xml -Pcompat-jackson surefire:test
+# Re-enable after upgrading Jackson to 3.1+
+# # Run tests against Jackson 3.0.0 to ensure runtime compatibility (do not recompile)
+# - name: Test Jackson 3.0.0
+# run: ./mvnw --batch-mode --no-transfer-progress --show-version --settings .github/maven/settings.xml -Pcompat-jackson surefire:test
- name: Upload Test Reports to Github
uses: actions/upload-artifact@v4
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 730c8aa0..11509515 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -7,7 +7,6 @@ jobs:
release:
name: release
runs-on: ubuntu-24.04
- needs: [build]
if: github.repository == 'logfellow/logstash-logback-encoder' && github.ref == 'refs/heads/main'
steps:
- name: Checkout Code
diff --git a/README.md b/README.md
index fbbfd1ef..3f8a0c20 100644
--- a/README.md
+++ b/README.md
@@ -52,7 +52,7 @@ The structure of the output, and the data it contains, is fully configurable.
* [Header Fields](#header-fields)
* [Customizing Jackson](#customizing-jackson)
* [Data Format](#data-format)
- * [Customizing JSON Factory and Generator](#customizing-json-factory-and-generator)
+ * [Customizing TokenStreamFactory, ObjectMapper, and JsonGenerator](#customizing-tokenstreamfactory-objectmapper-and-jsongenerator)
* [Registering Jackson Modules](#registering-jackson-modules)
* [Customizing Character Escapes](#customizing-character-escapes)
* [Masking](#masking)
@@ -99,7 +99,7 @@ Maven style:
net.logstash.logbacklogstash-logback-encoder
- 8.1
+ 9.0
-
+
```
@@ -1678,7 +1706,7 @@ Specific values to be masked can be specified in several ways, as seen in the fo
```xml
-
+
-
+
```
@@ -1904,13 +1932,13 @@ Use `-1` to disable shortening entirely.
The next table provides examples of the abbreviation algorithm in action.
-|LENGTH|LOGGER NAME |SHORTENED |
-|------|----------------------------|---------------------------|
-|0 | `org.company.stack.Sample` | `Sample` |
-|5 | `org.company.stack.Sample` | `o.c.s.Sample` |
-|16 | `org.company.stack.Sample` | `o.c.stack.Sample` |
-|22 | `org.company.stack.Sample` | `o.company.stack.Sample` |
-|25 | `org.company.stack.Sample` | `org.company.stack.Sample`|
+| LENGTH | LOGGER NAME | SHORTENED |
+|--------|----------------------------|----------------------------|
+| 0 | `org.company.stack.Sample` | `Sample` |
+| 5 | `org.company.stack.Sample` | `o.c.s.Sample` |
+| 16 | `org.company.stack.Sample` | `o.c.stack.Sample` |
+| 22 | `org.company.stack.Sample` | `o.company.stack.Sample` |
+| 25 | `org.company.stack.Sample` | `org.company.stack.Sample` |
@@ -1931,7 +1959,7 @@ This converter can even be used within a `PatternLayout` to format stacktraces i
### Omit Common Frames
-Nested stacktraces often contain redudant frames that can safely be omitted without loosing any valuable information.
+Nested stacktraces often contain redundant frames that can safely be omitted without loosing any valuable information.
The following example shows a standard stack trace of an exception with a single root cause:
@@ -2300,9 +2328,7 @@ Multiple evaluators can be registered and are evaluated in the order in which th
### Stack Hashes
-**To Be Documented**
-
-Computing and inlining hexadecimal hashes for each exception stack using the `inlineHash` or `stackHash` provider ([more info](stack-hash.md)).
+Compute and inline hexadecimal hashes for each exception stack with the `inlineHash` or `stackHash` provider ([more info](stack-hash.md)).
diff --git a/pom.xml b/pom.xml
index 359bd22f..b688b88b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,7 +23,7 @@
UTF-8
- 2.20.0
+ 3.0.05.1.11.5.192.0.6
@@ -64,7 +64,10 @@
true
- true
+
+ falsegithub
@@ -116,7 +119,7 @@
- com.fasterxml.jackson
+ tools.jacksonjackson-bom${jackson.version}pom
@@ -165,11 +168,11 @@
true
- com.fasterxml.jackson.core
+ tools.jackson.corejackson-databind
- com.fasterxml.jackson.dataformat
+ tools.jackson.dataformatjackson-dataformat-cbor
- 11
+ 17META-INF/versions/*
@@ -548,8 +551,8 @@
https://javadoc.io/doc/ch.qos.logback/logback-classic/${logback-core.version}
https://javadoc.io/doc/ch.qos.logback.access/logback-access-common/${logback-access.version}
- https://javadoc.io/doc/com.fasterxml.jackson.core/jackson-core/${jackson.version}
- https://javadoc.io/doc/com.fasterxml.jackson.core/jackson-databind/${jackson.version}
+ https://javadoc.io/doc/tools.jackson.core/jackson-core/${jackson.version}
+ https://javadoc.io/doc/tools.jackson.core/jackson-databind/${jackson.version}
- false
-
-
-
github
@@ -777,15 +767,19 @@
+
diff --git a/src/main/java/net/logstash/logback/LogstashAccessFormatter.java b/src/main/java/net/logstash/logback/LogstashAccessFormatter.java
index 069cb4d2..8336e800 100644
--- a/src/main/java/net/logstash/logback/LogstashAccessFormatter.java
+++ b/src/main/java/net/logstash/logback/LogstashAccessFormatter.java
@@ -44,7 +44,7 @@
import ch.qos.logback.access.common.spi.IAccessEvent;
import ch.qos.logback.core.joran.spi.DefaultClass;
import ch.qos.logback.core.spi.ContextAware;
-import com.fasterxml.jackson.databind.JsonNode;
+import tools.jackson.databind.JsonNode;
/**
* A {@link AccessEventCompositeJsonFormatter} that contains a common
@@ -119,12 +119,11 @@ private void updateMessageProvider() {
//
// { "fieldName": "messagePattern" }
//
- String accessEventPattern = new StringBuilder("{\"")
- .append(this.fieldNames.getMessage())
- .append("\": \"")
- .append(escapeJson(this.messagePattern))
- .append("\"}")
- .toString();
+ String accessEventPattern = "{\""
+ + this.fieldNames.getMessage()
+ + "\": \""
+ + escapeJson(this.messagePattern)
+ + "\"}";
AccessEventPatternJsonProvider messagePatternProvider = new AccessEventPatternJsonProvider();
messagePatternProvider.setPattern(accessEventPattern);
@@ -184,7 +183,7 @@ public String getCustomFieldsAsString() {
}
public void setCustomFieldsFromString(String customFields) {
- if (customFields == null || customFields.length() == 0) {
+ if (customFields == null || customFields.isEmpty()) {
getProviders().removeProvider(globalCustomFieldsProvider);
globalCustomFieldsProvider = null;
} else {
diff --git a/src/main/java/net/logstash/logback/LogstashFormatter.java b/src/main/java/net/logstash/logback/LogstashFormatter.java
index 31a93d23..75f6288e 100644
--- a/src/main/java/net/logstash/logback/LogstashFormatter.java
+++ b/src/main/java/net/logstash/logback/LogstashFormatter.java
@@ -45,9 +45,9 @@
import ch.qos.logback.classic.pattern.ThrowableHandlingConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.spi.ContextAware;
-import com.fasterxml.jackson.databind.JsonNode;
import org.slf4j.MDC;
import org.slf4j.event.KeyValuePair;
+import tools.jackson.databind.JsonNode;
/**
* A {@link LoggingEventCompositeJsonFormatter} that contains a common
@@ -176,7 +176,7 @@ public String getCustomFieldsAsString() {
}
public void setCustomFieldsFromString(String customFields) {
- if (customFields == null || customFields.length() == 0) {
+ if (customFields == null || customFields.isEmpty()) {
getProviders().removeProvider(globalCustomFieldsProvider);
globalCustomFieldsProvider = null;
} else {
diff --git a/src/main/java/net/logstash/logback/argument/DeferredStructuredArgument.java b/src/main/java/net/logstash/logback/argument/DeferredStructuredArgument.java
index c4dda45c..76aa8e94 100644
--- a/src/main/java/net/logstash/logback/argument/DeferredStructuredArgument.java
+++ b/src/main/java/net/logstash/logback/argument/DeferredStructuredArgument.java
@@ -15,15 +15,14 @@
*/
package net.logstash.logback.argument;
-import java.io.IOException;
import java.util.Objects;
import java.util.function.Supplier;
import net.logstash.logback.marker.EmptyLogstashMarker;
import ch.qos.logback.classic.spi.LoggingEvent;
-import com.fasterxml.jackson.core.JsonGenerator;
import org.slf4j.Logger;
+import tools.jackson.core.JsonGenerator;
/**
* A {@link StructuredArgument} that defers the creation of another {@link StructuredArgument} until
@@ -66,7 +65,7 @@ public DeferredStructuredArgument(Supplier extends StructuredArgument> structu
}
@Override
- public void writeTo(JsonGenerator generator) throws IOException {
+ public void writeTo(JsonGenerator generator) {
getSuppliedValue().writeTo(generator);
}
diff --git a/src/main/java/net/logstash/logback/argument/StructuredArgument.java b/src/main/java/net/logstash/logback/argument/StructuredArgument.java
index ae3e71ad..56cff381 100644
--- a/src/main/java/net/logstash/logback/argument/StructuredArgument.java
+++ b/src/main/java/net/logstash/logback/argument/StructuredArgument.java
@@ -15,12 +15,10 @@
*/
package net.logstash.logback.argument;
-import java.io.IOException;
-
import net.logstash.logback.composite.loggingevent.ArgumentsJsonProvider;
-import com.fasterxml.jackson.core.JsonGenerator;
import org.slf4j.Logger;
+import tools.jackson.core.JsonGenerator;
/**
* A wrapper for an argument passed to a log method (e.g. {@link Logger#info(String, Object...)})
@@ -32,9 +30,8 @@ public interface StructuredArgument {
* Writes the data associated with this argument to the given {@link JsonGenerator}.
*
* @param generator the {@link JsonGenerator} to produce JSON content
- * @throws IOException if an I/O error occurs
*/
- void writeTo(JsonGenerator generator) throws IOException;
+ void writeTo(JsonGenerator generator);
/**
* Writes the data associated with this argument to a {@link String} to be
diff --git a/src/main/java/net/logstash/logback/composite/AbstractCompositeJsonFormatter.java b/src/main/java/net/logstash/logback/composite/AbstractCompositeJsonFormatter.java
index c719e831..4773c919 100644
--- a/src/main/java/net/logstash/logback/composite/AbstractCompositeJsonFormatter.java
+++ b/src/main/java/net/logstash/logback/composite/AbstractCompositeJsonFormatter.java
@@ -18,32 +18,38 @@
import java.io.Closeable;
import java.io.IOException;
import java.io.OutputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Map;
import java.util.Objects;
import java.util.ServiceConfigurationError;
-import net.logstash.logback.decorate.JsonFactoryDecorator;
+import net.logstash.logback.dataformat.DataFormatFactory;
+import net.logstash.logback.dataformat.json.JsonDataFormatFactory;
+import net.logstash.logback.decorate.CompositeJsonGeneratorDecorator;
+import net.logstash.logback.decorate.CompositeMapperBuilderDecorator;
+import net.logstash.logback.decorate.CompositeTokenStreamFactoryBuilderDecorator;
+import net.logstash.logback.decorate.Decorator;
import net.logstash.logback.decorate.JsonGeneratorDecorator;
-import net.logstash.logback.decorate.NullJsonFactoryDecorator;
-import net.logstash.logback.decorate.NullJsonGeneratorDecorator;
+import net.logstash.logback.decorate.MapperBuilderDecorator;
+import net.logstash.logback.decorate.TokenStreamFactoryBuilderDecorator;
import net.logstash.logback.util.ProxyOutputStream;
-import net.logstash.logback.util.SimpleObjectJsonGeneratorDelegate;
import net.logstash.logback.util.ThreadLocalHolder;
import ch.qos.logback.access.common.spi.IAccessEvent;
import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.CoreConstants;
import ch.qos.logback.core.spi.ContextAware;
import ch.qos.logback.core.spi.ContextAwareBase;
import ch.qos.logback.core.spi.DeferredProcessingAware;
import ch.qos.logback.core.spi.LifeCycle;
import ch.qos.logback.core.util.CloseUtil;
-import com.fasterxml.jackson.core.JsonEncoding;
-import com.fasterxml.jackson.core.JsonFactory;
-import com.fasterxml.jackson.core.JsonFactory.Feature;
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.core.io.SerializedString;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializationFeature;
+import tools.jackson.core.JsonEncoding;
+import tools.jackson.core.JsonGenerator;
+import tools.jackson.core.StreamWriteFeature;
+import tools.jackson.core.TSFBuilder;
+import tools.jackson.core.TokenStreamFactory;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.SerializationFeature;
+import tools.jackson.databind.cfg.MapperBuilder;
/**
* Formats logstash Events as JSON using {@link JsonProvider}s.
@@ -66,21 +72,41 @@ public abstract class AbstractCompositeJsonFormatter DATA_FORMATS = Map.of(
+ DataFormatFactory.JSON, "net.logstash.logback.dataformat.json.JsonDataFormatFactory",
+ DataFormatFactory.YAML, "net.logstash.logback.dataformat.yaml.YamlDataFormatFactory",
+ DataFormatFactory.CBOR, "net.logstash.logback.dataformat.cbor.CborDataFormatFactory",
+ DataFormatFactory.SMILE, "net.logstash.logback.dataformat.smile.SmileDataFormatFactory");
/**
- * Decorates the {@link #jsonFactory}.
- * Allows customization of the {@link #jsonFactory}.
+ * Factory for creating builders for a data format supported by jackson.
*/
- private JsonFactoryDecorator jsonFactoryDecorator;
+ private DataFormatFactory dataFormatFactory = new JsonDataFormatFactory();
/**
- * Decorates the generators generated by the {@link #jsonFactory}.
+ * Decorates the builder that builds the {@link #objectMapper}.
+ * Allows customization of the {@link #objectMapper}.
+ */
+ private final CompositeMapperBuilderDecorator mapperBuilderDecorator = new CompositeMapperBuilderDecorator();
+
+ /**
+ * Decorates the builder that builds the {@link TokenStreamFactory} used by the {@link #objectMapper}.
+ * Allows customization of the {@link TokenStreamFactory}.
+ */
+ private final CompositeTokenStreamFactoryBuilderDecorator tokenStreamFactoryBuilderDecorator = new CompositeTokenStreamFactoryBuilderDecorator();
+
+ /**
+ * Decorates the generators generated by the {@link #objectMapper}.
* Allows customization of the generators.
*/
- private JsonGeneratorDecorator jsonGeneratorDecorator;
+ private final CompositeJsonGeneratorDecorator jsonGeneratorDecorator = new CompositeJsonGeneratorDecorator();
+
+ /**
+ * Used to create the {@link JsonGenerator}s for generating output.
+ */
+ private ObjectMapper objectMapper;
/**
* The providers that are used to populate the output JSON object.
@@ -105,18 +131,14 @@ public void start() {
if (isStarted()) {
return;
}
- if (jsonFactoryDecorator == null) {
- jsonFactoryDecorator = new NullJsonFactoryDecorator();
- }
- if (jsonGeneratorDecorator == null) {
- jsonGeneratorDecorator = new NullJsonGeneratorDecorator();
- }
if (jsonProviders.getProviders().isEmpty()) {
addError("No providers configured");
}
- jsonFactory = createJsonFactory();
+
+ objectMapper = createObjectMapper();
+
jsonProviders.setContext(context);
- jsonProviders.setJsonFactory(jsonFactory);
+ jsonProviders.setObjectMapper(objectMapper);
jsonProviders.start();
threadLocalJsonFormatter = new ThreadLocalHolder<>(this::createJsonFormatter);
@@ -128,7 +150,7 @@ public void stop() {
if (isStarted()) {
threadLocalJsonFormatter.close();
jsonProviders.stop();
- jsonFactory = null;
+ objectMapper = null;
started = false;
}
}
@@ -138,7 +160,38 @@ public boolean isStarted() {
return started;
}
-
+ private ObjectMapper createObjectMapper() {
+ TokenStreamFactory tokenStreamFactory = createTokenStreamFactory();
+
+ MapperBuilder mapperBuilder = dataFormatFactory.createMapperBuilder(tokenStreamFactory)
+ /*
+ * Assume empty beans are ok.
+ */
+ .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
+
+ if (findAndRegisterJacksonModules) {
+ try {
+ mapperBuilder = mapperBuilder.findAndAddModules();
+ } catch (ServiceConfigurationError serviceConfigurationError) {
+ addError("Error occurred while dynamically loading jackson modules", serviceConfigurationError);
+ }
+ }
+
+ mapperBuilder = (MapperBuilder) this.mapperBuilderDecorator.decorate(mapperBuilder);
+
+ return mapperBuilder.build();
+ }
+
+ private TokenStreamFactory createTokenStreamFactory() {
+ return ((TSFBuilder) tokenStreamFactoryBuilderDecorator.decorate(dataFormatFactory.createTokenStreamFactoryBuilder()))
+ /*
+ * Don't let the JsonGenerator close the underlying outputStream and let the
+ * encoder managed it.
+ */
+ .disable(StreamWriteFeature.AUTO_CLOSE_TARGET)
+ .build();
+ }
+
/**
* Write an event in the given output stream.
*
@@ -216,7 +269,7 @@ public void dispose() {
}
@Override
- public void close() throws IOException {
+ public void close() {
AbstractCompositeJsonFormatter.this.threadLocalJsonFormatter.release();
}
}
@@ -235,56 +288,6 @@ public void disconnect() {
}
}
- private JsonFactory createJsonFactory() {
- ObjectMapper objectMapper = new ObjectMapper()
- /*
- * Assume empty beans are ok.
- */
- .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
-
- if (findAndRegisterJacksonModules) {
- try {
- objectMapper.findAndRegisterModules();
- } catch (ServiceConfigurationError serviceConfigurationError) {
- addError("Error occurred while dynamically loading jackson modules", serviceConfigurationError);
- }
- }
-
- return decorateFactory(objectMapper.getFactory());
- }
-
- private JsonFactory decorateFactory(JsonFactory factory) {
- JsonFactory factoryToDecorate = factory
- /*
- * When generators are flushed, don't flush the underlying outputStream.
- *
- * This allows some streaming optimizations when using an encoder.
- *
- * The encoder generally determines when the stream should be flushed
- * by an 'immediateFlush' property.
- *
- * The 'immediateFlush' property of the encoder can be set to false
- * when the appender performs the flushes at appropriate times
- * (such as the end of a batch in the AbstractLogstashTcpSocketAppender).
- *
- * Set this prior to decorating, because some generators require
- * FLUSH_PASSED_TO_STREAM to work properly (e.g. YAML)
- */
- .disable(JsonGenerator.Feature.FLUSH_PASSED_TO_STREAM);
-
- return this.jsonFactoryDecorator.decorate(factoryToDecorate)
- /*
- * Jackson buffer recycling works by maintaining a pool of buffers per thread. This
- * feature works best when one JsonGenerator is created per thread, typically in J2EE
- * environments.
- *
- * Each JsonFormatter uses its own instance of JsonGenerator and is reused multiple times
- * possibly on different threads. The memory buffers allocated by the JsonGenerator do
- * not belong to a particular thread - hence the recycling feature should be disabled.
- */
- .disable(Feature.USE_THREAD_LOCAL_FOR_BUFFER_RECYCLING);
- }
-
protected void writeEventToGenerator(JsonGenerator generator, Event event) throws IOException {
generator.writeStartObject();
jsonProviders.writeTo(generator, event);
@@ -298,52 +301,136 @@ protected void prepareForDeferredProcessing(Event event) {
}
private JsonGenerator createGenerator(OutputStream outputStream) throws IOException {
- return decorateGenerator(jsonFactory.createGenerator(outputStream, encoding));
+ return this.jsonGeneratorDecorator.decorate(objectMapper.createGenerator(outputStream, encoding));
}
- private JsonGenerator decorateGenerator(JsonGenerator generator) {
- JsonGenerator decorated = jsonGeneratorDecorator.decorate(new SimpleObjectJsonGeneratorDelegate(generator))
- /*
- * Don't let the json generator close the underlying outputStream and let the
- * encoder managed it.
- */
- .disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET);
+ /**
+ * Gets the name of the currently configured data format.
+ *
+ * @return the name of the currently configured data format.
+ */
+ public String getDataFormat() {
+ return dataFormatFactory.getName();
+ }
+ /**
+ * Sets the dataformat to one of the build-in data formats (
+ * {@value DataFormatFactory#JSON},
+ * {@value DataFormatFactory#YAML},
+ * {@value DataFormatFactory#CBOR}, or
+ * {@value DataFormatFactory#SMILE}).
+ *
+ *
For non-JSON data formats, the appropriate Jackson data format module must be on the classpath.
+ *
+ *
To set a custom (non-builtin) data format, use {@link #setDataFormatFactory(DataFormatFactory)}
+ *
+ * @param dataFormat {@value DataFormatFactory#JSON},
+ * {@value DataFormatFactory#YAML},
+ * {@value DataFormatFactory#CBOR}, or
+ * {@value DataFormatFactory#SMILE}
+ * @see #setDataFormatFactory(DataFormatFactory)
+ */
+ public void setDataFormat(String dataFormat) {
+ String dataFormatClassName = DATA_FORMATS.get(dataFormat);
+ if (dataFormatClassName == null) {
+ throw new IllegalArgumentException(String.format("Unknown data format: %s. Known data formats are: %s", dataFormat, String.join(",", DATA_FORMATS.keySet())));
+ }
try {
- decorated = decorated
- /*
- * JsonGenerator are reused to serialize multiple log events.
- * Change the default root value separator to an empty string instead of a single space.
- */
- .setRootValueSeparator(new SerializedString(CoreConstants.EMPTY_STRING));
- } catch (UnsupportedOperationException e) {
- /*
- * Ignore.
- * Some generators do not support setting the rootValueSeparator.
- */
+ setDataFormatFactory((DataFormatFactory) Class.forName(dataFormatClassName).getConstructor().newInstance());
+ } catch (ClassNotFoundException e) {
+ throw new IllegalArgumentException(String.format("Unable to instantiate %s. Ensure the appropriate jackson dataformat module is on the classpath.", dataFormatClassName), e);
+ } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
+ throw new IllegalArgumentException(String.format("Unable to instantiate %s.", dataFormatClassName), e);
}
+ }
- return decorated;
+ /**
+ * Gets the currently configured {@link DataFormatFactory}.
+ *
+ * @return the currently configured {@link DataFormatFactory}.
+ */
+ public DataFormatFactory getDataFormatFactory() {
+ return dataFormatFactory;
}
-
- public JsonFactory getJsonFactory() {
- return jsonFactory;
+
+ /**
+ * Sets the {@link DataFormatFactory} to be used for output.
+ *
+ *
For built-in formats, prefer using {@link #setDataFormat(String)}
+ *
+ * @param dataFormatFactory the {@link DataFormatFactory} to be used for output.
+ */
+ public void setDataFormatFactory(DataFormatFactory dataFormatFactory) {
+ this.dataFormatFactory = Objects.requireNonNull(dataFormatFactory);
}
- public JsonFactoryDecorator getJsonFactoryDecorator() {
- return jsonFactoryDecorator;
+ /**
+ * Adds the given decorator of type
+ * {@link MapperBuilderDecorator},
+ * {@link TokenStreamFactoryBuilderDecorator}, or
+ * {@link JsonGeneratorDecorator}.
+ *
+ *
These decorators decorate Jackson objects.
+ *
+ * @param decorator the decorator to add (of type {@link MapperBuilderDecorator}, {@link TokenStreamFactoryBuilderDecorator}, or {@link JsonGeneratorDecorator})
+ * @throws IllegalArgumentException if an unsupported decorator is added
+ */
+ public void addDecorator(Decorator> decorator) {
+ Objects.requireNonNull(decorator);
+ if (decorator instanceof MapperBuilderDecorator mapperBuilderDecoratorToAdd) {
+ addMapperBuilderDecorator(mapperBuilderDecoratorToAdd);
+ } else if (decorator instanceof TokenStreamFactoryBuilderDecorator tokenStreamFactoryBuilderDecoratorToAdd) {
+ addTokenStreamFactoryBuilderDecorator(tokenStreamFactoryBuilderDecoratorToAdd);
+ } else if (decorator instanceof JsonGeneratorDecorator jsonGeneratorDecoratorToAdd) {
+ addJsonGeneratorDecorator(jsonGeneratorDecoratorToAdd);
+ } else {
+ throw new IllegalArgumentException("Unknown decorator type:" + decorator.getClass().getName());
+ }
}
- public void setJsonFactoryDecorator(JsonFactoryDecorator jsonFactoryDecorator) {
- this.jsonFactoryDecorator = jsonFactoryDecorator;
+ public void addJsonGeneratorDecorator(JsonGeneratorDecorator jsonGeneratorDecoratorToAdd) {
+ jsonGeneratorDecorator.addDecorator(jsonGeneratorDecoratorToAdd);
}
- public JsonGeneratorDecorator getJsonGeneratorDecorator() {
- return jsonGeneratorDecorator;
+ public void addTokenStreamFactoryBuilderDecorator(TokenStreamFactoryBuilderDecorator tokenStreamFactoryBuilderDecoratorToAdd) {
+ tokenStreamFactoryBuilderDecorator.addDecorator(tokenStreamFactoryBuilderDecoratorToAdd);
+ }
+
+ public void addMapperBuilderDecorator(MapperBuilderDecorator mapperBuilderDecoratorToAdd) {
+ mapperBuilderDecorator.addDecorator(mapperBuilderDecoratorToAdd);
}
- public void setJsonGeneratorDecorator(JsonGeneratorDecorator jsonGeneratorDecorator) {
- this.jsonGeneratorDecorator = jsonGeneratorDecorator;
+ /**
+ * Gets a mutable {@link CompositeTokenStreamFactoryBuilderDecorator}
+ * containing all the currently configured {@link TokenStreamFactoryBuilderDecorator}s.
+ *
+ * @return a mutable {@link CompositeTokenStreamFactoryBuilderDecorator}
+ * containing all the currently configured {@link TokenStreamFactoryBuilderDecorator}s.
+ */
+ public CompositeTokenStreamFactoryBuilderDecorator getTokenStreamFactoryBuilderDecorator() {
+ return tokenStreamFactoryBuilderDecorator;
+ }
+
+ /**
+ * Gets a mutable {@link CompositeMapperBuilderDecorator}
+ * containing all the currently configured {@link MapperBuilderDecorator}s.
+ *
+ * @return a mutable {@link CompositeMapperBuilderDecorator}
+ * containing all the currently configured {@link MapperBuilderDecorator}s.
+ */
+ public CompositeMapperBuilderDecorator getMapperBuilderDecorator() {
+ return mapperBuilderDecorator;
+ }
+
+ /**
+ * Gets a mutable {@link CompositeJsonGeneratorDecorator}
+ * containing all the currently configured {@link JsonGeneratorDecorator}s.
+ *
+ * @return a mutable {@link CompositeJsonGeneratorDecorator}
+ * containing all the currently configured {@link JsonGeneratorDecorator}s.
+ */
+ public CompositeJsonGeneratorDecorator getJsonGeneratorDecorator() {
+ return jsonGeneratorDecorator;
}
public JsonProviders getProviders() {
diff --git a/src/main/java/net/logstash/logback/composite/AbstractFormattedTimestampJsonProvider.java b/src/main/java/net/logstash/logback/composite/AbstractFormattedTimestampJsonProvider.java
index fd7098c5..180f6b04 100644
--- a/src/main/java/net/logstash/logback/composite/AbstractFormattedTimestampJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/AbstractFormattedTimestampJsonProvider.java
@@ -15,7 +15,6 @@
*/
package net.logstash.logback.composite;
-import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.time.Instant;
@@ -29,7 +28,7 @@
import net.logstash.logback.util.TimeZoneUtils;
import ch.qos.logback.core.spi.DeferredProcessingAware;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
/**
* Writes the timestamp field as either:
@@ -94,7 +93,7 @@ public abstract class AbstractFormattedTimestampJsonProvider formatter.format(tstamp));
+ return new StringFormatterWriter(formatter::format);
}
static StringFormatterWriter with(FastISOTimestampFormatter formatter) {
return new StringFormatterWriter(formatter::format);
@@ -160,7 +159,7 @@ public void setFieldNames(FieldNames fieldNames) {
}
@Override
- public void writeTo(JsonGenerator generator, Event event) throws IOException {
+ public void writeTo(JsonGenerator generator, Event event) {
timestampWriter.writeTo(generator, getFieldName(), getTimestampAsInstant(event));
}
@@ -194,27 +193,27 @@ private TimestampWriter createTimestampWriter() {
// Use our fast FastISOTimestampFormatter if suitable...
//
ZoneId zone = timeZone.toZoneId();
- if ("ISO_OFFSET_DATE_TIME".equals(constant)) {
- return StringFormatterWriter.with(FastISOTimestampFormatter.isoOffsetDateTime(zone));
- }
- if ("ISO_ZONED_DATE_TIME".equals(constant)) {
- return StringFormatterWriter.with(FastISOTimestampFormatter.isoZonedDateTime(zone));
- }
- if ("ISO_LOCAL_DATE_TIME".equals(constant)) {
- return StringFormatterWriter.with(FastISOTimestampFormatter.isoLocalDateTime(zone));
- }
- if ("ISO_DATE_TIME".equals(constant)) {
- return StringFormatterWriter.with(FastISOTimestampFormatter.isoDateTime(zone));
+ switch (constant) {
+ case "ISO_OFFSET_DATE_TIME" -> {
+ return StringFormatterWriter.with(FastISOTimestampFormatter.isoOffsetDateTime(zone));
+ }
+ case "ISO_ZONED_DATE_TIME" -> {
+ return StringFormatterWriter.with(FastISOTimestampFormatter.isoZonedDateTime(zone));
+ }
+ case "ISO_LOCAL_DATE_TIME" -> {
+ return StringFormatterWriter.with(FastISOTimestampFormatter.isoLocalDateTime(zone));
+ }
+ case "ISO_DATE_TIME" -> {
+ return StringFormatterWriter.with(FastISOTimestampFormatter.isoDateTime(zone));
+ }
+ case "ISO_INSTANT" -> {
+ return StringFormatterWriter.with(FastISOTimestampFormatter.isoInstant(zone));
+ }
+ default -> {
+ DateTimeFormatter formatter = getStandardDateTimeFormatter(constant).withZone(zone);
+ return StringFormatterWriter.with(formatter);
+ }
}
- if ("ISO_INSTANT".equals(constant)) {
- return StringFormatterWriter.with(FastISOTimestampFormatter.isoInstant(zone));
- }
-
-
- // Otherwise try one of the default formatters...
- //
- DateTimeFormatter formatter = getStandardDateTimeFormatter(constant).withZone(zone);
- return StringFormatterWriter.with(formatter);
}
diff --git a/src/main/java/net/logstash/logback/composite/AbstractNestedJsonProvider.java b/src/main/java/net/logstash/logback/composite/AbstractNestedJsonProvider.java
index 0a9d2cbe..c9fea69b 100644
--- a/src/main/java/net/logstash/logback/composite/AbstractNestedJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/AbstractNestedJsonProvider.java
@@ -15,21 +15,20 @@
*/
package net.logstash.logback.composite;
-import java.io.IOException;
import java.util.Objects;
import ch.qos.logback.access.common.spi.IAccessEvent;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.spi.DeferredProcessingAware;
-import com.fasterxml.jackson.core.JsonFactory;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
+import tools.jackson.databind.ObjectMapper;
/**
* A {@link JsonProvider} that nests other providers within a subobject.
*
* @param type of event ({@link ILoggingEvent} or {@link IAccessEvent}).
*/
-public abstract class AbstractNestedJsonProvider extends AbstractFieldJsonProvider implements JsonFactoryAware {
+public abstract class AbstractNestedJsonProvider extends AbstractFieldJsonProvider implements ObjectMapperAware {
public static final String FIELD_NESTED = "nested";
@@ -56,9 +55,8 @@ public void stop() {
}
@Override
- public void writeTo(JsonGenerator generator, Event event) throws IOException {
- generator.writeFieldName(getFieldName());
- generator.writeStartObject();
+ public void writeTo(JsonGenerator generator, Event event) {
+ generator.writeObjectPropertyStart(getFieldName());
jsonProviders.writeTo(generator, event);
generator.writeEndObject();
}
@@ -72,8 +70,8 @@ public void setProviders(JsonProviders jsonProviders) {
}
@Override
- public void setJsonFactory(final JsonFactory jsonFactory) {
- getProviders().setJsonFactory(Objects.requireNonNull(jsonFactory));
+ public void setObjectMapper(ObjectMapper objectMapper) {
+ getProviders().setObjectMapper(Objects.requireNonNull(objectMapper));
}
@Override
diff --git a/src/main/java/net/logstash/logback/composite/AbstractPatternJsonProvider.java b/src/main/java/net/logstash/logback/composite/AbstractPatternJsonProvider.java
index 5ad487a7..e88e93d3 100644
--- a/src/main/java/net/logstash/logback/composite/AbstractPatternJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/AbstractPatternJsonProvider.java
@@ -15,7 +15,6 @@
*/
package net.logstash.logback.composite;
-import java.io.IOException;
import java.util.Objects;
import net.logstash.logback.pattern.AbstractJsonPatternParser;
@@ -25,42 +24,42 @@
import ch.qos.logback.access.common.spi.IAccessEvent;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.spi.DeferredProcessingAware;
-import com.fasterxml.jackson.core.JsonFactory;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
+import tools.jackson.databind.ObjectMapper;
/**
* Transforms an string containing patterns understood by PatternLayouts into JSON output.
* Delegates most of the work to the {@link AbstractJsonPatternParser} that is to
* parse the pattern specified.
- * Subclasses must implement {@link #createParser(JsonFactory)} method so it returns parser valid for a specified event class.
+ * Subclasses must implement {@link #createParser()} method so it returns parser valid for a specified event class.
*
* @param type of event ({@link ILoggingEvent} or {@link IAccessEvent}).
*
* @author Dmitry Andrianov
*/
public abstract class AbstractPatternJsonProvider
- extends AbstractJsonProvider implements JsonFactoryAware {
+ extends AbstractJsonProvider implements ObjectMapperAware {
private NodeWriter nodeWriter;
private String pattern;
- private JsonFactory jsonFactory;
+ protected ObjectMapper objectMapper;
/**
- * When {@code true}, fields whose values are considered empty ({@link AbstractJsonPatternParser#isEmptyValue(Object)}})
+ * When {@code true}, fields whose values are considered empty
* will be omitted from JSON output.
*/
private boolean omitEmptyFields;
@Override
- public void writeTo(JsonGenerator generator, Event event) throws IOException {
+ public void writeTo(JsonGenerator generator, Event event) {
if (nodeWriter != null) {
nodeWriter.write(generator, event);
}
}
- protected abstract AbstractJsonPatternParser createParser(JsonFactory jsonFactory);
+ protected abstract AbstractJsonPatternParser createParser();
public String getPattern() {
return pattern;
@@ -69,16 +68,16 @@ public String getPattern() {
public void setPattern(final String pattern) {
this.pattern = pattern;
}
-
+
@Override
- public void setJsonFactory(JsonFactory jsonFactory) {
- this.jsonFactory = Objects.requireNonNull(jsonFactory);
+ public void setObjectMapper(ObjectMapper objectMapper) {
+ this.objectMapper = Objects.requireNonNull(objectMapper);
}
@Override
public void start() {
- if (jsonFactory == null) {
- throw new IllegalStateException("JsonFactory has not been set");
+ if (objectMapper == null) {
+ throw new IllegalStateException("objectMapper has not been set");
}
try {
@@ -99,7 +98,7 @@ public void start() {
* @throws JsonPatternException thrown in case of invalid pattern
*/
private NodeWriter initializeNodeWriter() throws JsonPatternException {
- AbstractJsonPatternParser parser = createParser(this.jsonFactory);
+ AbstractJsonPatternParser parser = createParser();
parser.setOmitEmptyFields(omitEmptyFields);
return parser.parse(pattern);
}
diff --git a/src/main/java/net/logstash/logback/composite/AbstractSequenceJsonProvider.java b/src/main/java/net/logstash/logback/composite/AbstractSequenceJsonProvider.java
index c3b882e0..c87fd71a 100644
--- a/src/main/java/net/logstash/logback/composite/AbstractSequenceJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/AbstractSequenceJsonProvider.java
@@ -15,7 +15,6 @@
*/
package net.logstash.logback.composite;
-import java.io.IOException;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.Function;
@@ -23,7 +22,7 @@
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.spi.DeferredProcessingAware;
import ch.qos.logback.core.spi.SequenceNumberGenerator;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
/**
* Outputs an incrementing sequence number.
@@ -71,7 +70,7 @@ public void start() {
@Override
- public void writeTo(JsonGenerator generator, Event event) throws IOException {
+ public void writeTo(JsonGenerator generator, Event event) {
if (!isStarted()) {
throw new IllegalStateException("Provider " + this.getClass().getName() + " is not started");
}
@@ -110,7 +109,7 @@ protected Function createSequenceProvider() {
if (getContext() == null || getContext().getSequenceNumberGenerator() == null) {
this.addWarn("No defined in Logback configuration - revert to using a local incrementing sequence number.");
- return new Function() {
+ return new Function<>() {
private final AtomicLong sequence = new AtomicLong(0L);
@Override
diff --git a/src/main/java/net/logstash/logback/composite/AbstractThreadNameJsonProvider.java b/src/main/java/net/logstash/logback/composite/AbstractThreadNameJsonProvider.java
index 379edc78..3ec6bab7 100644
--- a/src/main/java/net/logstash/logback/composite/AbstractThreadNameJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/AbstractThreadNameJsonProvider.java
@@ -15,12 +15,10 @@
*/
package net.logstash.logback.composite;
-import java.io.IOException;
-
import net.logstash.logback.fieldnames.LogstashCommonFieldNames;
import ch.qos.logback.core.spi.DeferredProcessingAware;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
public abstract class AbstractThreadNameJsonProvider extends AbstractFieldJsonProvider implements FieldNamesAware {
@@ -31,7 +29,7 @@ public AbstractThreadNameJsonProvider() {
}
@Override
- public void writeTo(JsonGenerator generator, Event event) throws IOException {
+ public void writeTo(JsonGenerator generator, Event event) {
JsonWritingUtils.writeStringField(generator, getFieldName(), getThreadName(event));
}
diff --git a/src/main/java/net/logstash/logback/composite/CompositeJsonFormatter.java b/src/main/java/net/logstash/logback/composite/CompositeJsonFormatter.java
deleted file mode 100644
index 569cb074..00000000
--- a/src/main/java/net/logstash/logback/composite/CompositeJsonFormatter.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright 2013-2025 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package net.logstash.logback.composite;
-
-import ch.qos.logback.core.spi.ContextAware;
-import ch.qos.logback.core.spi.DeferredProcessingAware;
-
-/**
- * @deprecated use {@link AbstractCompositeJsonFormatter} instead.
- */
-@Deprecated
-public abstract class CompositeJsonFormatter extends AbstractCompositeJsonFormatter {
-
- public CompositeJsonFormatter(ContextAware declaredOrigin) {
- super(declaredOrigin);
- }
-
-}
diff --git a/src/main/java/net/logstash/logback/composite/ContextJsonProvider.java b/src/main/java/net/logstash/logback/composite/ContextJsonProvider.java
index fc5c96a4..b29e315e 100644
--- a/src/main/java/net/logstash/logback/composite/ContextJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/ContextJsonProvider.java
@@ -15,15 +15,13 @@
*/
package net.logstash.logback.composite;
-import java.io.IOException;
-
import net.logstash.logback.fieldnames.LogstashCommonFieldNames;
import ch.qos.logback.access.common.spi.IAccessEvent;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.spi.DeferredProcessingAware;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
/**
* Writes properties from the {@link Context} into the JSON event.
@@ -37,10 +35,10 @@
public class ContextJsonProvider extends AbstractFieldJsonProvider implements FieldNamesAware {
@Override
- public void writeTo(JsonGenerator generator, Event event) throws IOException {
+ public void writeTo(JsonGenerator generator, Event event) {
if (getContext() != null) {
if (getFieldName() != null) {
- generator.writeObjectFieldStart(getFieldName());
+ generator.writeObjectPropertyStart(getFieldName());
}
JsonWritingUtils.writeMapEntries(generator, context.getCopyOfPropertyMap());
diff --git a/src/main/java/net/logstash/logback/composite/GlobalCustomFieldsJsonProvider.java b/src/main/java/net/logstash/logback/composite/GlobalCustomFieldsJsonProvider.java
index 3bf568ce..ee469d8c 100644
--- a/src/main/java/net/logstash/logback/composite/GlobalCustomFieldsJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/GlobalCustomFieldsJsonProvider.java
@@ -15,18 +15,17 @@
*/
package net.logstash.logback.composite;
-import java.io.IOException;
-import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Objects;
import ch.qos.logback.core.spi.DeferredProcessingAware;
-import com.fasterxml.jackson.core.JsonFactory;
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.core.JsonGenerator;
+import tools.jackson.core.exc.StreamReadException;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.node.ObjectNode;
-public class GlobalCustomFieldsJsonProvider extends AbstractJsonProvider implements JsonFactoryAware {
+public class GlobalCustomFieldsJsonProvider extends AbstractJsonProvider implements ObjectMapperAware {
/**
* The un-parsed custom fields string to use to initialize customFields
@@ -40,24 +39,23 @@ public class GlobalCustomFieldsJsonProvider> fields = node.fields(); fields.hasNext();) {
- Entry field = fields.next();
- generator.writeFieldName(field.getKey());
+ for (Entry field : node.properties()) {
+ generator.writeName(field.getKey());
generator.writeTree(field.getValue());
}
}
@@ -79,13 +77,13 @@ private void initializeCustomFields() {
if (customFieldsNode != null || customFields == null) {
return;
}
- if (jsonFactory == null) {
- throw new IllegalStateException("JsonFactory has not been set");
+ if (objectMapper == null) {
+ throw new IllegalStateException("objectMapper has not been set");
}
try {
- this.customFieldsNode = JsonReadingUtils.readFullyAsObjectNode(this.jsonFactory, this.customFields);
- } catch (IOException e) {
+ this.customFieldsNode = JsonReadingUtils.readFullyAsObjectNode(this.objectMapper, this.customFields);
+ } catch (StreamReadException e) {
addError("[customFields] is not a valid JSON object", e);
}
}
@@ -146,7 +144,7 @@ public void setCustomFieldsNode(ObjectNode customFields) {
@Override
- public void setJsonFactory(JsonFactory jsonFactory) {
- this.jsonFactory = Objects.requireNonNull(jsonFactory);
+ public void setObjectMapper(ObjectMapper objectMapper) {
+ this.objectMapper = Objects.requireNonNull(objectMapper);
}
}
diff --git a/src/main/java/net/logstash/logback/composite/JsonProvider.java b/src/main/java/net/logstash/logback/composite/JsonProvider.java
index 4db0e3fd..8dbe0218 100644
--- a/src/main/java/net/logstash/logback/composite/JsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/JsonProvider.java
@@ -15,13 +15,11 @@
*/
package net.logstash.logback.composite;
-import java.io.IOException;
-
import ch.qos.logback.access.common.spi.IAccessEvent;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.spi.ContextAware;
import ch.qos.logback.core.spi.DeferredProcessingAware;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
/**
* Contributes to the JSON output being written for the given Event.
@@ -39,9 +37,8 @@ public interface JsonProvider extends Con
*
* @param generator the {@link JsonGenerator} to produce JSON content
* @param event the event to convert into JSON
- * @throws IOException if an I/O error occurs
*/
- void writeTo(JsonGenerator generator, Event event) throws IOException;
+ void writeTo(JsonGenerator generator, Event event);
/**
* Gives the provider a chance to perform more deferred processing
diff --git a/src/main/java/net/logstash/logback/composite/JsonProviders.java b/src/main/java/net/logstash/logback/composite/JsonProviders.java
index 4bed770f..70002681 100644
--- a/src/main/java/net/logstash/logback/composite/JsonProviders.java
+++ b/src/main/java/net/logstash/logback/composite/JsonProviders.java
@@ -15,7 +15,6 @@
*/
package net.logstash.logback.composite;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -24,8 +23,8 @@
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.spi.DeferredProcessingAware;
-import com.fasterxml.jackson.core.JsonFactory;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
+import tools.jackson.databind.ObjectMapper;
/**
* Contains a collection of {@link JsonProvider}s to be used to write
@@ -39,7 +38,7 @@
*
* @param type of event ({@link ILoggingEvent} or {@link IAccessEvent}).
*/
-public class JsonProviders implements JsonFactoryAware {
+public class JsonProviders implements ObjectMapperAware {
private final List> jsonProviders = new ArrayList<>();
@@ -73,7 +72,7 @@ public void removeProvider(JsonProvider provider) {
}
}
- public void writeTo(JsonGenerator generator, Event event) throws IOException {
+ public void writeTo(JsonGenerator generator, Event event) {
for (JsonProvider jsonProvider : jsonProviders) {
jsonProvider.writeTo(generator, event);
}
@@ -84,12 +83,12 @@ protected void prepareForDeferredProcessing(Event event) {
jsonProvider.prepareForDeferredProcessing(event);
}
}
-
+
@Override
- public void setJsonFactory(JsonFactory jsonFactory) {
+ public void setObjectMapper(ObjectMapper objectMapper) {
for (JsonProvider jsonProvider : jsonProviders) {
- if (jsonProvider instanceof JsonFactoryAware) {
- ((JsonFactoryAware) jsonProvider).setJsonFactory(jsonFactory);
+ if (jsonProvider instanceof ObjectMapperAware) {
+ ((ObjectMapperAware) jsonProvider).setObjectMapper(objectMapper);
}
}
}
diff --git a/src/main/java/net/logstash/logback/composite/JsonReadingUtils.java b/src/main/java/net/logstash/logback/composite/JsonReadingUtils.java
index 005da440..b48bcdd5 100644
--- a/src/main/java/net/logstash/logback/composite/JsonReadingUtils.java
+++ b/src/main/java/net/logstash/logback/composite/JsonReadingUtils.java
@@ -15,13 +15,11 @@
*/
package net.logstash.logback.composite;
-import java.io.IOException;
-
-import com.fasterxml.jackson.core.JsonFactory;
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.core.JsonParser;
+import tools.jackson.core.exc.StreamReadException;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.node.ObjectNode;
/**
* Utilities for reading/parsing JSON string.
@@ -41,31 +39,30 @@ private JsonReadingUtils() {
/**
* Fully read the supplied JSON string into the equivalent {@link JsonNode}.
*
- * Throws a {@link JsonParseException} if the string is not fully read after a first valid JsonNode is found.
+ * Throws a {@link StreamReadException} if the string is not fully read after a first valid JsonNode is found.
* This may happen for input like 10 foobar that would otherwise return a NumericNode with value
* {@code 10} leaving foobar unread.
*
- * @param jsonFactory the {@link JsonFactory} from which to obtain a {@link JsonParser} to read the JSON string.
+ * @param objectMapper the {@link ObjectMapper} from which to obtain a {@link JsonParser} to read the JSON string.
* @param json the JSON string to read
* @return the {@link JsonNode} corresponding to the input string or {@code null} if the string is null or empty.
- * @throws IOException if there is either an underlying I/O problem or decoding issue
*/
- public static JsonNode readFully(JsonFactory jsonFactory, String json) throws IOException {
+ public static JsonNode readFully(ObjectMapper objectMapper, String json) {
if (json == null) {
return null;
}
final String trimmedJson = json.trim();
- try (JsonParser parser = jsonFactory.createParser(trimmedJson)) {
+ try (JsonParser parser = objectMapper.createParser(trimmedJson)) {
final JsonNode tree = parser.readValueAsTree();
- if (parser.getCurrentLocation().getCharOffset() < trimmedJson.length()) {
+ if (parser.currentLocation().getCharOffset() < trimmedJson.length()) {
/*
* If the full trimmed string was not read, then the full trimmed string contains a json value plus other text.
* For example, trimmedValue = '10 foobar', or 'true foobar', or '{"foo","bar"} baz'.
* In these cases readTree will only read the first part, and will not read the remaining text.
*/
- throw new JsonParseException(parser, "unexpected character");
+ throw new StreamReadException(parser, "unexpected character");
}
return tree;
@@ -74,22 +71,22 @@ public static JsonNode readFully(JsonFactory jsonFactory, String json) throws IO
/**
- * Fully read a JSON string into an {@link ObjectNode}, throwing a {@link JsonParseException} if the supplied string
+ * Fully read a JSON string into an {@link ObjectNode}, throwing a {@link StreamReadException} if the supplied string
* is not a valid JSON object representation.
*
- * @param jsonFactory the {@link JsonFactory} from which to obtain a {@link JsonParser} to read the JSON string.
+ * @param objectMapper the {@link ObjectMapper} from which to obtain a {@link JsonParser} to read the JSON string.
* @param json the JSON string to read
* @return the {@link JsonNode} corresponding to the input string or {@code null} if the string is null or empty.
- * @throws IOException if there is either an underlying I/O problem or decoding issue
- *
- * @see JsonReadingUtils#readFully(JsonFactory, String)
+ *
+ * @see JsonReadingUtils#readFully(ObjectMapper, String)
*/
- public static ObjectNode readFullyAsObjectNode(JsonFactory jsonFactory, String json) throws IOException {
- final JsonNode node = readFully(jsonFactory, json);
+ public static ObjectNode readFullyAsObjectNode(ObjectMapper objectMapper, String json) {
+ final JsonNode node = readFully(objectMapper, json);
if (node != null && !(node instanceof ObjectNode)) {
- throw new JsonParseException(null, "expected a JSON object representation");
+ throw new StreamReadException(null, "expected a JSON object representation");
}
- return (ObjectNode) node; }
+ return (ObjectNode) node;
+ }
}
diff --git a/src/main/java/net/logstash/logback/composite/JsonWritingUtils.java b/src/main/java/net/logstash/logback/composite/JsonWritingUtils.java
index 928389c8..ac205dd1 100644
--- a/src/main/java/net/logstash/logback/composite/JsonWritingUtils.java
+++ b/src/main/java/net/logstash/logback/composite/JsonWritingUtils.java
@@ -15,13 +15,11 @@
*/
package net.logstash.logback.composite;
-import java.io.IOException;
import java.util.Map;
import net.logstash.logback.fieldnames.LogstashCommonFieldNames;
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.JsonMappingException;
+import tools.jackson.core.JsonGenerator;
/**
* Utilities for writing JSON
@@ -36,16 +34,12 @@ public class JsonWritingUtils {
*
* @param generator the {@link JsonGenerator} to produce JSON content
* @param map map whose entries are written as JSON field/values
- *
- * @throws IOException if an I/O error occurs
- * @throws JsonMappingException when problem to convert map values of type Object into JSON
*/
- public static void writeMapEntries(JsonGenerator generator, Map, ?> map) throws IOException, JsonMappingException {
+ public static void writeMapEntries(JsonGenerator generator, Map, ?> map) {
if (map != null) {
for (Map.Entry, ?> entry : map.entrySet()) {
if (entry.getKey() != null && entry.getValue() != null) {
- generator.writeFieldName(entry.getKey().toString());
- generator.writeObject(entry.getValue());
+ generator.writePOJOProperty(entry.getKey().toString(), entry.getValue());
}
}
}
@@ -58,12 +52,8 @@ public static void writeMapEntries(JsonGenerator generator, Map, ?> map) throw
* @param generator the {@link JsonGenerator} to produce JSON content
* @param fieldName name of the JSON property to write the map content under
* @param map map whose entries are written as JSON field/values
- *
- * @throws IOException if an I/O error occurs
- * @throws JsonMappingException when problem to convert map values of type Object into JSON
-
*/
- public static void writeMapStringFields(JsonGenerator generator, String fieldName, Map map) throws IOException, JsonMappingException {
+ public static void writeMapStringFields(JsonGenerator generator, String fieldName, Map map) {
writeMapStringFields(generator, fieldName, map, false);
}
@@ -75,13 +65,10 @@ public static void writeMapStringFields(JsonGenerator generator, String fieldNam
* @param fieldName name of the JSON property to write the map content under
* @param map map whose entries are written as JSON field/values
* @param lowerCaseKeys when true, the map keys will be written in lower case.
- *
- * @throws IOException if an I/O error occurs
- * @throws JsonMappingException when problem to convert map values of type Object into JSON
*/
- public static void writeMapStringFields(JsonGenerator generator, String fieldName, Map map, boolean lowerCaseKeys) throws IOException, JsonMappingException {
+ public static void writeMapStringFields(JsonGenerator generator, String fieldName, Map map, boolean lowerCaseKeys) {
if (shouldWriteField(fieldName) && map != null && !map.isEmpty()) {
- generator.writeObjectFieldStart(fieldName);
+ generator.writeObjectPropertyStart(fieldName);
for (Map.Entry entry : map.entrySet()) {
String key = entry.getKey() != null && lowerCaseKeys
? entry.getKey().toLowerCase()
@@ -99,12 +86,10 @@ public static void writeMapStringFields(JsonGenerator generator, String fieldNam
* @param generator the {@link JsonGenerator} to produce JSON content
* @param fieldName the field name
* @param fieldValues the field values
- *
- * @throws IOException if an I/O error occurs
*/
- public static void writeStringArrayField(JsonGenerator generator, String fieldName, String[] fieldValues) throws IOException {
+ public static void writeStringArrayField(JsonGenerator generator, String fieldName, String[] fieldValues) {
if (shouldWriteField(fieldName) && fieldValues != null && fieldValues.length > 0) {
- generator.writeArrayFieldStart(fieldName);
+ generator.writeArrayPropertyStart(fieldName);
for (String fieldValue : fieldValues) {
generator.writeString(fieldValue);
}
@@ -119,12 +104,10 @@ public static void writeStringArrayField(JsonGenerator generator, String fieldNa
* @param generator the {@link JsonGenerator} to produce JSON content
* @param fieldName the field name
* @param fieldValue the field value
- *
- * @throws IOException if an I/O error occurs
*/
- public static void writeStringField(JsonGenerator generator, String fieldName, String fieldValue) throws IOException {
+ public static void writeStringField(JsonGenerator generator, String fieldName, String fieldValue) {
if (shouldWriteField(fieldName) && fieldValue != null) {
- generator.writeStringField(fieldName, fieldValue);
+ generator.writeStringProperty(fieldName, fieldValue);
}
}
@@ -134,12 +117,10 @@ public static void writeStringField(JsonGenerator generator, String fieldName, S
* @param generator the {@link JsonGenerator} to produce JSON content
* @param fieldName the field name
* @param fieldValue the field value
- *
- * @throws IOException if an I/O error occurs
*/
- public static void writeNumberField(JsonGenerator generator, String fieldName, int fieldValue) throws IOException {
+ public static void writeNumberField(JsonGenerator generator, String fieldName, int fieldValue) {
if (shouldWriteField(fieldName)) {
- generator.writeNumberField(fieldName, fieldValue);
+ generator.writeNumberProperty(fieldName, fieldValue);
}
}
@@ -149,12 +130,10 @@ public static void writeNumberField(JsonGenerator generator, String fieldName, i
* @param generator the {@link JsonGenerator} to produce JSON content
* @param fieldName the field name
* @param fieldValue the field value
- *
- * @throws IOException if an I/O error occurs
*/
- public static void writeNumberField(JsonGenerator generator, String fieldName, long fieldValue) throws IOException {
+ public static void writeNumberField(JsonGenerator generator, String fieldName, long fieldValue) {
if (shouldWriteField(fieldName)) {
- generator.writeNumberField(fieldName, fieldValue);
+ generator.writeNumberProperty(fieldName, fieldValue);
}
}
diff --git a/src/main/java/net/logstash/logback/composite/LogstashVersionJsonProvider.java b/src/main/java/net/logstash/logback/composite/LogstashVersionJsonProvider.java
index a6362e78..b83fa22c 100644
--- a/src/main/java/net/logstash/logback/composite/LogstashVersionJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/LogstashVersionJsonProvider.java
@@ -15,14 +15,12 @@
*/
package net.logstash.logback.composite;
-import java.io.IOException;
-
import net.logstash.logback.fieldnames.LogstashCommonFieldNames;
import ch.qos.logback.access.common.spi.IAccessEvent;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.spi.DeferredProcessingAware;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
/**
* Writes a version field as a string value (by default) or a numeric value (if {@link #isWriteAsInteger()} is true).
@@ -53,7 +51,7 @@ public LogstashVersionJsonProvider() {
}
@Override
- public void writeTo(JsonGenerator generator, Event event) throws IOException {
+ public void writeTo(JsonGenerator generator, Event event) {
if (writeAsInteger) {
JsonWritingUtils.writeNumberField(generator, getFieldName(), versionAsInteger);
} else {
diff --git a/src/main/java/net/logstash/logback/composite/JsonFactoryAware.java b/src/main/java/net/logstash/logback/composite/ObjectMapperAware.java
similarity index 78%
rename from src/main/java/net/logstash/logback/composite/JsonFactoryAware.java
rename to src/main/java/net/logstash/logback/composite/ObjectMapperAware.java
index 8420f2cf..4e44b5bd 100644
--- a/src/main/java/net/logstash/logback/composite/JsonFactoryAware.java
+++ b/src/main/java/net/logstash/logback/composite/ObjectMapperAware.java
@@ -15,12 +15,13 @@
*/
package net.logstash.logback.composite;
-import com.fasterxml.jackson.core.JsonFactory;
+import tools.jackson.databind.ObjectMapper;
/**
* Can be implemented by {@link JsonProvider}s to indicate that
- * the provider needs to be injected with the {@link JsonFactory}.
+ * the provider needs to be injected with the {@link ObjectMapper}.
*/
-public interface JsonFactoryAware {
- void setJsonFactory(JsonFactory jsonFactory);
+public interface ObjectMapperAware {
+
+ void setObjectMapper(ObjectMapper objectMapper);
}
diff --git a/src/main/java/net/logstash/logback/composite/SequenceJsonProvider.java b/src/main/java/net/logstash/logback/composite/SequenceJsonProvider.java
index 498200da..40ff56d2 100644
--- a/src/main/java/net/logstash/logback/composite/SequenceJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/SequenceJsonProvider.java
@@ -15,11 +15,10 @@
*/
package net.logstash.logback.composite;
-import java.io.IOException;
import java.util.concurrent.atomic.AtomicLong;
import ch.qos.logback.core.spi.DeferredProcessingAware;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
/**
* Outputs an incrementing sequence number.
@@ -39,7 +38,7 @@ public SequenceJsonProvider() {
}
@Override
- public void writeTo(JsonGenerator generator, Event iLoggingEvent) throws IOException {
+ public void writeTo(JsonGenerator generator, Event iLoggingEvent) {
JsonWritingUtils.writeNumberField(generator, getFieldName(), sequenceNumber.incrementAndGet());
}
diff --git a/src/main/java/net/logstash/logback/composite/UuidJsonProvider.java b/src/main/java/net/logstash/logback/composite/UuidJsonProvider.java
index 8ba6e2f5..83523f9a 100644
--- a/src/main/java/net/logstash/logback/composite/UuidJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/UuidJsonProvider.java
@@ -15,14 +15,12 @@
*/
package net.logstash.logback.composite;
-import java.io.IOException;
-
import ch.qos.logback.core.spi.DeferredProcessingAware;
-import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.uuid.EthernetAddress;
import com.fasterxml.uuid.Generators;
import com.fasterxml.uuid.NoArgGenerator;
import com.fasterxml.uuid.impl.TimeBasedGenerator;
+import tools.jackson.core.JsonGenerator;
/**
* Outputs random UUID as field value.
@@ -64,7 +62,7 @@ public UuidJsonProvider() {
}
@Override
- public void writeTo(JsonGenerator generator, Event event) throws IOException {
+ public void writeTo(JsonGenerator generator, Event event) {
JsonWritingUtils.writeStringField(generator, getFieldName(), uuids.generate().toString());
}
diff --git a/src/main/java/net/logstash/logback/composite/accessevent/AccessEventPatternJsonProvider.java b/src/main/java/net/logstash/logback/composite/accessevent/AccessEventPatternJsonProvider.java
index 179dc09a..7ce4ad4e 100644
--- a/src/main/java/net/logstash/logback/composite/accessevent/AccessEventPatternJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/accessevent/AccessEventPatternJsonProvider.java
@@ -20,7 +20,6 @@
import net.logstash.logback.pattern.AccessEventJsonPatternParser;
import ch.qos.logback.access.common.spi.IAccessEvent;
-import com.fasterxml.jackson.core.JsonFactory;
/**
* @author Dmitry Andrianov
@@ -28,8 +27,8 @@
public class AccessEventPatternJsonProvider extends AbstractPatternJsonProvider {
@Override
- protected AbstractJsonPatternParser createParser(JsonFactory jsonFactory) {
- return new AccessEventJsonPatternParser(getContext(), jsonFactory);
+ protected AbstractJsonPatternParser createParser() {
+ return new AccessEventJsonPatternParser(getContext(), objectMapper);
}
}
diff --git a/src/main/java/net/logstash/logback/composite/accessevent/AccessMessageJsonProvider.java b/src/main/java/net/logstash/logback/composite/accessevent/AccessMessageJsonProvider.java
index 7c141cc4..81fe274e 100644
--- a/src/main/java/net/logstash/logback/composite/accessevent/AccessMessageJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/accessevent/AccessMessageJsonProvider.java
@@ -15,14 +15,12 @@
*/
package net.logstash.logback.composite.accessevent;
-import java.io.IOException;
-
import net.logstash.logback.composite.JsonWritingUtils;
import net.logstash.logback.composite.loggingevent.MessageJsonProvider;
import net.logstash.logback.fieldnames.LogstashAccessFieldNames;
import ch.qos.logback.access.common.spi.IAccessEvent;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
public class AccessMessageJsonProvider extends AccessEventFormattedTimestampJsonProvider {
@@ -33,7 +31,7 @@ public AccessMessageJsonProvider() {
}
@Override
- public void writeTo(JsonGenerator generator, IAccessEvent event) throws IOException {
+ public void writeTo(JsonGenerator generator, IAccessEvent event) {
JsonWritingUtils.writeStringField(generator,
getFieldName(),
String.format("%s - %s [%s] \"%s\" %s %s",
diff --git a/src/main/java/net/logstash/logback/composite/accessevent/ContentLengthJsonProvider.java b/src/main/java/net/logstash/logback/composite/accessevent/ContentLengthJsonProvider.java
index 0b51b8df..dbfb03b9 100644
--- a/src/main/java/net/logstash/logback/composite/accessevent/ContentLengthJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/accessevent/ContentLengthJsonProvider.java
@@ -15,15 +15,13 @@
*/
package net.logstash.logback.composite.accessevent;
-import java.io.IOException;
-
import net.logstash.logback.composite.AbstractFieldJsonProvider;
import net.logstash.logback.composite.FieldNamesAware;
import net.logstash.logback.composite.JsonWritingUtils;
import net.logstash.logback.fieldnames.LogstashAccessFieldNames;
import ch.qos.logback.access.common.spi.IAccessEvent;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
public class ContentLengthJsonProvider extends AbstractFieldJsonProvider implements FieldNamesAware {
@@ -34,7 +32,7 @@ public ContentLengthJsonProvider() {
}
@Override
- public void writeTo(JsonGenerator generator, IAccessEvent event) throws IOException {
+ public void writeTo(JsonGenerator generator, IAccessEvent event) {
JsonWritingUtils.writeNumberField(generator, getFieldName(), event.getContentLength());
}
diff --git a/src/main/java/net/logstash/logback/composite/accessevent/ElapsedTimeJsonProvider.java b/src/main/java/net/logstash/logback/composite/accessevent/ElapsedTimeJsonProvider.java
index 2699c662..b22a2006 100644
--- a/src/main/java/net/logstash/logback/composite/accessevent/ElapsedTimeJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/accessevent/ElapsedTimeJsonProvider.java
@@ -15,15 +15,13 @@
*/
package net.logstash.logback.composite.accessevent;
-import java.io.IOException;
-
import net.logstash.logback.composite.AbstractFieldJsonProvider;
import net.logstash.logback.composite.FieldNamesAware;
import net.logstash.logback.composite.JsonWritingUtils;
import net.logstash.logback.fieldnames.LogstashAccessFieldNames;
import ch.qos.logback.access.common.spi.IAccessEvent;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
public class ElapsedTimeJsonProvider extends AbstractFieldJsonProvider implements FieldNamesAware {
@@ -34,7 +32,7 @@ public ElapsedTimeJsonProvider() {
}
@Override
- public void writeTo(JsonGenerator generator, IAccessEvent event) throws IOException {
+ public void writeTo(JsonGenerator generator, IAccessEvent event) {
JsonWritingUtils.writeNumberField(generator, getFieldName(), event.getElapsedTime());
}
diff --git a/src/main/java/net/logstash/logback/composite/accessevent/MethodJsonProvider.java b/src/main/java/net/logstash/logback/composite/accessevent/MethodJsonProvider.java
index 6d68db5c..0886fa60 100644
--- a/src/main/java/net/logstash/logback/composite/accessevent/MethodJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/accessevent/MethodJsonProvider.java
@@ -15,15 +15,13 @@
*/
package net.logstash.logback.composite.accessevent;
-import java.io.IOException;
-
import net.logstash.logback.composite.AbstractFieldJsonProvider;
import net.logstash.logback.composite.FieldNamesAware;
import net.logstash.logback.composite.JsonWritingUtils;
import net.logstash.logback.fieldnames.LogstashAccessFieldNames;
import ch.qos.logback.access.common.spi.IAccessEvent;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
public class MethodJsonProvider extends AbstractFieldJsonProvider implements FieldNamesAware {
@@ -34,7 +32,7 @@ public MethodJsonProvider() {
}
@Override
- public void writeTo(JsonGenerator generator, IAccessEvent event) throws IOException {
+ public void writeTo(JsonGenerator generator, IAccessEvent event) {
JsonWritingUtils.writeStringField(generator, getFieldName(), event.getMethod());
}
diff --git a/src/main/java/net/logstash/logback/composite/accessevent/ProtocolJsonProvider.java b/src/main/java/net/logstash/logback/composite/accessevent/ProtocolJsonProvider.java
index df04aad2..f465d809 100644
--- a/src/main/java/net/logstash/logback/composite/accessevent/ProtocolJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/accessevent/ProtocolJsonProvider.java
@@ -15,15 +15,13 @@
*/
package net.logstash.logback.composite.accessevent;
-import java.io.IOException;
-
import net.logstash.logback.composite.AbstractFieldJsonProvider;
import net.logstash.logback.composite.FieldNamesAware;
import net.logstash.logback.composite.JsonWritingUtils;
import net.logstash.logback.fieldnames.LogstashAccessFieldNames;
import ch.qos.logback.access.common.spi.IAccessEvent;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
public class ProtocolJsonProvider extends AbstractFieldJsonProvider implements FieldNamesAware {
@@ -34,7 +32,7 @@ public ProtocolJsonProvider() {
}
@Override
- public void writeTo(JsonGenerator generator, IAccessEvent event) throws IOException {
+ public void writeTo(JsonGenerator generator, IAccessEvent event) {
JsonWritingUtils.writeStringField(generator, getFieldName(), event.getProtocol());
}
diff --git a/src/main/java/net/logstash/logback/composite/accessevent/RemoteHostJsonProvider.java b/src/main/java/net/logstash/logback/composite/accessevent/RemoteHostJsonProvider.java
index 359bb5b1..74bf1414 100644
--- a/src/main/java/net/logstash/logback/composite/accessevent/RemoteHostJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/accessevent/RemoteHostJsonProvider.java
@@ -15,15 +15,13 @@
*/
package net.logstash.logback.composite.accessevent;
-import java.io.IOException;
-
import net.logstash.logback.composite.AbstractFieldJsonProvider;
import net.logstash.logback.composite.FieldNamesAware;
import net.logstash.logback.composite.JsonWritingUtils;
import net.logstash.logback.fieldnames.LogstashAccessFieldNames;
import ch.qos.logback.access.common.spi.IAccessEvent;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
public class RemoteHostJsonProvider extends AbstractFieldJsonProvider implements FieldNamesAware {
@@ -34,7 +32,7 @@ public RemoteHostJsonProvider() {
}
@Override
- public void writeTo(JsonGenerator generator, IAccessEvent event) throws IOException {
+ public void writeTo(JsonGenerator generator, IAccessEvent event) {
JsonWritingUtils.writeStringField(generator, getFieldName(), event.getRemoteHost());
}
diff --git a/src/main/java/net/logstash/logback/composite/accessevent/RemoteUserJsonProvider.java b/src/main/java/net/logstash/logback/composite/accessevent/RemoteUserJsonProvider.java
index 9cb58ae5..9c5a0b7a 100644
--- a/src/main/java/net/logstash/logback/composite/accessevent/RemoteUserJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/accessevent/RemoteUserJsonProvider.java
@@ -15,15 +15,13 @@
*/
package net.logstash.logback.composite.accessevent;
-import java.io.IOException;
-
import net.logstash.logback.composite.AbstractFieldJsonProvider;
import net.logstash.logback.composite.FieldNamesAware;
import net.logstash.logback.composite.JsonWritingUtils;
import net.logstash.logback.fieldnames.LogstashAccessFieldNames;
import ch.qos.logback.access.common.spi.IAccessEvent;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
public class RemoteUserJsonProvider extends AbstractFieldJsonProvider implements FieldNamesAware {
@@ -34,7 +32,7 @@ public RemoteUserJsonProvider() {
}
@Override
- public void writeTo(JsonGenerator generator, IAccessEvent event) throws IOException {
+ public void writeTo(JsonGenerator generator, IAccessEvent event) {
JsonWritingUtils.writeStringField(generator, getFieldName(), event.getRemoteUser());
}
diff --git a/src/main/java/net/logstash/logback/composite/accessevent/RequestHeadersJsonProvider.java b/src/main/java/net/logstash/logback/composite/accessevent/RequestHeadersJsonProvider.java
index 753afbee..a1de2178 100644
--- a/src/main/java/net/logstash/logback/composite/accessevent/RequestHeadersJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/accessevent/RequestHeadersJsonProvider.java
@@ -15,7 +15,6 @@
*/
package net.logstash.logback.composite.accessevent;
-import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@@ -26,7 +25,7 @@
import ch.qos.logback.access.common.spi.IAccessEvent;
import ch.qos.logback.core.joran.spi.DefaultClass;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
public class RequestHeadersJsonProvider extends AbstractFieldJsonProvider implements FieldNamesAware {
@@ -38,7 +37,7 @@ public class RequestHeadersJsonProvider extends AbstractFieldJsonProvider headers;
if (filter == null) {
headers = event.getRequestHeaderMap();
diff --git a/src/main/java/net/logstash/logback/composite/accessevent/RequestedUriJsonProvider.java b/src/main/java/net/logstash/logback/composite/accessevent/RequestedUriJsonProvider.java
index cc9009d3..e0cf8212 100644
--- a/src/main/java/net/logstash/logback/composite/accessevent/RequestedUriJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/accessevent/RequestedUriJsonProvider.java
@@ -15,15 +15,13 @@
*/
package net.logstash.logback.composite.accessevent;
-import java.io.IOException;
-
import net.logstash.logback.composite.AbstractFieldJsonProvider;
import net.logstash.logback.composite.FieldNamesAware;
import net.logstash.logback.composite.JsonWritingUtils;
import net.logstash.logback.fieldnames.LogstashAccessFieldNames;
import ch.qos.logback.access.common.spi.IAccessEvent;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
public class RequestedUriJsonProvider extends AbstractFieldJsonProvider implements FieldNamesAware {
@@ -34,7 +32,7 @@ public RequestedUriJsonProvider() {
}
@Override
- public void writeTo(JsonGenerator generator, IAccessEvent event) throws IOException {
+ public void writeTo(JsonGenerator generator, IAccessEvent event) {
JsonWritingUtils.writeStringField(generator, getFieldName(), event.getRequestURI());
}
diff --git a/src/main/java/net/logstash/logback/composite/accessevent/RequestedUrlJsonProvider.java b/src/main/java/net/logstash/logback/composite/accessevent/RequestedUrlJsonProvider.java
index 50c435d8..f1e6cf69 100644
--- a/src/main/java/net/logstash/logback/composite/accessevent/RequestedUrlJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/accessevent/RequestedUrlJsonProvider.java
@@ -15,15 +15,13 @@
*/
package net.logstash.logback.composite.accessevent;
-import java.io.IOException;
-
import net.logstash.logback.composite.AbstractFieldJsonProvider;
import net.logstash.logback.composite.FieldNamesAware;
import net.logstash.logback.composite.JsonWritingUtils;
import net.logstash.logback.fieldnames.LogstashAccessFieldNames;
import ch.qos.logback.access.common.spi.IAccessEvent;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
public class RequestedUrlJsonProvider extends AbstractFieldJsonProvider implements FieldNamesAware {
@@ -34,7 +32,7 @@ public RequestedUrlJsonProvider() {
}
@Override
- public void writeTo(JsonGenerator generator, IAccessEvent event) throws IOException {
+ public void writeTo(JsonGenerator generator, IAccessEvent event) {
JsonWritingUtils.writeStringField(generator, getFieldName(), event.getRequestURL());
}
diff --git a/src/main/java/net/logstash/logback/composite/accessevent/ResponseHeadersJsonProvider.java b/src/main/java/net/logstash/logback/composite/accessevent/ResponseHeadersJsonProvider.java
index aae338e4..77caa6e6 100644
--- a/src/main/java/net/logstash/logback/composite/accessevent/ResponseHeadersJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/accessevent/ResponseHeadersJsonProvider.java
@@ -15,7 +15,6 @@
*/
package net.logstash.logback.composite.accessevent;
-import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@@ -26,7 +25,7 @@
import ch.qos.logback.access.common.spi.IAccessEvent;
import ch.qos.logback.core.joran.spi.DefaultClass;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
public class ResponseHeadersJsonProvider extends AbstractFieldJsonProvider implements FieldNamesAware {
@@ -38,7 +37,7 @@ public class ResponseHeadersJsonProvider extends AbstractFieldJsonProvider headers;
if (filter == null) {
headers = event.getResponseHeaderMap();
diff --git a/src/main/java/net/logstash/logback/composite/accessevent/StatusCodeJsonProvider.java b/src/main/java/net/logstash/logback/composite/accessevent/StatusCodeJsonProvider.java
index 6573566d..bbcbb1af 100644
--- a/src/main/java/net/logstash/logback/composite/accessevent/StatusCodeJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/accessevent/StatusCodeJsonProvider.java
@@ -15,15 +15,13 @@
*/
package net.logstash.logback.composite.accessevent;
-import java.io.IOException;
-
import net.logstash.logback.composite.AbstractFieldJsonProvider;
import net.logstash.logback.composite.FieldNamesAware;
import net.logstash.logback.composite.JsonWritingUtils;
import net.logstash.logback.fieldnames.LogstashAccessFieldNames;
import ch.qos.logback.access.common.spi.IAccessEvent;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
public class StatusCodeJsonProvider extends AbstractFieldJsonProvider implements FieldNamesAware {
@@ -34,7 +32,7 @@ public StatusCodeJsonProvider() {
}
@Override
- public void writeTo(JsonGenerator generator, IAccessEvent event) throws IOException {
+ public void writeTo(JsonGenerator generator, IAccessEvent event) {
JsonWritingUtils.writeNumberField(generator, getFieldName(), event.getStatusCode());
}
diff --git a/src/main/java/net/logstash/logback/composite/loggingevent/AbstractThrowableClassNameJsonProvider.java b/src/main/java/net/logstash/logback/composite/loggingevent/AbstractThrowableClassNameJsonProvider.java
index 8fef86c5..17f134df 100644
--- a/src/main/java/net/logstash/logback/composite/loggingevent/AbstractThrowableClassNameJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/loggingevent/AbstractThrowableClassNameJsonProvider.java
@@ -15,15 +15,13 @@
*/
package net.logstash.logback.composite.loggingevent;
-import java.io.IOException;
-
import net.logstash.logback.composite.AbstractFieldJsonProvider;
import net.logstash.logback.composite.JsonWritingUtils;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.ThrowableProxy;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
public abstract class AbstractThrowableClassNameJsonProvider extends AbstractFieldJsonProvider {
static final boolean DEFAULT_USE_SIMPLE_CLASS_NAME = true;
@@ -35,7 +33,7 @@ public AbstractThrowableClassNameJsonProvider(String fieldName) {
}
@Override
- public void writeTo(JsonGenerator generator, ILoggingEvent event) throws IOException {
+ public void writeTo(JsonGenerator generator, ILoggingEvent event) {
IThrowableProxy throwable = getThrowable(event.getThrowableProxy());
if (throwable != null) {
String throwableClassName = determineClassName(throwable);
diff --git a/src/main/java/net/logstash/logback/composite/loggingevent/AbstractThrowableMessageJsonProvider.java b/src/main/java/net/logstash/logback/composite/loggingevent/AbstractThrowableMessageJsonProvider.java
index 7ce27b3a..0b774a42 100644
--- a/src/main/java/net/logstash/logback/composite/loggingevent/AbstractThrowableMessageJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/loggingevent/AbstractThrowableMessageJsonProvider.java
@@ -15,14 +15,12 @@
*/
package net.logstash.logback.composite.loggingevent;
-import java.io.IOException;
-
import net.logstash.logback.composite.AbstractFieldJsonProvider;
import net.logstash.logback.composite.JsonWritingUtils;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.IThrowableProxy;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
/**
* Logs an exception message for a given logging event. Which exception to be
@@ -36,7 +34,7 @@ protected AbstractThrowableMessageJsonProvider(String fieldName) {
}
@Override
- public void writeTo(JsonGenerator generator, ILoggingEvent event) throws IOException {
+ public void writeTo(JsonGenerator generator, ILoggingEvent event) {
IThrowableProxy throwable = getThrowable(event);
if (throwable != null) {
String throwableMessage = throwable.getMessage();
diff --git a/src/main/java/net/logstash/logback/composite/loggingevent/ArgumentsJsonProvider.java b/src/main/java/net/logstash/logback/composite/loggingevent/ArgumentsJsonProvider.java
index 3fc46571..91b26b8a 100644
--- a/src/main/java/net/logstash/logback/composite/loggingevent/ArgumentsJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/loggingevent/ArgumentsJsonProvider.java
@@ -15,15 +15,13 @@
*/
package net.logstash.logback.composite.loggingevent;
-import java.io.IOException;
-
import net.logstash.logback.argument.StructuredArgument;
import net.logstash.logback.composite.AbstractFieldJsonProvider;
import net.logstash.logback.composite.FieldNamesAware;
import net.logstash.logback.fieldnames.LogstashFieldNames;
import ch.qos.logback.classic.spi.ILoggingEvent;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
/**
* Include the logging event's {@link ILoggingEvent#getArgumentArray()} in the JSON output.
@@ -49,7 +47,7 @@ public class ArgumentsJsonProvider extends AbstractFieldJsonProvider implements FieldNamesAware {
@@ -38,13 +36,13 @@ public class CallerDataJsonProvider extends AbstractFieldJsonProvider {
@@ -32,7 +30,7 @@ public ContextNameJsonProvider() {
}
@Override
- public void writeTo(JsonGenerator generator, ILoggingEvent event) throws IOException {
+ public void writeTo(JsonGenerator generator, ILoggingEvent event) {
JsonWritingUtils.writeStringField(generator, getFieldName(), event.getLoggerContextVO().getName());
}
diff --git a/src/main/java/net/logstash/logback/composite/loggingevent/KeyValuePairsJsonProvider.java b/src/main/java/net/logstash/logback/composite/loggingevent/KeyValuePairsJsonProvider.java
index ad31efc3..90ff5a72 100644
--- a/src/main/java/net/logstash/logback/composite/loggingevent/KeyValuePairsJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/loggingevent/KeyValuePairsJsonProvider.java
@@ -15,7 +15,6 @@
*/
package net.logstash.logback.composite.loggingevent;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@@ -27,8 +26,8 @@
import net.logstash.logback.fieldnames.LogstashFieldNames;
import ch.qos.logback.classic.spi.ILoggingEvent;
-import com.fasterxml.jackson.core.JsonGenerator;
import org.slf4j.event.KeyValuePair;
+import tools.jackson.core.JsonGenerator;
/**
* Includes key value pairs added from slf4j's fluent api in the output according to
@@ -82,7 +81,7 @@ public void start() {
}
@Override
- public void writeTo(JsonGenerator generator, ILoggingEvent event) throws IOException {
+ public void writeTo(JsonGenerator generator, ILoggingEvent event) {
List keyValuePairs = event.getKeyValuePairs();
if (keyValuePairs == null || keyValuePairs.isEmpty()) {
return;
@@ -90,7 +89,7 @@ public void writeTo(JsonGenerator generator, ILoggingEvent event) throws IOExcep
String fieldName = getFieldName();
if (fieldName != null) {
- generator.writeObjectFieldStart(getFieldName());
+ generator.writeObjectPropertyStart(getFieldName());
}
for (KeyValuePair keyValuePair : keyValuePairs) {
@@ -102,8 +101,7 @@ public void writeTo(JsonGenerator generator, ILoggingEvent event) throws IOExcep
if (key == null) {
key = keyValuePair.key;
}
- generator.writeFieldName(key);
- generator.writeObject(keyValuePair.value);
+ generator.writePOJOProperty(key, keyValuePair.value);
}
}
diff --git a/src/main/java/net/logstash/logback/composite/loggingevent/LogLevelJsonProvider.java b/src/main/java/net/logstash/logback/composite/loggingevent/LogLevelJsonProvider.java
index 577574a2..a5a121aa 100644
--- a/src/main/java/net/logstash/logback/composite/loggingevent/LogLevelJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/loggingevent/LogLevelJsonProvider.java
@@ -15,15 +15,13 @@
*/
package net.logstash.logback.composite.loggingevent;
-import java.io.IOException;
-
import net.logstash.logback.composite.AbstractFieldJsonProvider;
import net.logstash.logback.composite.FieldNamesAware;
import net.logstash.logback.composite.JsonWritingUtils;
import net.logstash.logback.fieldnames.LogstashFieldNames;
import ch.qos.logback.classic.spi.ILoggingEvent;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
public class LogLevelJsonProvider extends AbstractFieldJsonProvider implements FieldNamesAware {
@@ -34,7 +32,7 @@ public LogLevelJsonProvider() {
}
@Override
- public void writeTo(JsonGenerator generator, ILoggingEvent event) throws IOException {
+ public void writeTo(JsonGenerator generator, ILoggingEvent event) {
JsonWritingUtils.writeStringField(generator, getFieldName(), event.getLevel().toString());
}
diff --git a/src/main/java/net/logstash/logback/composite/loggingevent/LogLevelValueJsonProvider.java b/src/main/java/net/logstash/logback/composite/loggingevent/LogLevelValueJsonProvider.java
index 97dae005..23deb644 100644
--- a/src/main/java/net/logstash/logback/composite/loggingevent/LogLevelValueJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/loggingevent/LogLevelValueJsonProvider.java
@@ -15,15 +15,13 @@
*/
package net.logstash.logback.composite.loggingevent;
-import java.io.IOException;
-
import net.logstash.logback.composite.AbstractFieldJsonProvider;
import net.logstash.logback.composite.FieldNamesAware;
import net.logstash.logback.composite.JsonWritingUtils;
import net.logstash.logback.fieldnames.LogstashFieldNames;
import ch.qos.logback.classic.spi.ILoggingEvent;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
public class LogLevelValueJsonProvider extends AbstractFieldJsonProvider implements FieldNamesAware {
@@ -34,7 +32,7 @@ public LogLevelValueJsonProvider() {
}
@Override
- public void writeTo(JsonGenerator generator, ILoggingEvent event) throws IOException {
+ public void writeTo(JsonGenerator generator, ILoggingEvent event) {
JsonWritingUtils.writeNumberField(generator, getFieldName(), event.getLevel().toInt());
}
diff --git a/src/main/java/net/logstash/logback/composite/loggingevent/LoggerNameJsonProvider.java b/src/main/java/net/logstash/logback/composite/loggingevent/LoggerNameJsonProvider.java
index 06d0a61d..1b73ade8 100644
--- a/src/main/java/net/logstash/logback/composite/loggingevent/LoggerNameJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/loggingevent/LoggerNameJsonProvider.java
@@ -15,7 +15,6 @@
*/
package net.logstash.logback.composite.loggingevent;
-import java.io.IOException;
import java.util.Objects;
import net.logstash.logback.abbreviator.DefaultTargetLengthAbbreviator;
@@ -28,7 +27,7 @@
import ch.qos.logback.classic.pattern.Abbreviator;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.joran.spi.DefaultClass;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
public class LoggerNameJsonProvider extends AbstractFieldJsonProvider implements FieldNamesAware {
@@ -45,7 +44,7 @@ public LoggerNameJsonProvider() {
}
@Override
- public void writeTo(JsonGenerator generator, ILoggingEvent event) throws IOException {
+ public void writeTo(JsonGenerator generator, ILoggingEvent event) {
if (!isStarted()) {
throw new IllegalStateException("Generator is not started");
}
diff --git a/src/main/java/net/logstash/logback/composite/loggingevent/LoggingEventPatternJsonProvider.java b/src/main/java/net/logstash/logback/composite/loggingevent/LoggingEventPatternJsonProvider.java
index 036cdbe1..8c4871c4 100644
--- a/src/main/java/net/logstash/logback/composite/loggingevent/LoggingEventPatternJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/loggingevent/LoggingEventPatternJsonProvider.java
@@ -20,7 +20,6 @@
import net.logstash.logback.pattern.LoggingEventJsonPatternParser;
import ch.qos.logback.classic.spi.ILoggingEvent;
-import com.fasterxml.jackson.core.JsonFactory;
/**
* @author Dmitry Andrianov
@@ -28,8 +27,8 @@
public class LoggingEventPatternJsonProvider extends AbstractPatternJsonProvider {
@Override
- protected AbstractJsonPatternParser createParser(JsonFactory jsonFactory) {
- return new LoggingEventJsonPatternParser(getContext(), jsonFactory);
+ protected AbstractJsonPatternParser createParser() {
+ return new LoggingEventJsonPatternParser(getContext(), objectMapper);
}
}
diff --git a/src/main/java/net/logstash/logback/composite/loggingevent/LogstashMarkersJsonProvider.java b/src/main/java/net/logstash/logback/composite/loggingevent/LogstashMarkersJsonProvider.java
index 7ef458d7..68cabe25 100644
--- a/src/main/java/net/logstash/logback/composite/loggingevent/LogstashMarkersJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/loggingevent/LogstashMarkersJsonProvider.java
@@ -15,7 +15,6 @@
*/
package net.logstash.logback.composite.loggingevent;
-import java.io.IOException;
import java.util.Iterator;
import java.util.List;
@@ -25,8 +24,8 @@
import net.logstash.logback.marker.Markers;
import ch.qos.logback.classic.spi.ILoggingEvent;
-import com.fasterxml.jackson.core.JsonGenerator;
import org.slf4j.Marker;
+import tools.jackson.core.JsonGenerator;
/**
* A {@link JsonProvider} that processes {@link LogstashMarker}s
@@ -35,11 +34,11 @@
public class LogstashMarkersJsonProvider extends AbstractJsonProvider {
@Override
- public void writeTo(JsonGenerator generator, ILoggingEvent event) throws IOException {
+ public void writeTo(JsonGenerator generator, ILoggingEvent event) {
writeLogstashMarkerIfNecessary(generator, event.getMarkerList());
}
- private void writeLogstashMarkerIfNecessary(JsonGenerator generator, List markers) throws IOException {
+ private void writeLogstashMarkerIfNecessary(JsonGenerator generator, List markers) {
if (markers != null) {
for (Marker marker: markers) {
writeLogstashMarkerIfNecessary(generator, marker);
@@ -47,7 +46,7 @@ private void writeLogstashMarkerIfNecessary(JsonGenerator generator, List mdcProperties = event.getMDCPropertyMap();
if (mdcProperties != null && !mdcProperties.isEmpty()) {
@@ -107,7 +106,7 @@ public void writeTo(JsonGenerator generator, ILoggingEvent event) throws IOExcep
fieldName = entry.getKey();
}
if (!hasWrittenStart && getFieldName() != null) {
- generator.writeObjectFieldStart(getFieldName());
+ generator.writeObjectPropertyStart(getFieldName());
hasWrittenStart = true;
}
writeMdcEntry(generator, fieldName, entry.getKey(), entry.getValue());
@@ -184,15 +183,14 @@ public void addMdcKeyFieldName(String mdcKeyFieldName) {
* @param mdcKey the key of the MDC map entry.
* @param mdcValue the value of the MDC map entry.
*/
- private void writeMdcEntry(JsonGenerator generator, String fieldName, String mdcKey, String mdcValue) throws IOException {
+ private void writeMdcEntry(JsonGenerator generator, String fieldName, String mdcKey, String mdcValue) {
for (MdcEntryWriter mdcEntryWriter : this.mdcEntryWriters) {
if (mdcEntryWriter.writeMdcEntry(generator, fieldName, mdcKey, mdcValue)) {
return;
}
}
- generator.writeFieldName(fieldName);
- generator.writeObject(mdcValue);
+ generator.writePOJOProperty(fieldName, mdcValue);
}
}
diff --git a/src/main/java/net/logstash/logback/composite/loggingevent/MessageJsonProvider.java b/src/main/java/net/logstash/logback/composite/loggingevent/MessageJsonProvider.java
index 427b5a74..ee081f2f 100644
--- a/src/main/java/net/logstash/logback/composite/loggingevent/MessageJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/loggingevent/MessageJsonProvider.java
@@ -15,7 +15,6 @@
*/
package net.logstash.logback.composite.loggingevent;
-import java.io.IOException;
import java.util.regex.Pattern;
import net.logstash.logback.composite.AbstractFieldJsonProvider;
@@ -25,7 +24,7 @@
import net.logstash.logback.fieldnames.LogstashFieldNames;
import ch.qos.logback.classic.spi.ILoggingEvent;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
public class MessageJsonProvider extends AbstractFieldJsonProvider implements FieldNamesAware {
@@ -38,7 +37,7 @@ public MessageJsonProvider() {
}
@Override
- public void writeTo(JsonGenerator generator, ILoggingEvent event) throws IOException {
+ public void writeTo(JsonGenerator generator, ILoggingEvent event) {
if (messageSplitPattern != null) {
String[] multiLineMessage = messageSplitPattern.split(event.getFormattedMessage());
JsonWritingUtils.writeStringArrayField(generator, getFieldName(), multiLineMessage);
diff --git a/src/main/java/net/logstash/logback/composite/loggingevent/RawMessageJsonProvider.java b/src/main/java/net/logstash/logback/composite/loggingevent/RawMessageJsonProvider.java
index d78247b8..7d074d7b 100644
--- a/src/main/java/net/logstash/logback/composite/loggingevent/RawMessageJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/loggingevent/RawMessageJsonProvider.java
@@ -15,13 +15,11 @@
*/
package net.logstash.logback.composite.loggingevent;
-import java.io.IOException;
-
import net.logstash.logback.composite.AbstractFieldJsonProvider;
import net.logstash.logback.composite.JsonWritingUtils;
import ch.qos.logback.classic.spi.ILoggingEvent;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
public class RawMessageJsonProvider extends AbstractFieldJsonProvider {
@@ -32,7 +30,7 @@ public RawMessageJsonProvider() {
}
@Override
- public void writeTo(JsonGenerator generator, ILoggingEvent event) throws IOException {
+ public void writeTo(JsonGenerator generator, ILoggingEvent event) {
JsonWritingUtils.writeStringField(generator, getFieldName(), event.getMessage());
}
diff --git a/src/main/java/net/logstash/logback/composite/loggingevent/RootStackTraceElementJsonProvider.java b/src/main/java/net/logstash/logback/composite/loggingevent/RootStackTraceElementJsonProvider.java
index 25e2d3bb..7eab1149 100644
--- a/src/main/java/net/logstash/logback/composite/loggingevent/RootStackTraceElementJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/loggingevent/RootStackTraceElementJsonProvider.java
@@ -15,8 +15,6 @@
*/
package net.logstash.logback.composite.loggingevent;
-import java.io.IOException;
-
import net.logstash.logback.composite.AbstractFieldJsonProvider;
import net.logstash.logback.composite.FieldNamesAware;
import net.logstash.logback.composite.JsonWritingUtils;
@@ -25,7 +23,7 @@
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.ThrowableProxy;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
/**
* A JSON provider that, for any log event with a stack trace,
@@ -48,13 +46,13 @@ public RootStackTraceElementJsonProvider() {
}
@Override
- public void writeTo(JsonGenerator generator, ILoggingEvent event) throws IOException {
+ public void writeTo(JsonGenerator generator, ILoggingEvent event) {
IThrowableProxy throwableProxy = event.getThrowableProxy();
- if (throwableProxy != null && throwableProxy instanceof ThrowableProxy) {
+ if (throwableProxy instanceof ThrowableProxy) {
if (throwableProxy.getStackTraceElementProxyArray().length > 0) {
StackTraceElement stackTraceElement = throwableProxy.getStackTraceElementProxyArray()[0].getStackTraceElement();
- generator.writeObjectFieldStart(getFieldName());
+ generator.writeObjectPropertyStart(getFieldName());
JsonWritingUtils.writeStringField(generator, classFieldName, stackTraceElement.getClassName());
JsonWritingUtils.writeStringField(generator, methodFieldName, stackTraceElement.getMethodName());
generator.writeEndObject();
diff --git a/src/main/java/net/logstash/logback/composite/loggingevent/StackHashJsonProvider.java b/src/main/java/net/logstash/logback/composite/loggingevent/StackHashJsonProvider.java
index 59ef3f7d..7d968ea0 100644
--- a/src/main/java/net/logstash/logback/composite/loggingevent/StackHashJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/loggingevent/StackHashJsonProvider.java
@@ -17,7 +17,6 @@
import static net.logstash.logback.util.StringUtils.commaDelimitedListToStringArray;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
@@ -31,7 +30,7 @@
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.ThrowableProxy;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
/**
* A JSON provider that adds a {@code stack_hash} Json field on a log with a stack trace
@@ -103,7 +102,7 @@ public List getExcludes() {
}
@Override
- public void writeTo(JsonGenerator generator, ILoggingEvent event) throws IOException {
+ public void writeTo(JsonGenerator generator, ILoggingEvent event) {
assertIsStarted();
IThrowableProxy throwableProxy = event.getThrowableProxy();
diff --git a/src/main/java/net/logstash/logback/composite/loggingevent/StackTraceJsonProvider.java b/src/main/java/net/logstash/logback/composite/loggingevent/StackTraceJsonProvider.java
index 7bfe3e51..52f88b02 100644
--- a/src/main/java/net/logstash/logback/composite/loggingevent/StackTraceJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/loggingevent/StackTraceJsonProvider.java
@@ -15,8 +15,6 @@
*/
package net.logstash.logback.composite.loggingevent;
-import java.io.IOException;
-
import net.logstash.logback.composite.AbstractFieldJsonProvider;
import net.logstash.logback.composite.FieldNamesAware;
import net.logstash.logback.composite.JsonWritingUtils;
@@ -26,7 +24,7 @@
import ch.qos.logback.classic.pattern.ThrowableHandlingConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.IThrowableProxy;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
public class StackTraceJsonProvider extends AbstractFieldJsonProvider implements FieldNamesAware {
@@ -60,7 +58,7 @@ public void stop() {
}
@Override
- public void writeTo(JsonGenerator generator, ILoggingEvent event) throws IOException {
+ public void writeTo(JsonGenerator generator, ILoggingEvent event) {
IThrowableProxy throwableProxy = event.getThrowableProxy();
if (throwableProxy != null) {
JsonWritingUtils.writeStringField(generator, getFieldName(), throwableConverter.convert(event));
diff --git a/src/main/java/net/logstash/logback/composite/loggingevent/TagsJsonProvider.java b/src/main/java/net/logstash/logback/composite/loggingevent/TagsJsonProvider.java
index acc09070..3999b4f4 100644
--- a/src/main/java/net/logstash/logback/composite/loggingevent/TagsJsonProvider.java
+++ b/src/main/java/net/logstash/logback/composite/loggingevent/TagsJsonProvider.java
@@ -15,7 +15,6 @@
*/
package net.logstash.logback.composite.loggingevent;
-import java.io.IOException;
import java.util.Iterator;
import java.util.List;
@@ -25,8 +24,8 @@
import net.logstash.logback.marker.LogstashMarker;
import ch.qos.logback.classic.spi.ILoggingEvent;
-import com.fasterxml.jackson.core.JsonGenerator;
import org.slf4j.Marker;
+import tools.jackson.core.JsonGenerator;
/**
* Writes {@link Marker} names as an array to the 'tags' field.
@@ -43,7 +42,7 @@ public TagsJsonProvider() {
}
@Override
- public void writeTo(JsonGenerator generator, ILoggingEvent event) throws IOException {
+ public void writeTo(JsonGenerator generator, ILoggingEvent event) {
/*
* Don't write the tags field unless we actually have a tag to write.
*/
@@ -56,7 +55,7 @@ public void writeTo(JsonGenerator generator, ILoggingEvent event) throws IOExcep
}
}
- private boolean writeTagIfNecessary(JsonGenerator generator, boolean hasWrittenStart, final List markers) throws IOException {
+ private boolean writeTagIfNecessary(JsonGenerator generator, boolean hasWrittenStart, final List markers) {
if (markers != null) {
for (Marker marker: markers) {
hasWrittenStart |= writeTagIfNecessary(generator, hasWrittenStart, marker);
@@ -66,11 +65,11 @@ private boolean writeTagIfNecessary(JsonGenerator generator, boolean hasWrittenS
return hasWrittenStart;
}
- private boolean writeTagIfNecessary(JsonGenerator generator, boolean hasWrittenStart, final Marker marker) throws IOException {
+ private boolean writeTagIfNecessary(JsonGenerator generator, boolean hasWrittenStart, final Marker marker) {
if (marker != null) {
if (!LogstashMarkersJsonProvider.isLogstashMarker(marker)) {
if (!hasWrittenStart) {
- generator.writeArrayFieldStart(getFieldName());
+ generator.writeArrayPropertyStart(getFieldName());
hasWrittenStart = true;
}
generator.writeString(marker.getName());
diff --git a/src/main/java/net/logstash/logback/composite/loggingevent/mdc/BooleanMdcEntryWriter.java b/src/main/java/net/logstash/logback/composite/loggingevent/mdc/BooleanMdcEntryWriter.java
index eb728e36..5f0b507e 100644
--- a/src/main/java/net/logstash/logback/composite/loggingevent/mdc/BooleanMdcEntryWriter.java
+++ b/src/main/java/net/logstash/logback/composite/loggingevent/mdc/BooleanMdcEntryWriter.java
@@ -15,9 +15,7 @@
*/
package net.logstash.logback.composite.loggingevent.mdc;
-import java.io.IOException;
-
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
/**
* Writes boolean values (instead of String values) for any MDC values that equal "true" or "false", ignoring case.
@@ -25,15 +23,13 @@
public class BooleanMdcEntryWriter implements MdcEntryWriter {
@Override
- public boolean writeMdcEntry(JsonGenerator generator, String fieldName, String mdcKey, String mdcValue) throws IOException {
+ public boolean writeMdcEntry(JsonGenerator generator, String fieldName, String mdcKey, String mdcValue) {
if ("true".equalsIgnoreCase(mdcValue)) {
- generator.writeFieldName(fieldName);
- generator.writeBoolean(true);
+ generator.writeBooleanProperty(fieldName, true);
return true;
}
if ("false".equalsIgnoreCase(mdcValue)) {
- generator.writeFieldName(fieldName);
- generator.writeBoolean(false);
+ generator.writeBooleanProperty(fieldName, false);
return true;
}
diff --git a/src/main/java/net/logstash/logback/composite/loggingevent/mdc/DoubleMdcEntryWriter.java b/src/main/java/net/logstash/logback/composite/loggingevent/mdc/DoubleMdcEntryWriter.java
index e9b6593e..ed2fda2c 100644
--- a/src/main/java/net/logstash/logback/composite/loggingevent/mdc/DoubleMdcEntryWriter.java
+++ b/src/main/java/net/logstash/logback/composite/loggingevent/mdc/DoubleMdcEntryWriter.java
@@ -15,10 +15,9 @@
*/
package net.logstash.logback.composite.loggingevent.mdc;
-import java.io.IOException;
import java.util.regex.Pattern;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
/**
* Writes double values (instead of String values) for any MDC values that can be parsed as a double,
@@ -29,12 +28,11 @@ public class DoubleMdcEntryWriter implements MdcEntryWriter {
private static final Pattern DOUBLE_PATTERN = doublePattern();
@Override
- public boolean writeMdcEntry(JsonGenerator generator, String fieldName, String mdcKey, String mdcValue) throws IOException {
+ public boolean writeMdcEntry(JsonGenerator generator, String fieldName, String mdcKey, String mdcValue) {
if (shouldParse(mdcValue)) {
try {
double parsedValue = Double.parseDouble(mdcValue);
- generator.writeFieldName(fieldName);
- generator.writeNumber(parsedValue);
+ generator.writeNumberProperty(fieldName, parsedValue);
return true;
} catch (NumberFormatException ignore) {
}
diff --git a/src/main/java/net/logstash/logback/composite/loggingevent/mdc/LongMdcEntryWriter.java b/src/main/java/net/logstash/logback/composite/loggingevent/mdc/LongMdcEntryWriter.java
index b90d138c..1279494a 100644
--- a/src/main/java/net/logstash/logback/composite/loggingevent/mdc/LongMdcEntryWriter.java
+++ b/src/main/java/net/logstash/logback/composite/loggingevent/mdc/LongMdcEntryWriter.java
@@ -15,9 +15,7 @@
*/
package net.logstash.logback.composite.loggingevent.mdc;
-import java.io.IOException;
-
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
/**
* Writes long values (instead of String values) for any MDC values that can be parsed as a long (radix 10).
@@ -25,12 +23,11 @@
public class LongMdcEntryWriter implements MdcEntryWriter {
@Override
- public boolean writeMdcEntry(JsonGenerator generator, String fieldName, String mdcKey, String mdcValue) throws IOException {
+ public boolean writeMdcEntry(JsonGenerator generator, String fieldName, String mdcKey, String mdcValue) {
if (shouldParse(mdcValue)) {
try {
long parsedValue = Long.parseLong(mdcValue);
- generator.writeFieldName(fieldName);
- generator.writeNumber(parsedValue);
+ generator.writeNumberProperty(fieldName, parsedValue);
return true;
} catch (NumberFormatException ignore) {
}
diff --git a/src/main/java/net/logstash/logback/composite/loggingevent/mdc/MdcEntryWriter.java b/src/main/java/net/logstash/logback/composite/loggingevent/mdc/MdcEntryWriter.java
index 91b074c0..581c3535 100644
--- a/src/main/java/net/logstash/logback/composite/loggingevent/mdc/MdcEntryWriter.java
+++ b/src/main/java/net/logstash/logback/composite/loggingevent/mdc/MdcEntryWriter.java
@@ -15,9 +15,7 @@
*/
package net.logstash.logback.composite.loggingevent.mdc;
-import java.io.IOException;
-
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
/**
* Writes an entry from the {@link org.slf4j.MDC} to the {@link JsonGenerator}.
@@ -35,6 +33,6 @@ public interface MdcEntryWriter {
* @param mdcValue the value of the MDC map entry.
* @return true if this {@link MdcEntryWriter} handled the output of the entry, otherwise return false.
*/
- boolean writeMdcEntry(JsonGenerator generator, String fieldName, String mdcKey, String mdcValue) throws IOException;
+ boolean writeMdcEntry(JsonGenerator generator, String fieldName, String mdcKey, String mdcValue);
}
diff --git a/src/main/java/net/logstash/logback/composite/loggingevent/mdc/RegexFilteringMdcEntryWriter.java b/src/main/java/net/logstash/logback/composite/loggingevent/mdc/RegexFilteringMdcEntryWriter.java
index e6038915..636e6799 100644
--- a/src/main/java/net/logstash/logback/composite/loggingevent/mdc/RegexFilteringMdcEntryWriter.java
+++ b/src/main/java/net/logstash/logback/composite/loggingevent/mdc/RegexFilteringMdcEntryWriter.java
@@ -15,13 +15,12 @@
*/
package net.logstash.logback.composite.loggingevent.mdc;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.regex.Pattern;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
/**
* Writes MDC entries by delegating to other instances of {@link MdcEntryWriter} if MDC key matches the given include
@@ -41,7 +40,7 @@ public class RegexFilteringMdcEntryWriter implements MdcEntryWriter {
private final List mdcEntryWriters = new ArrayList<>();
@Override
- public boolean writeMdcEntry(JsonGenerator generator, String fieldName, String mdcKey, String mdcValue) throws IOException {
+ public boolean writeMdcEntry(JsonGenerator generator, String fieldName, String mdcKey, String mdcValue) {
if (shouldWrite(mdcKey)) {
for (MdcEntryWriter mdcEntryWriter : this.mdcEntryWriters) {
if (mdcEntryWriter.writeMdcEntry(generator, fieldName, mdcKey, mdcValue)) {
diff --git a/src/main/java/net/logstash/logback/dataformat/DataFormatFactory.java b/src/main/java/net/logstash/logback/dataformat/DataFormatFactory.java
new file mode 100644
index 00000000..84e40661
--- /dev/null
+++ b/src/main/java/net/logstash/logback/dataformat/DataFormatFactory.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2013-2025 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.logstash.logback.dataformat;
+
+import tools.jackson.core.TSFBuilder;
+import tools.jackson.core.TokenStreamFactory;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.cfg.MapperBuilder;
+
+/**
+ * Factory for creating builders for a jackson data format.
+ *
+ * @param Type of TokenStreamFactory
+ * @param Type of TokenStreamFactory.TSFBuilder (that builds the TokenStreamFactory)
+ * @param Type of ObjectMapper
+ * @param Type of MapperBuilder (that builds the ObjectMapper)
+ */
+public interface DataFormatFactory<
+ F extends TokenStreamFactory,
+ FB extends TSFBuilder,
+ M extends ObjectMapper,
+ MB extends MapperBuilder> {
+
+ String JSON = "json";
+ String YAML = "yaml";
+ String SMILE = "smile";
+ String CBOR = "cbor";
+
+ /**
+ * Returns the name of the data format.
+ * @return the name of the data format.
+ */
+ String getName();
+
+ /**
+ * Creates and returns a new {@link TokenStreamFactory} for this data format.
+ *
+ * @return a new {@link TokenStreamFactory} for this data format.
+ */
+ FB createTokenStreamFactoryBuilder();
+
+ /**
+ * Creates and returns a new {@link MapperBuilder} for this data format backed by the given factory.
+ *
+ * @param factory the factory constructed from the builder returned by {@link #createTokenStreamFactoryBuilder()} (perhaps decorated with other configuration)
+ * @return a new {@link MapperBuilder} for this data format backed by the given factory.
+ */
+ MB createMapperBuilder(F factory);
+}
diff --git a/src/main/java/net/logstash/logback/dataformat/cbor/CborDataFormatFactory.java b/src/main/java/net/logstash/logback/dataformat/cbor/CborDataFormatFactory.java
new file mode 100644
index 00000000..6f56c30b
--- /dev/null
+++ b/src/main/java/net/logstash/logback/dataformat/cbor/CborDataFormatFactory.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2013-2025 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.logstash.logback.dataformat.cbor;
+
+import net.logstash.logback.dataformat.DataFormatFactory;
+import net.logstash.logback.decorate.TokenStreamFactoryFeatureDecorator;
+import net.logstash.logback.decorate.cbor.CborWriteFeatureDecorator;
+
+import tools.jackson.core.StreamWriteFeature;
+import tools.jackson.core.TokenStreamFactory;
+import tools.jackson.dataformat.cbor.CBORFactory;
+import tools.jackson.dataformat.cbor.CBORFactoryBuilder;
+import tools.jackson.dataformat.cbor.CBORMapper;
+import tools.jackson.dataformat.cbor.CBORWriteFeature;
+
+/**
+ * A {@link DataFormatFactory} for the CBOR data format.
+ *
+ *
See also {@link CborWriteFeatureDecorator} for configuring {@link CBORWriteFeature}s,
+ * and {@link TokenStreamFactoryFeatureDecorator} for configuring {@link TokenStreamFactory.Feature}s
+ */
+public class CborDataFormatFactory implements DataFormatFactory {
+
+ @Override
+ public String getName() {
+ return CBOR;
+ }
+
+ @Override
+ public CBORFactoryBuilder createTokenStreamFactoryBuilder() {
+ return CBORFactory.builder()
+ /*
+ * When CBORGenerator is flushed, flush the internal buffer to the underlying outputStream,
+ * but don't flush the underlying outputStream.
+ *
+ * This allows some streaming optimizations when using an encoder.
+ *
+ * The encoder generally determines when the stream should be flushed
+ * by an 'immediateFlush' property.
+ *
+ * The 'immediateFlush' property of the encoder can be set to false
+ * when the appender performs the flushes at appropriate times
+ * (such as the end of a batch in the AbstractLogstashTcpSocketAppender).
+ */
+ .disable(StreamWriteFeature.FLUSH_PASSED_TO_STREAM);
+ }
+
+ @Override
+ public CBORMapper.Builder createMapperBuilder(CBORFactory factory) {
+ return CBORMapper.builder(factory);
+ }
+}
diff --git a/src/main/java/net/logstash/logback/dataformat/json/JsonDataFormatFactory.java b/src/main/java/net/logstash/logback/dataformat/json/JsonDataFormatFactory.java
new file mode 100644
index 00000000..b5d8ed48
--- /dev/null
+++ b/src/main/java/net/logstash/logback/dataformat/json/JsonDataFormatFactory.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2013-2025 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.logstash.logback.dataformat.json;
+
+import net.logstash.logback.dataformat.DataFormatFactory;
+import net.logstash.logback.decorate.TokenStreamFactoryFeatureDecorator;
+import net.logstash.logback.decorate.json.JsonWriteFeatureDecorator;
+
+import ch.qos.logback.core.CoreConstants;
+import tools.jackson.core.StreamWriteFeature;
+import tools.jackson.core.TokenStreamFactory;
+import tools.jackson.core.io.SerializedString;
+import tools.jackson.core.json.JsonFactory;
+import tools.jackson.core.json.JsonFactoryBuilder;
+import tools.jackson.core.json.JsonWriteFeature;
+import tools.jackson.databind.json.JsonMapper;
+
+/**
+ * A {@link DataFormatFactory} for the JSON data format.
+ *
+ *
See also {@link JsonWriteFeatureDecorator} for configuring {@link JsonWriteFeature}s,
+ * and {@link TokenStreamFactoryFeatureDecorator} for configuring {@link TokenStreamFactory.Feature}s
+ */
+public class JsonDataFormatFactory implements DataFormatFactory {
+
+ @Override
+ public String getName() {
+ return JSON;
+ }
+
+ @Override
+ public JsonFactoryBuilder createTokenStreamFactoryBuilder() {
+ return JsonFactory.builder()
+ /*
+ * When JsonGenerator is flushed, flush the internal buffer to the underlying outputStream,
+ * but don't flush the underlying outputStream.
+ *
+ * This allows some streaming optimizations when using an encoder.
+ *
+ * The encoder generally determines when the stream should be flushed
+ * by an 'immediateFlush' property.
+ *
+ * The 'immediateFlush' property of the encoder can be set to false
+ * when the appender performs the flushes at appropriate times
+ * (such as the end of a batch in the AbstractLogstashTcpSocketAppender).
+ */
+ .disable(StreamWriteFeature.FLUSH_PASSED_TO_STREAM)
+ /*
+ * JsonGenerator are reused to serialize multiple log events.
+ * Change the default root value separator to an empty string instead of a single space.
+ */
+ .rootValueSeparator(new SerializedString(CoreConstants.EMPTY_STRING));
+ }
+
+ @Override
+ public JsonMapper.Builder createMapperBuilder(JsonFactory factory) {
+ return JsonMapper.builder(factory);
+ }
+}
diff --git a/src/main/java/net/logstash/logback/dataformat/smile/SmileDataFormatFactory.java b/src/main/java/net/logstash/logback/dataformat/smile/SmileDataFormatFactory.java
new file mode 100644
index 00000000..d1f48158
--- /dev/null
+++ b/src/main/java/net/logstash/logback/dataformat/smile/SmileDataFormatFactory.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2013-2025 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.logstash.logback.dataformat.smile;
+
+import net.logstash.logback.dataformat.DataFormatFactory;
+import net.logstash.logback.decorate.TokenStreamFactoryFeatureDecorator;
+import net.logstash.logback.decorate.smile.SmileWriteFeatureDecorator;
+
+import tools.jackson.core.StreamWriteFeature;
+import tools.jackson.core.TokenStreamFactory;
+import tools.jackson.dataformat.smile.SmileFactory;
+import tools.jackson.dataformat.smile.SmileFactoryBuilder;
+import tools.jackson.dataformat.smile.SmileMapper;
+import tools.jackson.dataformat.smile.SmileWriteFeature;
+
+/**
+ * A {@link DataFormatFactory} for the Smile data format.
+ *
+ *
See also {@link SmileWriteFeatureDecorator} for configuring {@link SmileWriteFeature} features
+ * and {@link TokenStreamFactoryFeatureDecorator} for configuring {@link TokenStreamFactory.Feature}s
+ */
+public class SmileDataFormatFactory implements DataFormatFactory {
+
+ @Override
+ public String getName() {
+ return SMILE;
+ }
+
+ @Override
+ public SmileFactoryBuilder createTokenStreamFactoryBuilder() {
+ return SmileFactory.builder()
+ /*
+ * When SmileGenerator is flushed, flush the internal buffer to the underlying outputStream,
+ * but don't flush the underlying outputStream.
+ *
+ * This allows some streaming optimizations when using an encoder.
+ *
+ * The encoder generally determines when the stream should be flushed
+ * by an 'immediateFlush' property.
+ *
+ * The 'immediateFlush' property of the encoder can be set to false
+ * when the appender performs the flushes at appropriate times
+ * (such as the end of a batch in the AbstractLogstashTcpSocketAppender).
+ */
+ .disable(StreamWriteFeature.FLUSH_PASSED_TO_STREAM);
+ }
+
+ @Override
+ public SmileMapper.Builder createMapperBuilder(SmileFactory factory) {
+ return SmileMapper.builder(factory);
+ }
+}
diff --git a/src/main/java/net/logstash/logback/dataformat/yaml/YamlDataFormatFactory.java b/src/main/java/net/logstash/logback/dataformat/yaml/YamlDataFormatFactory.java
new file mode 100644
index 00000000..aec55086
--- /dev/null
+++ b/src/main/java/net/logstash/logback/dataformat/yaml/YamlDataFormatFactory.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2013-2025 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.logstash.logback.dataformat.yaml;
+
+import net.logstash.logback.dataformat.DataFormatFactory;
+import net.logstash.logback.decorate.TokenStreamFactoryFeatureDecorator;
+import net.logstash.logback.decorate.yaml.YamlWriteFeatureDecorator;
+
+import tools.jackson.core.StreamWriteFeature;
+import tools.jackson.core.TokenStreamFactory;
+import tools.jackson.dataformat.yaml.YAMLFactory;
+import tools.jackson.dataformat.yaml.YAMLFactoryBuilder;
+import tools.jackson.dataformat.yaml.YAMLGenerator;
+import tools.jackson.dataformat.yaml.YAMLMapper;
+
+/**
+ * A {@link DataFormatFactory} for the YAML data format.
+ *
+ *
See also {@link YamlWriteFeatureDecorator} for configuring {@link YAMLGenerator} features
+ * and {@link TokenStreamFactoryFeatureDecorator} for configuring {@link TokenStreamFactory.Feature}s
+ */
+public class YamlDataFormatFactory implements DataFormatFactory {
+
+ @Override
+ public String getName() {
+ return YAML;
+ }
+
+ @Override
+ public YAMLFactoryBuilder createTokenStreamFactoryBuilder() {
+ return YAMLFactory.builder()
+ /*
+ * YAMLGenerator needs to pass the flush to the stream.
+ * It doesn't maintain an internal buffer like the other generators.
+ * To see this, look at the .flush() implementations of each of the generator classes.
+ */
+ .enable(StreamWriteFeature.FLUSH_PASSED_TO_STREAM);
+ }
+
+ @Override
+ public YAMLMapper.Builder createMapperBuilder(YAMLFactory factory) {
+ return YAMLMapper.builder(factory);
+ }
+}
diff --git a/src/main/java/net/logstash/logback/decorate/CompositeJsonFactoryDecorator.java b/src/main/java/net/logstash/logback/decorate/CompositeDecorator.java
similarity index 58%
rename from src/main/java/net/logstash/logback/decorate/CompositeJsonFactoryDecorator.java
rename to src/main/java/net/logstash/logback/decorate/CompositeDecorator.java
index ce13dd9b..081848ab 100644
--- a/src/main/java/net/logstash/logback/decorate/CompositeJsonFactoryDecorator.java
+++ b/src/main/java/net/logstash/logback/decorate/CompositeDecorator.java
@@ -15,32 +15,29 @@
*/
package net.logstash.logback.decorate;
-import java.util.ArrayList;
import java.util.List;
-
-import com.fasterxml.jackson.core.JsonFactory;
+import java.util.concurrent.CopyOnWriteArrayList;
/**
* Combines a list of decorators into a single decorator, so multiple decorators can be used together.
*/
-public class CompositeJsonFactoryDecorator implements JsonFactoryDecorator {
+public class CompositeDecorator> implements Decorator {
- private final List decorators = new ArrayList<>();
+ private final List decorators = new CopyOnWriteArrayList<>();
- @Override
- public JsonFactory decorate(JsonFactory factory) {
- JsonFactory decoratedFactory = factory;
- for (JsonFactoryDecorator decorator : decorators) {
- decoratedFactory = decorator.decorate(decoratedFactory);
+ public T decorate(T decoratable) {
+ T decorated = decoratable;
+ for (Decorator decorator : decorators) {
+ decorated = decorator.decorate(decorated);
}
- return decoratedFactory;
+ return decorated;
}
-
- public void addDecorator(JsonFactoryDecorator decorator) {
+
+ public void addDecorator(D decorator) {
decorators.add(decorator);
}
- public boolean removeDecorator(JsonFactoryDecorator decorator) {
+ public boolean removeDecorator(D decorator) {
return decorators.remove(decorator);
}
diff --git a/src/main/java/net/logstash/logback/decorate/CompositeJsonGeneratorDecorator.java b/src/main/java/net/logstash/logback/decorate/CompositeJsonGeneratorDecorator.java
index 92c5de8c..38b20bb9 100644
--- a/src/main/java/net/logstash/logback/decorate/CompositeJsonGeneratorDecorator.java
+++ b/src/main/java/net/logstash/logback/decorate/CompositeJsonGeneratorDecorator.java
@@ -15,33 +15,12 @@
*/
package net.logstash.logback.decorate;
-import java.util.ArrayList;
-import java.util.List;
-
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
/**
* Combines a list of decorators into a single decorator, so multiple decorators can be used together.
*/
-public class CompositeJsonGeneratorDecorator implements JsonGeneratorDecorator {
-
- private final List decorators = new ArrayList<>();
-
- @Override
- public JsonGenerator decorate(JsonGenerator generator) {
- JsonGenerator decoratedGenerator = generator;
- for (JsonGeneratorDecorator decorator : decorators) {
- decoratedGenerator = decorator.decorate(decoratedGenerator);
- }
- return decoratedGenerator;
- }
-
- public void addDecorator(JsonGeneratorDecorator decorator) {
- decorators.add(decorator);
- }
-
- public boolean removeDecorator(JsonGeneratorDecorator decorator) {
- return decorators.remove(decorator);
- }
-
+public class CompositeJsonGeneratorDecorator
+ extends CompositeDecorator
+ implements JsonGeneratorDecorator {
}
diff --git a/src/main/java/net/logstash/logback/decorate/NullJsonGeneratorDecorator.java b/src/main/java/net/logstash/logback/decorate/CompositeMapperBuilderDecorator.java
similarity index 61%
rename from src/main/java/net/logstash/logback/decorate/NullJsonGeneratorDecorator.java
rename to src/main/java/net/logstash/logback/decorate/CompositeMapperBuilderDecorator.java
index 7c3a5a04..3cce8777 100644
--- a/src/main/java/net/logstash/logback/decorate/NullJsonGeneratorDecorator.java
+++ b/src/main/java/net/logstash/logback/decorate/CompositeMapperBuilderDecorator.java
@@ -15,17 +15,13 @@
*/
package net.logstash.logback.decorate;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.cfg.MapperBuilder;
/**
- * A {@link JsonGeneratorDecorator} that doesn't do any decoration.
- * It just returns the generator as-is.
+ * Combines a list of decorators into a single decorator, so multiple decorators can be used together.
*/
-public class NullJsonGeneratorDecorator implements JsonGeneratorDecorator {
-
- @Override
- public JsonGenerator decorate(JsonGenerator generator) {
- return generator;
- }
-
+public class CompositeMapperBuilderDecorator>
+ extends CompositeDecorator>
+ implements MapperBuilderDecorator {
}
diff --git a/src/main/java/net/logstash/logback/decorate/FeatureJsonGeneratorDecorator.java b/src/main/java/net/logstash/logback/decorate/CompositeTokenStreamFactoryBuilderDecorator.java
similarity index 60%
rename from src/main/java/net/logstash/logback/decorate/FeatureJsonGeneratorDecorator.java
rename to src/main/java/net/logstash/logback/decorate/CompositeTokenStreamFactoryBuilderDecorator.java
index 0f7957f9..8f70286a 100644
--- a/src/main/java/net/logstash/logback/decorate/FeatureJsonGeneratorDecorator.java
+++ b/src/main/java/net/logstash/logback/decorate/CompositeTokenStreamFactoryBuilderDecorator.java
@@ -15,14 +15,13 @@
*/
package net.logstash.logback.decorate;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.TSFBuilder;
+import tools.jackson.core.TokenStreamFactory;
/**
- * A {@link JsonGeneratorDecorator} that allows enabling/disabling of {@link JsonGenerator} features.
+ * Combines a list of decorators into a single decorator, so multiple decorators can be used together.
*/
-public class FeatureJsonGeneratorDecorator extends FeatureDecorator implements JsonGeneratorDecorator {
-
- public FeatureJsonGeneratorDecorator() {
- super(JsonGenerator.Feature.class, JsonGenerator::enable, JsonGenerator::disable);
- }
+public class CompositeTokenStreamFactoryBuilderDecorator>
+ extends CompositeDecorator>
+ implements TokenStreamFactoryBuilderDecorator {
}
diff --git a/src/main/java/net/logstash/logback/decorate/DateTimeFeatureDecorator.java b/src/main/java/net/logstash/logback/decorate/DateTimeFeatureDecorator.java
new file mode 100644
index 00000000..ae77bc98
--- /dev/null
+++ b/src/main/java/net/logstash/logback/decorate/DateTimeFeatureDecorator.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2013-2025 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.logstash.logback.decorate;
+
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.cfg.DateTimeFeature;
+import tools.jackson.databind.cfg.MapperBuilder;
+
+/**
+ * A {@link MapperBuilderDecorator} that allows enabling/disabling of {@link DateTimeFeature} features.
+ */
+public class DateTimeFeatureDecorator>
+ extends FeatureDecorator
+ implements MapperBuilderDecorator {
+
+ public DateTimeFeatureDecorator() {
+ super(DateTimeFeature.class);
+ }
+
+ @Override
+ protected B configure(B builder, DateTimeFeature feature, boolean state) {
+ return builder.configure(feature, state);
+ }
+}
diff --git a/src/main/java/net/logstash/logback/decorate/NullJsonFactoryDecorator.java b/src/main/java/net/logstash/logback/decorate/Decorator.java
similarity index 65%
rename from src/main/java/net/logstash/logback/decorate/NullJsonFactoryDecorator.java
rename to src/main/java/net/logstash/logback/decorate/Decorator.java
index 989b6a21..2415d23c 100644
--- a/src/main/java/net/logstash/logback/decorate/NullJsonFactoryDecorator.java
+++ b/src/main/java/net/logstash/logback/decorate/Decorator.java
@@ -15,17 +15,18 @@
*/
package net.logstash.logback.decorate;
-import com.fasterxml.jackson.core.JsonFactory;
-
/**
- * A {@link JsonFactoryDecorator} that doesn't do any decoration.
- * It just returns the factory as-is.
+ * Decorates an object.
+ *
+ * @param the type of object to decorate
*/
-public class NullJsonFactoryDecorator implements JsonFactoryDecorator {
-
- @Override
- public JsonFactory decorate(JsonFactory factory) {
- return factory;
- }
+public interface Decorator {
+ /**
+ * Decorates the given {@code decoratable}.
+ *
+ * @param decoratable the object to decorate
+ * @return the decorated object (can be a different from the object passed in as an arg)
+ */
+ T decorate(T decoratable);
}
diff --git a/src/main/java/net/logstash/logback/decorate/EscapeNonAsciiJsonFactoryDecorator.java b/src/main/java/net/logstash/logback/decorate/EnumFeatureDecorator.java
similarity index 52%
rename from src/main/java/net/logstash/logback/decorate/EscapeNonAsciiJsonFactoryDecorator.java
rename to src/main/java/net/logstash/logback/decorate/EnumFeatureDecorator.java
index 2e8c55b9..e7ec8410 100644
--- a/src/main/java/net/logstash/logback/decorate/EscapeNonAsciiJsonFactoryDecorator.java
+++ b/src/main/java/net/logstash/logback/decorate/EnumFeatureDecorator.java
@@ -15,20 +15,23 @@
*/
package net.logstash.logback.decorate;
-import com.fasterxml.jackson.core.JsonFactory;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.cfg.EnumFeature;
+import tools.jackson.databind.cfg.MapperBuilder;
/**
- * Enables the {@link com.fasterxml.jackson.core.JsonGenerator.Feature#ESCAPE_NON_ASCII} feature on the {@link JsonFactory}.
- *
- * Prior to 5.0, {@link com.fasterxml.jackson.core.JsonGenerator.Feature#ESCAPE_NON_ASCII} was enabled by default.
- * In 5.0, the feature is disabled by default, and can be re-enabled with this decorator.
+ * A {@link MapperBuilderDecorator} that allows enabling/disabling of {@link EnumFeature} features.
*/
-public class EscapeNonAsciiJsonFactoryDecorator implements JsonFactoryDecorator {
+public class EnumFeatureDecorator>
+ extends FeatureDecorator
+ implements MapperBuilderDecorator {
- @Override
- public JsonFactory decorate(JsonFactory factory) {
- return factory.enable(JsonGenerator.Feature.ESCAPE_NON_ASCII);
+ public EnumFeatureDecorator() {
+ super(EnumFeature.class);
}
+ @Override
+ protected B configure(B builder, EnumFeature feature, boolean state) {
+ return builder.configure(feature, state);
+ }
}
diff --git a/src/main/java/net/logstash/logback/decorate/FeatureDecorator.java b/src/main/java/net/logstash/logback/decorate/FeatureDecorator.java
index 148c9730..ec3cb0bd 100644
--- a/src/main/java/net/logstash/logback/decorate/FeatureDecorator.java
+++ b/src/main/java/net/logstash/logback/decorate/FeatureDecorator.java
@@ -17,60 +17,55 @@
import java.util.ArrayList;
import java.util.List;
-import java.util.function.BiFunction;
-
-import com.fasterxml.jackson.core.JsonFactory;
/**
- * A generic decorator that allows enabling/disabling of Jackson features.
+ * A generic decorator that allows enabling/disabling of Jackson features by feature name.
*
- * @param Type of object being decorated (e.g. {@link JsonFactory})
- * @param Feature enum type (e.g. {@link com.fasterxml.jackson.core.JsonFactory.Feature})
+ * @param Type of object being decorated (e.g. {@link tools.jackson.core.json.JsonFactory})
+ * @param Feature enum type (e.g. {@link tools.jackson.core.json.JsonWriteFeature})
*/
-public class FeatureDecorator> {
+public abstract class FeatureDecorator> implements Decorator {
/**
- * Jackson feature enum type (e.g. {@link JsonFactory.Feature})
+ * Jackson feature enum type (e.g. {@link tools.jackson.core.json.JsonWriteFeature})
*/
private final Class enumType;
- /**
- * Function to enable a feature.
- */
- private final BiFunction enableFunction;
- /**
- * Function to disable a feature.
- */
- private final BiFunction disableFunction;
/**
* Features to enable
*/
private final List enables = new ArrayList<>();
+
/**
* Features to disable
*/
private final List disables = new ArrayList<>();
- protected FeatureDecorator(
- Class enumType,
- BiFunction enableFunction,
- BiFunction disableFunction) {
+ protected FeatureDecorator(Class enumType) {
this.enumType = enumType;
- this.enableFunction = enableFunction;
- this.disableFunction = disableFunction;
}
- public T decorate(T target) {
- T modifiedTarget = target;
+ public T decorate(T decoratable) {
+ T decorated = decoratable;
for (F feature : enables) {
- modifiedTarget = enableFunction.apply(modifiedTarget, feature);
+ decorated = configure(decorated, feature, true);
}
for (F feature : disables) {
- modifiedTarget = disableFunction.apply(modifiedTarget, feature);
+ decorated = configure(decorated, feature, false);
}
- return modifiedTarget;
+ return decorated;
}
+ /**
+ * Configures the given feature on the given decoratable.
+ *
+ * @param decoratable the object to configure
+ * @param feature the feature to enable or disable
+ * @param state true to enable the feature, false to disable the feature.
+ * @return the decorated object
+ */
+ protected abstract T configure(T decoratable, F feature, boolean state);
+
/**
* Enables the feature with the given name.
* Reflectively called by logback when reading xml configuration.
@@ -88,6 +83,7 @@ public void addEnable(String feature) {
public void enable(F feature) {
enables.add(feature);
}
+
/**
* Disables the feature with the given name.
* Reflectively called by logback when reading xml configuration.
@@ -96,6 +92,7 @@ public void enable(F feature) {
public void addDisable(String feature) {
disable(Enum.valueOf(enumType, feature));
}
+
/**
* Disables the given feature.
* Use this method for programmatic configuration.
diff --git a/src/main/java/net/logstash/logback/decorate/JsonGeneratorDecorator.java b/src/main/java/net/logstash/logback/decorate/JsonGeneratorDecorator.java
index b19c11a7..888a4601 100644
--- a/src/main/java/net/logstash/logback/decorate/JsonGeneratorDecorator.java
+++ b/src/main/java/net/logstash/logback/decorate/JsonGeneratorDecorator.java
@@ -15,23 +15,12 @@
*/
package net.logstash.logback.decorate;
-import com.fasterxml.jackson.core.JsonGenerator;
+import tools.jackson.core.JsonGenerator;
/**
* Decorates the {@link JsonGenerator} used for serializing json.
*
* Allows you to customize the {@link JsonGenerator}.
*/
-public interface JsonGeneratorDecorator {
-
- /**
- * Decorates the given generator, and returns the decorated generator.
- *
- *
The returned decorator does not need to be the same object as the given generator.
- *
- * @param generator the generator to decorate
- * @return the decorated generator
- */
- JsonGenerator decorate(JsonGenerator generator);
-
+public interface JsonGeneratorDecorator extends Decorator {
}
diff --git a/src/main/java/net/logstash/logback/decorate/JsonNodeFeatureDecorator.java b/src/main/java/net/logstash/logback/decorate/JsonNodeFeatureDecorator.java
new file mode 100644
index 00000000..dc7a6121
--- /dev/null
+++ b/src/main/java/net/logstash/logback/decorate/JsonNodeFeatureDecorator.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2013-2025 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.logstash.logback.decorate;
+
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.cfg.JsonNodeFeature;
+import tools.jackson.databind.cfg.MapperBuilder;
+
+/**
+ * A {@link MapperBuilderDecorator} that allows enabling/disabling of {@link JsonNodeFeature} features.
+ */
+public class JsonNodeFeatureDecorator>
+ extends FeatureDecorator
+ implements MapperBuilderDecorator {
+
+ public JsonNodeFeatureDecorator() {
+ super(JsonNodeFeature.class);
+ }
+
+ @Override
+ protected B configure(B builder, JsonNodeFeature feature, boolean state) {
+ return builder.configure(feature, state);
+ }
+}
diff --git a/src/main/java/net/logstash/logback/decorate/MapperBuilderDecorator.java b/src/main/java/net/logstash/logback/decorate/MapperBuilderDecorator.java
new file mode 100644
index 00000000..15f1a5ee
--- /dev/null
+++ b/src/main/java/net/logstash/logback/decorate/MapperBuilderDecorator.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2013-2025 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.logstash.logback.decorate;
+
+import net.logstash.logback.composite.AbstractCompositeJsonFormatter;
+
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.cfg.MapperBuilder;
+
+/**
+ * Decorates the {@link MapperBuilder} used by a
+ * {@link AbstractCompositeJsonFormatter} to create an {@link ObjectMapper}.
+ *
+ * This allows you to customize the mapper used by the formatters.
+ *
+ * Implementations must be idempotent.
+ * The decorator configured on a formatter is called each time a formatter is started,
+ * and there is no way to 'un-decorate' the mapper when the formatter is stopped.
+ * So, the mapper could be decorated multiple times if the formatter is restarted.
+ */
+public interface MapperBuilderDecorator> extends Decorator {
+
+}
diff --git a/src/main/java/net/logstash/logback/decorate/FeatureJsonFactoryDecorator.java b/src/main/java/net/logstash/logback/decorate/MapperFeatureDecorator.java
similarity index 50%
rename from src/main/java/net/logstash/logback/decorate/FeatureJsonFactoryDecorator.java
rename to src/main/java/net/logstash/logback/decorate/MapperFeatureDecorator.java
index db85bbf6..693a5992 100644
--- a/src/main/java/net/logstash/logback/decorate/FeatureJsonFactoryDecorator.java
+++ b/src/main/java/net/logstash/logback/decorate/MapperFeatureDecorator.java
@@ -15,14 +15,23 @@
*/
package net.logstash.logback.decorate;
-import com.fasterxml.jackson.core.JsonFactory;
+import tools.jackson.databind.MapperFeature;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.cfg.MapperBuilder;
/**
- * A {@link JsonFactoryDecorator} that allows enabling/disabling of {@link JsonFactory} features.
+ * A {@link MapperBuilderDecorator} that allows enabling/disabling of {@link MapperFeature} features.
*/
-public class FeatureJsonFactoryDecorator extends FeatureDecorator implements JsonFactoryDecorator {
+public class MapperFeatureDecorator>
+ extends FeatureDecorator
+ implements MapperBuilderDecorator {
- public FeatureJsonFactoryDecorator() {
- super(JsonFactory.Feature.class, JsonFactory::enable, JsonFactory::disable);
+ public MapperFeatureDecorator() {
+ super(MapperFeature.class);
+ }
+
+ @Override
+ protected B configure(B builder, MapperFeature feature, boolean state) {
+ return builder.configure(feature, state);
}
}
diff --git a/src/main/java/net/logstash/logback/decorate/PrettyPrintingJsonGeneratorDecorator.java b/src/main/java/net/logstash/logback/decorate/PrettyPrintingDecorator.java
similarity index 56%
rename from src/main/java/net/logstash/logback/decorate/PrettyPrintingJsonGeneratorDecorator.java
rename to src/main/java/net/logstash/logback/decorate/PrettyPrintingDecorator.java
index 7b9a63ab..8fe431ff 100644
--- a/src/main/java/net/logstash/logback/decorate/PrettyPrintingJsonGeneratorDecorator.java
+++ b/src/main/java/net/logstash/logback/decorate/PrettyPrintingDecorator.java
@@ -16,20 +16,28 @@
package net.logstash.logback.decorate;
import ch.qos.logback.core.CoreConstants;
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.core.util.DefaultPrettyPrinter;
+import tools.jackson.core.PrettyPrinter;
+import tools.jackson.core.util.DefaultPrettyPrinter;
+import tools.jackson.core.util.Separators;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.SerializationFeature;
+import tools.jackson.databind.cfg.MapperBuilder;
/**
- * Enables pretty printing on the {@link JsonGenerator}
+ * Enables pretty printing on a {@link MapperBuilder}.
*/
-public class PrettyPrintingJsonGeneratorDecorator implements JsonGeneratorDecorator {
+public class PrettyPrintingDecorator> implements MapperBuilderDecorator {
- private DefaultPrettyPrinter prettyPrinter = new DefaultPrettyPrinter()
+ private Separators separators = PrettyPrinter.DEFAULT_SEPARATORS
.withRootSeparator(CoreConstants.EMPTY_STRING);
+ private DefaultPrettyPrinter prettyPrinter = new DefaultPrettyPrinter(separators);
+
@Override
- public JsonGenerator decorate(JsonGenerator generator) {
- return generator.setPrettyPrinter(prettyPrinter);
+ public B decorate(B mapperBuilder) {
+ return mapperBuilder
+ .enable(SerializationFeature.INDENT_OUTPUT)
+ .defaultPrettyPrinter(prettyPrinter);
}
/**
@@ -41,25 +49,21 @@ public JsonGenerator decorate(JsonGenerator generator) {
* {@code [SPACE]} in the xml configuration.
*
* @param rootSeparator the new root separator
- * @see DefaultPrettyPrinter#withRootSeparator(String)
+ * @see Separators#withRootSeparator(String)
*/
public void setRootSeparator(String rootSeparator) {
- prettyPrinter = prettyPrinter.withRootSeparator(
- rootSeparator == null ? null : rootSeparator.replace("[SPACE]", " "));
+ separators = separators.withRootSeparator(rootSeparator == null ? null : rootSeparator.replace("[SPACE]", " "));
+ prettyPrinter = prettyPrinter.withSeparators(separators);
}
/**
* Sets whether spaces appear in object entries.
*
* @param spacesInObjectEntries whether spaces appear in object entries.
- * @see DefaultPrettyPrinter#withSpacesInObjectEntries()
- * @see DefaultPrettyPrinter#withoutSpacesInObjectEntries()
+ * @see Separators#withObjectEntrySpacing(Separators.Spacing)
*/
public void setSpacesInObjectEntries(boolean spacesInObjectEntries) {
- if (spacesInObjectEntries) {
- prettyPrinter = prettyPrinter.withSpacesInObjectEntries();
- } else {
- prettyPrinter = prettyPrinter.withoutSpacesInObjectEntries();
- }
+ separators = separators.withObjectNameValueSpacing(spacesInObjectEntries ? Separators.Spacing.BOTH : Separators.Spacing.NONE);
+ prettyPrinter = prettyPrinter.withSeparators(separators);
}
}
diff --git a/src/main/java/net/logstash/logback/decorate/SerializationFeatureDecorator.java b/src/main/java/net/logstash/logback/decorate/SerializationFeatureDecorator.java
new file mode 100644
index 00000000..1c43ff68
--- /dev/null
+++ b/src/main/java/net/logstash/logback/decorate/SerializationFeatureDecorator.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2013-2025 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.logstash.logback.decorate;
+
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.SerializationFeature;
+import tools.jackson.databind.cfg.MapperBuilder;
+
+/**
+ * A {@link MapperBuilderDecorator} that allows enabling/disabling of {@link SerializationFeature} features.
+ */
+public class SerializationFeatureDecorator>
+ extends FeatureDecorator
+ implements MapperBuilderDecorator {
+
+ public SerializationFeatureDecorator() {
+ super(SerializationFeature.class);
+ }
+
+ @Override
+ protected B configure(B builder, SerializationFeature feature, boolean state) {
+ return builder.configure(feature, state);
+ }
+}
diff --git a/src/main/java/net/logstash/logback/decorate/StreamWriteFeatureDecorator.java b/src/main/java/net/logstash/logback/decorate/StreamWriteFeatureDecorator.java
new file mode 100644
index 00000000..39b3815d
--- /dev/null
+++ b/src/main/java/net/logstash/logback/decorate/StreamWriteFeatureDecorator.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2013-2025 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.logstash.logback.decorate;
+
+import tools.jackson.core.StreamWriteFeature;
+import tools.jackson.core.TSFBuilder;
+import tools.jackson.core.TokenStreamFactory;
+
+/**
+ * A {@link TokenStreamFactoryBuilderDecorator} that allows enabling/disabling of {@link StreamWriteFeature} features.
+ */
+public class StreamWriteFeatureDecorator>
+ extends FeatureDecorator
+ implements TokenStreamFactoryBuilderDecorator {
+
+ public StreamWriteFeatureDecorator() {
+ super(StreamWriteFeature.class);
+ }
+
+ @Override
+ protected B configure(B builder, StreamWriteFeature feature, boolean state) {
+ return builder.configure(feature, state);
+ }
+}
diff --git a/src/main/java/net/logstash/logback/decorate/JsonFactoryDecorator.java b/src/main/java/net/logstash/logback/decorate/TokenStreamFactoryBuilderDecorator.java
similarity index 56%
rename from src/main/java/net/logstash/logback/decorate/JsonFactoryDecorator.java
rename to src/main/java/net/logstash/logback/decorate/TokenStreamFactoryBuilderDecorator.java
index e9bdd4c1..b4ff7ac8 100644
--- a/src/main/java/net/logstash/logback/decorate/JsonFactoryDecorator.java
+++ b/src/main/java/net/logstash/logback/decorate/TokenStreamFactoryBuilderDecorator.java
@@ -17,36 +17,20 @@
import net.logstash.logback.composite.AbstractCompositeJsonFormatter;
-import com.fasterxml.jackson.core.JsonFactory;
-import com.fasterxml.jackson.databind.MappingJsonFactory;
+import tools.jackson.core.TSFBuilder;
+import tools.jackson.core.TokenStreamFactory;
/**
- * Decorates the {@link JsonFactory} used by a
+ * Decorates the {@link TSFBuilder} used by a
* {@link AbstractCompositeJsonFormatter}.
*
* This allows you to customize the factory used by the formatters.
*
* Implementations must be idempotent.
* The decorator configured on a formatter is called each time a formatter is started,
- * and there is no way to 'un-decorate' the factory when when formatter is stopped.
+ * and there is no way to 'un-decorate' the factory when the formatter is stopped.
* So, the factory could be decorated multiple times if the formatter is restarted.
*/
-public interface JsonFactoryDecorator {
-
- /**
- * Decorates the given {@link JsonFactory}.
- *
- *
By default, returns the given factory unchanged.
- *
- *
Note that the default {@link JsonFactory} created by logstash-logback-encoder
- * is a {@link MappingJsonFactory}, but can be changed by {@link JsonFactoryDecorator}s
- * to any subclass of {@link JsonFactory}.
- *
- * @param factory the factory to decorate
- * @return the decorated {@link JsonFactory}
- */
- default JsonFactory decorate(JsonFactory factory) {
- return factory;
- }
-
+public interface TokenStreamFactoryBuilderDecorator>
+ extends Decorator {
}
diff --git a/src/main/java/net/logstash/logback/decorate/TokenStreamFactoryFeatureDecorator.java b/src/main/java/net/logstash/logback/decorate/TokenStreamFactoryFeatureDecorator.java
new file mode 100644
index 00000000..0140c816
--- /dev/null
+++ b/src/main/java/net/logstash/logback/decorate/TokenStreamFactoryFeatureDecorator.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2013-2025 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.logstash.logback.decorate;
+
+import tools.jackson.core.TSFBuilder;
+import tools.jackson.core.TokenStreamFactory;
+
+/**
+ * A {@link TokenStreamFactoryBuilderDecorator} that allows enabling/disabling of {@link TokenStreamFactory.Feature} features.
+ */
+public class TokenStreamFactoryFeatureDecorator>
+ extends FeatureDecorator
+ implements TokenStreamFactoryBuilderDecorator {
+
+ public TokenStreamFactoryFeatureDecorator() {
+ super(TokenStreamFactory.Feature.class);
+ }
+
+ @Override
+ protected B configure(B builder, TokenStreamFactory.Feature feature, boolean state) {
+ return builder.configure(feature, state);
+ }
+}
diff --git a/src/main/java/net/logstash/logback/decorate/cbor/CborFeatureJsonGeneratorDecorator.java b/src/main/java/net/logstash/logback/decorate/cbor/CborFeatureJsonGeneratorDecorator.java
deleted file mode 100644
index 6a836d37..00000000
--- a/src/main/java/net/logstash/logback/decorate/cbor/CborFeatureJsonGeneratorDecorator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2013-2025 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package net.logstash.logback.decorate.cbor;
-
-import net.logstash.logback.decorate.FeatureDecorator;
-import net.logstash.logback.decorate.JsonGeneratorDecorator;
-
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.dataformat.cbor.CBORGenerator;
-
-/**
- * A {@link JsonGeneratorDecorator} that allows enabling/disabling of {@link CBORGenerator} features.
- *
- *
Only valid for {@link CBORGenerator}s.
- * Use in conjunction with {@link CborJsonFactoryDecorator}.
- */
-public class CborFeatureJsonGeneratorDecorator extends FeatureDecorator implements JsonGeneratorDecorator {
-
- public CborFeatureJsonGeneratorDecorator() {
- super(CBORGenerator.Feature.class, CBORGenerator::enable, CBORGenerator::disable);
- }
-
- @Override
- public JsonGenerator decorate(JsonGenerator generator) {
- if (!(generator instanceof CBORGenerator)) {
- throw new ClassCastException("Expected generator to be of type " + CBORGenerator.class.getName() + ". See " + CborJsonFactoryDecorator.class.getName());
- }
- return super.decorate((CBORGenerator) generator);
- }
-}
diff --git a/src/main/java/net/logstash/logback/decorate/cbor/CborJsonFactoryDecorator.java b/src/main/java/net/logstash/logback/decorate/cbor/CborJsonFactoryDecorator.java
deleted file mode 100644
index ad3fcdce..00000000
--- a/src/main/java/net/logstash/logback/decorate/cbor/CborJsonFactoryDecorator.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2013-2025 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package net.logstash.logback.decorate.cbor;
-
-import net.logstash.logback.decorate.JsonFactoryDecorator;
-
-import com.fasterxml.jackson.core.JsonFactory;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.dataformat.cbor.CBORFactory;
-import com.fasterxml.jackson.dataformat.cbor.CBORGenerator;
-
-/**
- * A {@link JsonFactoryDecorator} that will switch the output
- * to binary CBOR output instead of JSON text.
- *
- *
See also {@link CborFeatureJsonGeneratorDecorator} for configuring {@link CBORGenerator} features.
- */
-public class CborJsonFactoryDecorator implements JsonFactoryDecorator {
-
- @Override
- public JsonFactory decorate(JsonFactory factory) {
- CBORFactory cborFactory = new CBORFactory();
- ObjectMapper mapper = new ObjectMapper(cborFactory);
- cborFactory.setCodec(mapper);
- return cborFactory;
- }
-}
diff --git a/src/main/java/net/logstash/logback/decorate/cbor/CborWriteFeatureDecorator.java b/src/main/java/net/logstash/logback/decorate/cbor/CborWriteFeatureDecorator.java
new file mode 100644
index 00000000..1184d0b1
--- /dev/null
+++ b/src/main/java/net/logstash/logback/decorate/cbor/CborWriteFeatureDecorator.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2013-2025 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.logstash.logback.decorate.cbor;
+
+import net.logstash.logback.decorate.FeatureDecorator;
+import net.logstash.logback.decorate.TokenStreamFactoryBuilderDecorator;
+
+import tools.jackson.dataformat.cbor.CBORFactory;
+import tools.jackson.dataformat.cbor.CBORFactoryBuilder;
+import tools.jackson.dataformat.cbor.CBORWriteFeature;
+
+/**
+ * A {@link TokenStreamFactoryBuilderDecorator} that allows enabling/disabling of {@link CBORWriteFeature} features.
+ */
+public class CborWriteFeatureDecorator
+ extends FeatureDecorator
+ implements TokenStreamFactoryBuilderDecorator {
+
+ public CborWriteFeatureDecorator() {
+ super(CBORWriteFeature.class);
+ }
+
+ @Override
+ protected CBORFactoryBuilder configure(CBORFactoryBuilder builder, CBORWriteFeature feature, boolean state) {
+ return builder.configure(feature, state);
+ }
+}
diff --git a/src/main/java/net/logstash/logback/decorate/CharacterEscapesJsonFactoryDecorator.java b/src/main/java/net/logstash/logback/decorate/json/CharacterEscapesDecorator.java
similarity index 89%
rename from src/main/java/net/logstash/logback/decorate/CharacterEscapesJsonFactoryDecorator.java
rename to src/main/java/net/logstash/logback/decorate/json/CharacterEscapesDecorator.java
index ccbdbda1..07e6b5d3 100644
--- a/src/main/java/net/logstash/logback/decorate/CharacterEscapesJsonFactoryDecorator.java
+++ b/src/main/java/net/logstash/logback/decorate/json/CharacterEscapesDecorator.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package net.logstash.logback.decorate;
+package net.logstash.logback.decorate.json;
import java.util.ArrayList;
import java.util.Arrays;
@@ -21,22 +21,24 @@
import java.util.List;
import java.util.Objects;
-import com.fasterxml.jackson.core.JsonFactory;
-import com.fasterxml.jackson.core.SerializableString;
-import com.fasterxml.jackson.core.io.CharacterEscapes;
-import com.fasterxml.jackson.core.io.SerializedString;
+import net.logstash.logback.decorate.TokenStreamFactoryBuilderDecorator;
+
+import tools.jackson.core.SerializableString;
+import tools.jackson.core.io.CharacterEscapes;
+import tools.jackson.core.io.SerializedString;
+import tools.jackson.core.json.JsonFactory;
+import tools.jackson.core.json.JsonFactoryBuilder;
/**
- * A {@link JsonFactoryDecorator} that can be used to customize the {@link JsonFactory#setCharacterEscapes(CharacterEscapes)}.
+ * A {@link TokenStreamFactoryBuilderDecorator} that can be used to customize the {@link JsonFactoryBuilder#characterEscapes(CharacterEscapes)}.
*
* For example, you could change the escape sequence used for newline characters from '\n' to '\u2028'
*/
-public class CharacterEscapesJsonFactoryDecorator implements JsonFactoryDecorator {
+public class CharacterEscapesDecorator implements TokenStreamFactoryBuilderDecorator {
/**
- * A {@link CharacterEscapes} implementation that has been created from the registered {@link CharacterEscapesJsonFactoryDecorator#escapes}
+ * A {@link CharacterEscapes} implementation that has been created from the registered {@link CharacterEscapesDecorator#escapes}
*/
- @SuppressWarnings("serial")
private static class CustomizedCharacterEscapes extends CharacterEscapes {
/**
@@ -149,7 +151,7 @@ public void setTarget(String target) {
if (target == null || target.length() != 1) {
throw new IllegalArgumentException("target's length must be 1");
}
- setTargetCharacterCode((int) target.charAt(0));
+ setTargetCharacterCode(target.charAt(0));
}
/**
@@ -158,7 +160,7 @@ public void setTarget(String target) {
* @param targetCharacter the target character
*/
public void setTargetCharacter(char targetCharacter) {
- setTargetCharacterCode((char) targetCharacter);
+ setTargetCharacterCode(targetCharacter);
}
public int getTargetCharacterCode() {
@@ -236,22 +238,22 @@ public int hashCode() {
private final List escapes = new ArrayList<>();
/**
- * Indicates when the {@link CharacterEscapesJsonFactoryDecorator#characterEscapes} field needs to be re-initialized.
+ * Indicates when the {@link CharacterEscapesDecorator#characterEscapes} field needs to be re-initialized.
*/
private boolean needsInitialization = true;
/**
- * A {@link CharacterEscapes} implementation that has been created from the registered {@link CharacterEscapesJsonFactoryDecorator#escapes}
+ * A {@link CharacterEscapes} implementation that has been created from the registered {@link CharacterEscapesDecorator#escapes}
*/
private CustomizedCharacterEscapes characterEscapes;
@Override
- public JsonFactory decorate(JsonFactory factory) {
+ public JsonFactoryBuilder decorate(JsonFactoryBuilder builder) {
if (needsInitialization) {
characterEscapes = new CustomizedCharacterEscapes(includeStandardAsciiEscapesForJSON, escapes);
needsInitialization = false;
}
- return factory.setCharacterEscapes(characterEscapes);
+ return builder.characterEscapes(characterEscapes);
}
public boolean isIncludeStandardAsciiEscapesForJSON() {
diff --git a/src/main/java/net/logstash/logback/decorate/json/JsonWriteFeatureDecorator.java b/src/main/java/net/logstash/logback/decorate/json/JsonWriteFeatureDecorator.java
new file mode 100644
index 00000000..bf4cabc0
--- /dev/null
+++ b/src/main/java/net/logstash/logback/decorate/json/JsonWriteFeatureDecorator.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2013-2025 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.logstash.logback.decorate.json;
+
+import net.logstash.logback.decorate.FeatureDecorator;
+import net.logstash.logback.decorate.TokenStreamFactoryBuilderDecorator;
+
+import tools.jackson.core.json.JsonFactory;
+import tools.jackson.core.json.JsonFactoryBuilder;
+import tools.jackson.core.json.JsonWriteFeature;
+
+/**
+ * A {@link TokenStreamFactoryBuilderDecorator} that allows enabling/disabling of {@link JsonWriteFeature} features.
+ */
+public class JsonWriteFeatureDecorator
+ extends FeatureDecorator
+ implements TokenStreamFactoryBuilderDecorator {
+
+ public JsonWriteFeatureDecorator() {
+ super(JsonWriteFeature.class);
+ }
+
+ @Override
+ protected JsonFactoryBuilder configure(JsonFactoryBuilder builder, JsonWriteFeature feature, boolean state) {
+ return builder.configure(feature, state);
+ }
+}
diff --git a/src/main/java/net/logstash/logback/decorate/smile/SmileFeatureJsonGeneratorDecorator.java b/src/main/java/net/logstash/logback/decorate/smile/SmileFeatureJsonGeneratorDecorator.java
deleted file mode 100644
index 9e2f7942..00000000
--- a/src/main/java/net/logstash/logback/decorate/smile/SmileFeatureJsonGeneratorDecorator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2013-2025 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package net.logstash.logback.decorate.smile;
-
-import net.logstash.logback.decorate.FeatureDecorator;
-import net.logstash.logback.decorate.JsonGeneratorDecorator;
-
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.dataformat.smile.SmileGenerator;
-
-/**
- * A {@link JsonGeneratorDecorator} that allows enabling/disabling of {@link SmileGenerator} features.
- *
- *
Only valid for {@link SmileGenerator}s.
- * Use in conjunction with {@link SmileJsonFactoryDecorator}.
- */
-public class SmileFeatureJsonGeneratorDecorator extends FeatureDecorator implements JsonGeneratorDecorator {
-
- public SmileFeatureJsonGeneratorDecorator() {
- super(SmileGenerator.Feature.class, SmileGenerator::enable, SmileGenerator::disable);
- }
-
- @Override
- public JsonGenerator decorate(JsonGenerator generator) {
- if (!(generator instanceof SmileGenerator)) {
- throw new ClassCastException("Expected generator to be of type " + SmileGenerator.class.getName() + ". See " + SmileJsonFactoryDecorator.class.getName());
- }
- return super.decorate((SmileGenerator) generator);
- }
-}
diff --git a/src/main/java/net/logstash/logback/decorate/smile/SmileJsonFactoryDecorator.java b/src/main/java/net/logstash/logback/decorate/smile/SmileJsonFactoryDecorator.java
deleted file mode 100644
index bd1150b8..00000000
--- a/src/main/java/net/logstash/logback/decorate/smile/SmileJsonFactoryDecorator.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2013-2025 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package net.logstash.logback.decorate.smile;
-
-import net.logstash.logback.decorate.JsonFactoryDecorator;
-
-import com.fasterxml.jackson.core.JsonFactory;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.dataformat.smile.SmileFactory;
-import com.fasterxml.jackson.dataformat.smile.SmileGenerator;
-
-/**
- * A {@link JsonFactoryDecorator} that will switch the output
- * to binary smile output instead of JSON text.
- *
- *
See also {@link SmileFeatureJsonGeneratorDecorator} for configuring {@link SmileGenerator} features.
- */
-public class SmileJsonFactoryDecorator implements JsonFactoryDecorator {
-
- @Override
- public JsonFactory decorate(JsonFactory factory) {
- SmileFactory smileFactory = new SmileFactory();
- ObjectMapper mapper = new ObjectMapper(smileFactory);
- smileFactory.setCodec(mapper);
- return smileFactory;
- }
-}
diff --git a/src/main/java/net/logstash/logback/decorate/smile/SmileWriteFeatureDecorator.java b/src/main/java/net/logstash/logback/decorate/smile/SmileWriteFeatureDecorator.java
new file mode 100644
index 00000000..e8931a98
--- /dev/null
+++ b/src/main/java/net/logstash/logback/decorate/smile/SmileWriteFeatureDecorator.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2013-2025 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.logstash.logback.decorate.smile;
+
+import net.logstash.logback.decorate.FeatureDecorator;
+import net.logstash.logback.decorate.TokenStreamFactoryBuilderDecorator;
+
+import tools.jackson.dataformat.smile.SmileFactory;
+import tools.jackson.dataformat.smile.SmileFactoryBuilder;
+import tools.jackson.dataformat.smile.SmileWriteFeature;
+
+/**
+ * A {@link TokenStreamFactoryBuilderDecorator} that allows enabling/disabling of {@link SmileWriteFeature} features.
+ */
+public class SmileWriteFeatureDecorator
+ extends FeatureDecorator
+ implements TokenStreamFactoryBuilderDecorator {
+
+ public SmileWriteFeatureDecorator() {
+ super(SmileWriteFeature.class);
+ }
+
+ @Override
+ protected SmileFactoryBuilder configure(SmileFactoryBuilder builder, SmileWriteFeature feature, boolean state) {
+ return builder.configure(feature, state);
+ }
+}
diff --git a/src/main/java/net/logstash/logback/decorate/yaml/YamlFeatureJsonGeneratorDecorator.java b/src/main/java/net/logstash/logback/decorate/yaml/YamlFeatureJsonGeneratorDecorator.java
deleted file mode 100644
index 3a982d90..00000000
--- a/src/main/java/net/logstash/logback/decorate/yaml/YamlFeatureJsonGeneratorDecorator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2013-2025 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package net.logstash.logback.decorate.yaml;
-
-import net.logstash.logback.decorate.FeatureDecorator;
-import net.logstash.logback.decorate.JsonGeneratorDecorator;
-
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
-
-/**
- * A {@link JsonGeneratorDecorator} that allows enabling/disabling of {@link YAMLGenerator} features.
- *
- *
Only valid for {@link YAMLGenerator}s.
- * Use in conjunction with {@link YamlJsonFactoryDecorator}.
- */
-public class YamlFeatureJsonGeneratorDecorator extends FeatureDecorator implements JsonGeneratorDecorator {
-
- public YamlFeatureJsonGeneratorDecorator() {
- super(YAMLGenerator.Feature.class, YAMLGenerator::enable, YAMLGenerator::disable);
- }
-
- @Override
- public JsonGenerator decorate(JsonGenerator generator) {
- if (!(generator instanceof YAMLGenerator)) {
- throw new ClassCastException("Expected generator to be of type " + YAMLGenerator.class.getName() + ". See " + YamlJsonFactoryDecorator.class.getName());
- }
- return super.decorate((YAMLGenerator) generator);
- }
-}
diff --git a/src/main/java/net/logstash/logback/decorate/yaml/YamlJsonFactoryDecorator.java b/src/main/java/net/logstash/logback/decorate/yaml/YamlJsonFactoryDecorator.java
deleted file mode 100644
index c89ff979..00000000
--- a/src/main/java/net/logstash/logback/decorate/yaml/YamlJsonFactoryDecorator.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2013-2025 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package net.logstash.logback.decorate.yaml;
-
-import net.logstash.logback.decorate.JsonFactoryDecorator;
-
-import com.fasterxml.jackson.core.JsonFactory;
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
-import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
-
-/**
- * A {@link JsonFactoryDecorator} that will switch the output
- * to YAML output instead of JSON text.
- *
- *
See also {@link YamlFeatureJsonGeneratorDecorator} for configuring {@link YAMLGenerator} features.
- */
-public class YamlJsonFactoryDecorator implements JsonFactoryDecorator {
-
- @Override
- public JsonFactory decorate(JsonFactory factory) {
- YAMLFactory yamlFactory = new YAMLFactory();
- ObjectMapper mapper = new ObjectMapper(yamlFactory);
- yamlFactory.setCodec(mapper);
- /*
- * YAMLGenerator needs to pass the flush to the stream.
- * It doesn't maintain an internal buffer like the other generators.
- * To see this, look at the .flush() implementations of each of the generator classes.
- */
- yamlFactory.enable(JsonGenerator.Feature.FLUSH_PASSED_TO_STREAM);
- return yamlFactory;
- }
-}
diff --git a/src/main/java/net/logstash/logback/decorate/yaml/YamlWriteFeatureDecorator.java b/src/main/java/net/logstash/logback/decorate/yaml/YamlWriteFeatureDecorator.java
new file mode 100644
index 00000000..111fd6db
--- /dev/null
+++ b/src/main/java/net/logstash/logback/decorate/yaml/YamlWriteFeatureDecorator.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2013-2025 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.logstash.logback.decorate.yaml;
+
+import net.logstash.logback.decorate.FeatureDecorator;
+import net.logstash.logback.decorate.JsonGeneratorDecorator;
+import net.logstash.logback.decorate.TokenStreamFactoryBuilderDecorator;
+
+import tools.jackson.dataformat.yaml.YAMLFactory;
+import tools.jackson.dataformat.yaml.YAMLFactoryBuilder;
+import tools.jackson.dataformat.yaml.YAMLWriteFeature;
+
+/**
+ * A {@link JsonGeneratorDecorator} that allows enabling/disabling of {@link YAMLWriteFeature} features.
+ */
+public class YamlWriteFeatureDecorator
+ extends FeatureDecorator
+ implements TokenStreamFactoryBuilderDecorator {
+
+ public YamlWriteFeatureDecorator() {
+ super(YAMLWriteFeature.class);
+ }
+
+ @Override
+ protected YAMLFactoryBuilder configure(YAMLFactoryBuilder builder, YAMLWriteFeature feature, boolean state) {
+ return builder.configure(feature, state);
+ }
+}
diff --git a/src/main/java/net/logstash/logback/encoder/CompositeJsonEncoder.java b/src/main/java/net/logstash/logback/encoder/CompositeJsonEncoder.java
index ab5244ca..e555e2f0 100644
--- a/src/main/java/net/logstash/logback/encoder/CompositeJsonEncoder.java
+++ b/src/main/java/net/logstash/logback/encoder/CompositeJsonEncoder.java
@@ -22,8 +22,11 @@
import net.logstash.logback.composite.AbstractCompositeJsonFormatter;
import net.logstash.logback.composite.JsonProviders;
-import net.logstash.logback.decorate.JsonFactoryDecorator;
-import net.logstash.logback.decorate.JsonGeneratorDecorator;
+import net.logstash.logback.dataformat.DataFormatFactory;
+import net.logstash.logback.decorate.CompositeJsonGeneratorDecorator;
+import net.logstash.logback.decorate.CompositeMapperBuilderDecorator;
+import net.logstash.logback.decorate.CompositeTokenStreamFactoryBuilderDecorator;
+import net.logstash.logback.decorate.Decorator;
import net.logstash.logback.util.ReusableByteBuffer;
import net.logstash.logback.util.ThreadLocalReusableByteBuffer;
@@ -139,22 +142,20 @@ public void start() {
@SuppressWarnings({ "unchecked", "rawtypes" })
private void startWrapped(Encoder wrapped) {
- if (wrapped instanceof LayoutWrappingEncoder) {
+ if (wrapped instanceof LayoutWrappingEncoder layoutWrappedEncoder) {
/*
* Convenience hack to ensure the same charset is used in most cases.
*
* The charset for other encoders must be configured
* on the wrapped encoder configuration.
*/
- LayoutWrappingEncoder layoutWrappedEncoder = (LayoutWrappingEncoder) wrapped;
layoutWrappedEncoder.setCharset(charset);
- if (layoutWrappedEncoder.getLayout() instanceof PatternLayoutBase) {
+ if (layoutWrappedEncoder.getLayout() instanceof PatternLayoutBase layout) {
/*
* Don't ensure exception output (for ILoggingEvents)
* or line separation (for IAccessEvents)
*/
- PatternLayoutBase layout = (PatternLayoutBase) layoutWrappedEncoder.getLayout();
layout.setPostCompileProcessor(null);
/*
* The pattern will be re-parsed during start.
@@ -206,15 +207,35 @@ public void setProviders(JsonProviders jsonProviders) {
formatter.setProviders(jsonProviders);
}
- public JsonFactoryDecorator getJsonFactoryDecorator() {
- return formatter.getJsonFactoryDecorator();
+ public String getDataFormat() {
+ return formatter.getDataFormat();
}
- public void setJsonFactoryDecorator(JsonFactoryDecorator jsonFactoryDecorator) {
- formatter.setJsonFactoryDecorator(jsonFactoryDecorator);
+ public void setDataFormat(String dataFormat) {
+ formatter.setDataFormat(dataFormat);
}
- public JsonGeneratorDecorator getJsonGeneratorDecorator() {
+ public DataFormatFactory getDataFormatFactory() {
+ return formatter.getDataFormatFactory();
+ }
+
+ public void setDataFormatFactory(DataFormatFactory dataFormatFactory) {
+ formatter.setDataFormatFactory(dataFormatFactory);
+ }
+
+ public void addDecorator(Decorator> decorator) {
+ formatter.addDecorator(decorator);
+ }
+
+ public CompositeTokenStreamFactoryBuilderDecorator getTokenStreamFactoryBuilderDecorator() {
+ return formatter.getTokenStreamFactoryBuilderDecorator();
+ }
+
+ public CompositeMapperBuilderDecorator getMapperBuilderDecorator() {
+ return formatter.getMapperBuilderDecorator();
+ }
+
+ public CompositeJsonGeneratorDecorator getJsonGeneratorDecorator() {
return formatter.getJsonGeneratorDecorator();
}
@@ -224,7 +245,7 @@ public String getEncoding() {
/**
* The character encoding to use (default = "{@code UTF-8}").
- * Must an encoding supported by {@link com.fasterxml.jackson.core.JsonEncoding}
+ * Must an encoding supported by {@link tools.jackson.core.JsonEncoding}
*
* @param encodingName encoding name
*/
@@ -236,10 +257,6 @@ public void setFindAndRegisterJacksonModules(boolean findAndRegisterJacksonModul
formatter.setFindAndRegisterJacksonModules(findAndRegisterJacksonModules);
}
- public void setJsonGeneratorDecorator(JsonGeneratorDecorator jsonGeneratorDecorator) {
- formatter.setJsonGeneratorDecorator(jsonGeneratorDecorator);
- }
-
public String getLineSeparator() {
return lineSeparator;
}
diff --git a/src/main/java/net/logstash/logback/layout/CompositeJsonLayout.java b/src/main/java/net/logstash/logback/layout/CompositeJsonLayout.java
index efd99b8d..92453e05 100644
--- a/src/main/java/net/logstash/logback/layout/CompositeJsonLayout.java
+++ b/src/main/java/net/logstash/logback/layout/CompositeJsonLayout.java
@@ -23,8 +23,11 @@
import net.logstash.logback.composite.AbstractCompositeJsonFormatter;
import net.logstash.logback.composite.JsonProviders;
-import net.logstash.logback.decorate.JsonFactoryDecorator;
-import net.logstash.logback.decorate.JsonGeneratorDecorator;
+import net.logstash.logback.dataformat.DataFormatFactory;
+import net.logstash.logback.decorate.CompositeJsonGeneratorDecorator;
+import net.logstash.logback.decorate.CompositeMapperBuilderDecorator;
+import net.logstash.logback.decorate.CompositeTokenStreamFactoryBuilderDecorator;
+import net.logstash.logback.decorate.Decorator;
import net.logstash.logback.encoder.CompositeJsonEncoder;
import net.logstash.logback.encoder.SeparatorParser;
import net.logstash.logback.util.ReusableByteBuffer;
@@ -47,7 +50,7 @@ public abstract class CompositeJsonLayout
* Separator to use between events.
*
*
By default, this is null (for backwards compatibility), indicating no separator.
- * Note that this default is different than the default of {@link CompositeJsonEncoder#lineSeparator}.
+ * Note that this default is different from the default of {@link CompositeJsonEncoder#lineSeparator}.
* In a future major release, the default will likely change to be the same as {@link CompositeJsonEncoder#lineSeparator}.
*/
private String lineSeparator;
@@ -140,12 +143,11 @@ public void start() {
}
private void startWrapped(Layout wrapped) {
- if (wrapped instanceof PatternLayoutBase) {
+ if (wrapped instanceof PatternLayoutBase layout) {
/*
* Don't ensure exception output (for ILoggingEvents)
* or line separation (for IAccessEvents)
*/
- PatternLayoutBase layout = (PatternLayoutBase) wrapped;
layout.setPostCompileProcessor(null);
/*
* The pattern will be re-parsed during start.
@@ -195,20 +197,36 @@ public void setImmediateFlush(boolean immediateFlush) {
this.immediateFlush = immediateFlush;
}
- public JsonFactoryDecorator getJsonFactoryDecorator() {
- return formatter.getJsonFactoryDecorator();
+ public String getDataFormat() {
+ return formatter.getDataFormat();
}
- public void setJsonFactoryDecorator(JsonFactoryDecorator jsonFactoryDecorator) {
- formatter.setJsonFactoryDecorator(jsonFactoryDecorator);
+ public void setDataFormat(String dataFormat) {
+ formatter.setDataFormat(dataFormat);
}
- public JsonGeneratorDecorator getJsonGeneratorDecorator() {
- return formatter.getJsonGeneratorDecorator();
+ public DataFormatFactory getDataFormatFactory() {
+ return formatter.getDataFormatFactory();
+ }
+
+ public void setDataFormatFactory(DataFormatFactory dataFormatFactory) {
+ formatter.setDataFormatFactory(dataFormatFactory);
+ }
+
+ public void addDecorator(Decorator> decorator) {
+ formatter.addDecorator(decorator);
}
- public void setJsonGeneratorDecorator(JsonGeneratorDecorator jsonGeneratorDecorator) {
- formatter.setJsonGeneratorDecorator(jsonGeneratorDecorator);
+ public CompositeTokenStreamFactoryBuilderDecorator getTokenStreamFactoryBuilderDecorator() {
+ return formatter.getTokenStreamFactoryBuilderDecorator();
+ }
+
+ public CompositeMapperBuilderDecorator getMapperBuilderDecorator() {
+ return formatter.getMapperBuilderDecorator();
+ }
+
+ public CompositeJsonGeneratorDecorator getJsonGeneratorDecorator() {
+ return formatter.getJsonGeneratorDecorator();
}
public void setFindAndRegisterJacksonModules(boolean findAndRegisterJacksonModules) {
diff --git a/src/main/java/net/logstash/logback/marker/DeferredLogstashMarker.java b/src/main/java/net/logstash/logback/marker/DeferredLogstashMarker.java
index 40f5a0bc..0594c3f8 100644
--- a/src/main/java/net/logstash/logback/marker/DeferredLogstashMarker.java
+++ b/src/main/java/net/logstash/logback/marker/DeferredLogstashMarker.java
@@ -15,7 +15,6 @@
*/
package net.logstash.logback.marker;
-import java.io.IOException;
import java.util.Iterator;
import java.util.Objects;
import java.util.function.Supplier;
@@ -23,8 +22,8 @@
import net.logstash.logback.appender.AsyncDisruptorAppender;
import ch.qos.logback.classic.AsyncAppender;
-import com.fasterxml.jackson.core.JsonGenerator;
import org.slf4j.Marker;
+import tools.jackson.core.JsonGenerator;
/**
* A {@link LogstashMarker} that defers the creation of another {@link LogstashMarker} until
@@ -39,7 +38,6 @@
* the supplier will be invoked when the first appender encodes the marker.
* That same supplied value will be used when the next appender encodes the marker.
*/
-@SuppressWarnings("serial")
public class DeferredLogstashMarker extends LogstashMarker {
public static final String DEFERRED_MARKER_NAME = "DEFERRED";
@@ -61,7 +59,7 @@ public DeferredLogstashMarker(Supplier extends LogstashMarker> logstashMarkerS
}
@Override
- public void writeTo(JsonGenerator generator) throws IOException {
+ public void writeTo(JsonGenerator generator) {
writeMarker(generator, getSuppliedValue());
}
@@ -86,7 +84,7 @@ private LogstashMarker getSuppliedValue() {
return suppliedValue;
}
- private void writeMarker(JsonGenerator generator, Marker marker) throws IOException {
+ private void writeMarker(JsonGenerator generator, Marker marker) {
if (marker == null) {
return;
}
diff --git a/src/main/java/net/logstash/logback/marker/EmptyLogstashMarker.java b/src/main/java/net/logstash/logback/marker/EmptyLogstashMarker.java
index 025aba02..ce0e9c91 100644
--- a/src/main/java/net/logstash/logback/marker/EmptyLogstashMarker.java
+++ b/src/main/java/net/logstash/logback/marker/EmptyLogstashMarker.java
@@ -15,12 +15,10 @@
*/
package net.logstash.logback.marker;
-import java.io.IOException;
-
import net.logstash.logback.argument.StructuredArgument;
-import com.fasterxml.jackson.core.JsonGenerator;
import org.slf4j.Marker;
+import tools.jackson.core.JsonGenerator;
/**
* An empty marker that does nothing itself, but can be used as a base marker when you want to conditionally chain other markers with {@link #and(Marker)}.
@@ -36,7 +34,6 @@
* }
*
*/
-@SuppressWarnings("serial")
public class EmptyLogstashMarker extends LogstashMarker implements StructuredArgument {
public static final String EMPTY_MARKER_NAME = "EMPTY";
@@ -46,7 +43,7 @@ public EmptyLogstashMarker() {
}
@Override
- public void writeTo(JsonGenerator generator) throws IOException {
+ public void writeTo(JsonGenerator generator) {
// no-op
}
diff --git a/src/main/java/net/logstash/logback/marker/LogstashMarker.java b/src/main/java/net/logstash/logback/marker/LogstashMarker.java
index 8d2efb6e..fbb12c02 100755
--- a/src/main/java/net/logstash/logback/marker/LogstashMarker.java
+++ b/src/main/java/net/logstash/logback/marker/LogstashMarker.java
@@ -15,17 +15,14 @@
*/
package net.logstash.logback.marker;
-import java.io.IOException;
-
-import com.fasterxml.jackson.core.JsonGenerator;
import org.slf4j.Marker;
+import tools.jackson.core.JsonGenerator;
/**
* A {@link Marker} that is known and understood by the logstash logback encoder.
*
* In particular these markers are used to write data into the logstash json event via {@link #writeTo(JsonGenerator)}.
*/
-@SuppressWarnings("serial")
public abstract class LogstashMarker extends LogstashBasicMarker implements Iterable {
public static final String MARKER_NAME_PREFIX = "LS_";
@@ -73,9 +70,8 @@ public T with(Marker reference) {
* Writes the data associated with this marker to the given {@link JsonGenerator}.
*
* @param generator the generator to which to write the output of this marker.
- * @throws IOException if there was an error writing to the generator
*/
- public abstract void writeTo(JsonGenerator generator) throws IOException;
+ public abstract void writeTo(JsonGenerator generator);
@Override
public void add(Marker reference) {
diff --git a/src/main/java/net/logstash/logback/marker/MapEntriesAppendingMarker.java b/src/main/java/net/logstash/logback/marker/MapEntriesAppendingMarker.java
index 62ab4fdb..ea12f3d9 100755
--- a/src/main/java/net/logstash/logback/marker/MapEntriesAppendingMarker.java
+++ b/src/main/java/net/logstash/logback/marker/MapEntriesAppendingMarker.java
@@ -15,7 +15,6 @@
*/
package net.logstash.logback.marker;
-import java.io.IOException;
import java.util.Map;
import java.util.Objects;
@@ -23,9 +22,9 @@
import net.logstash.logback.composite.loggingevent.ArgumentsJsonProvider;
import net.logstash.logback.composite.loggingevent.LogstashMarkersJsonProvider;
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Marker;
+import tools.jackson.core.JsonGenerator;
+import tools.jackson.databind.ObjectMapper;
/**
* A {@link Marker} OR {@link StructuredArgument} that appends entries
@@ -67,7 +66,6 @@
* }
*
*/
-@SuppressWarnings("serial")
public class MapEntriesAppendingMarker extends LogstashMarker implements StructuredArgument {
public static final String MARKER_NAME = LogstashMarker.MARKER_NAME_PREFIX + "MAP_FIELDS";
@@ -83,11 +81,10 @@ public MapEntriesAppendingMarker(Map, ?> map) {
}
@Override
- public void writeTo(JsonGenerator generator) throws IOException {
+ public void writeTo(JsonGenerator generator) {
if (map != null) {
for (Map.Entry, ?> entry : map.entrySet()) {
- generator.writeFieldName(String.valueOf(entry.getKey()));
- generator.writeObject(entry.getValue());
+ generator.writePOJOProperty(String.valueOf(entry.getKey()), entry.getValue());
}
}
}
@@ -105,11 +102,10 @@ public boolean equals(Object obj) {
if (!super.equals(obj)) {
return false;
}
- if (!(obj instanceof MapEntriesAppendingMarker)) {
+ if (!(obj instanceof MapEntriesAppendingMarker other)) {
return false;
}
- MapEntriesAppendingMarker other = (MapEntriesAppendingMarker) obj;
return Objects.equals(this.map, other.map);
}
diff --git a/src/main/java/net/logstash/logback/marker/ObjectAppendingMarker.java b/src/main/java/net/logstash/logback/marker/ObjectAppendingMarker.java
index ac83509f..9d412f7d 100755
--- a/src/main/java/net/logstash/logback/marker/ObjectAppendingMarker.java
+++ b/src/main/java/net/logstash/logback/marker/ObjectAppendingMarker.java
@@ -15,7 +15,6 @@
*/
package net.logstash.logback.marker;
-import java.io.IOException;
import java.util.Objects;
import net.logstash.logback.argument.StructuredArgument;
@@ -23,9 +22,9 @@
import net.logstash.logback.composite.loggingevent.ArgumentsJsonProvider;
import net.logstash.logback.composite.loggingevent.LogstashMarkersJsonProvider;
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Marker;
+import tools.jackson.core.JsonGenerator;
+import tools.jackson.databind.ObjectMapper;
/**
* A {@link Marker} OR {@link StructuredArgument} that
@@ -67,7 +66,6 @@
* }
*
*/
-@SuppressWarnings("serial")
public class ObjectAppendingMarker extends SingleFieldAppendingMarker {
public static final String MARKER_NAME = SingleFieldAppendingMarker.MARKER_NAME_PREFIX + "OBJECT";
@@ -89,8 +87,8 @@ public ObjectAppendingMarker(String fieldName, Object fieldValue, String message
}
@Override
- protected void writeFieldValue(JsonGenerator generator) throws IOException {
- generator.writeObject(fieldValue);
+ protected void writeFieldValue(JsonGenerator generator) {
+ generator.writePOJO(fieldValue);
}
@Override
@@ -106,11 +104,10 @@ public boolean equals(Object obj) {
if (!super.equals(obj)) {
return false;
}
- if (!(obj instanceof ObjectAppendingMarker)) {
+ if (!(obj instanceof ObjectAppendingMarker other)) {
return false;
}
- ObjectAppendingMarker other = (ObjectAppendingMarker) obj;
return Objects.equals(this.fieldValue, other.fieldValue);
}
diff --git a/src/main/java/net/logstash/logback/marker/ObjectFieldsAppendingMarker.java b/src/main/java/net/logstash/logback/marker/ObjectFieldsAppendingMarker.java
index 6db27fa2..8a25a367 100755
--- a/src/main/java/net/logstash/logback/marker/ObjectFieldsAppendingMarker.java
+++ b/src/main/java/net/logstash/logback/marker/ObjectFieldsAppendingMarker.java
@@ -15,7 +15,6 @@
*/
package net.logstash.logback.marker;
-import java.io.IOException;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
@@ -25,13 +24,11 @@
import net.logstash.logback.composite.loggingevent.ArgumentsJsonProvider;
import net.logstash.logback.composite.loggingevent.LogstashMarkersJsonProvider;
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.JsonMappingException;
-import com.fasterxml.jackson.databind.JsonSerializer;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializerProvider;
-import com.fasterxml.jackson.databind.util.NameTransformer;
import org.slf4j.Marker;
+import tools.jackson.core.JsonGenerator;
+import tools.jackson.databind.SerializationContext;
+import tools.jackson.databind.ValueSerializer;
+import tools.jackson.databind.util.NameTransformer;
/**
* A {@link Marker} OR {@link StructuredArgument} that
@@ -76,7 +73,6 @@
*
* Note that if the object cannot be unwrapped, then nothing will be written.
*/
-@SuppressWarnings("serial")
public class ObjectFieldsAppendingMarker extends LogstashMarker implements StructuredArgument {
public static final String MARKER_NAME = LogstashMarker.MARKER_NAME_PREFIX + "OBJECT_FIELDS";
@@ -89,7 +85,7 @@ public class ObjectFieldsAppendingMarker extends LogstashMarker implements Struc
*
* Since apps will typically serialize the same types of objects repeatedly, they shouldn't grow too much.
*/
- private static final Map serializerHelper = new ConcurrentHashMap<>();
+ private static final Map, ValueSerializer