Nit: "stacktraceAsString" -> "stacktTaceAsString". On Fri, Jul 7, 2017 at 1:43 PM, <[email protected]> wrote:
> Repository: logging-log4j2 > Updated Branches: > refs/heads/master 96eb72e3c -> c016e8978 > > > LOG4J2-1923 Allow having the stacktrace as a string in JSONLayout, > XMLLayout and YAMLLayout > > > Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo > Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/ > commit/0b8f7431 > Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/0b8f7431 > Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/0b8f7431 > > Branch: refs/heads/master > Commit: 0b8f7431684dd634f32cbc374478200e3cd42d2c > Parents: 96eb72e > Author: Imri Zvik <[email protected]> > Authored: Thu May 25 17:32:51 2017 +0300 > Committer: Mikael Ståldal <[email protected]> > Committed: Fri Jul 7 21:17:40 2017 +0200 > > ---------------------------------------------------------------------- > .../logging/log4j/core/impl/ThrowableProxy.java | 10 +++ > .../log4j/core/jackson/Initializers.java | 8 +- > .../log4j/core/jackson/Log4jJsonModule.java | 8 +- > .../core/jackson/Log4jJsonObjectMapper.java | 6 +- > .../log4j/core/jackson/Log4jXmlModule.java | 6 +- > .../core/jackson/Log4jXmlObjectMapper.java | 6 +- > .../log4j/core/jackson/Log4jYamlModule.java | 8 +- > .../core/jackson/Log4jYamlObjectMapper.java | 6 +- > ...rowableProxyWithStacktraceAsStringMixIn.java | 77 ++++++++++++++++++++ > .../core/layout/AbstractJacksonLayout.java | 12 +++ > .../log4j/core/layout/JacksonFactory.java | 20 +++-- > .../logging/log4j/core/layout/JsonLayout.java | 15 ++-- > .../logging/log4j/core/layout/XmlLayout.java | 19 +++-- > .../logging/log4j/core/layout/YamlLayout.java | 15 ++-- > .../logging/log4j/MarkerMixInXmlTest.java | 2 +- > .../log4j/core/jackson/LevelMixInJsonTest.java | 2 +- > .../jackson/StackTraceElementMixInTest.java | 2 +- > .../log4j/core/layout/JsonLayoutTest.java | 28 ++++++- > .../log4j/core/layout/XmlLayoutTest.java | 6 +- > .../log4j/core/layout/YamlLayoutTest.java | 12 +-- > src/site/xdoc/manual/layouts.xml.vm | 15 ++++ > 21 files changed, 222 insertions(+), 61 deletions(-) > ---------------------------------------------------------------------- > > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > 0b8f7431/log4j-core/src/main/java/org/apache/logging/log4j/ > core/impl/ThrowableProxy.java > ---------------------------------------------------------------------- > diff --git > a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableProxy.java > b/log4j-core/src/main/java/org/apache/logging/log4j/core/ > impl/ThrowableProxy.java > index 8b80be0..4cbac54 100644 > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/ > impl/ThrowableProxy.java > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/ > impl/ThrowableProxy.java > @@ -430,6 +430,16 @@ public class ThrowableProxy implements Serializable { > * @return The formatted stack trace including packaging information. > * @param suffix > */ > + public String getExtendedStackTraceAsString() { > + return this.getExtendedStackTraceAsString(null, > PlainTextRenderer.getInstance(), ""); > + } > + > + /** > + * Format the stack trace including packaging information. > + * > + * @return The formatted stack trace including packaging information. > + * @param suffix > + */ > public String getExtendedStackTraceAsString(final String suffix) { > return this.getExtendedStackTraceAsString(null, > PlainTextRenderer.getInstance(), suffix); > } > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > 0b8f7431/log4j-core/src/main/java/org/apache/logging/log4j/ > core/jackson/Initializers.java > ---------------------------------------------------------------------- > diff --git > a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/Initializers.java > b/log4j-core/src/main/java/org/apache/logging/log4j/core/ > jackson/Initializers.java > index dc1f81a..b7387e5 100644 > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/ > jackson/Initializers.java > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/ > jackson/Initializers.java > @@ -39,7 +39,7 @@ class Initializers { > */ > static class SetupContextInitializer { > > - void setupModule(final SetupContext context, final boolean > includeStacktrace) { > + void setupModule(final SetupContext context, final boolean > includeStacktrace, final boolean stacktraceAsString) { > // JRE classes: we cannot edit those with Jackson annotations > context.setMixInAnnotations(StackTraceElement.class, > StackTraceElementMixIn.class); > // Log4j API classes: we do not want to edit those with > Jackson annotations because the API module should not depend on Jackson. > @@ -49,7 +49,7 @@ class Initializers { > // Log4j Core classes: we do not want to bring in Jackson at > runtime if we do not have to. > context.setMixInAnnotations(ExtendedStackTraceElement.class, > ExtendedStackTraceElementMixIn.class); > context.setMixInAnnotations(ThrowableProxy.class, > - includeStacktrace ? ThrowableProxyMixIn.class : > ThrowableProxyWithoutStacktraceMixIn.class); > + includeStacktrace ? (stacktraceAsString ? > ThrowableProxyWithStacktraceAsStringMixIn.class : > ThrowableProxyMixIn.class ) : ThrowableProxyWithoutStacktraceMixIn.class); > } > } > > @@ -60,7 +60,7 @@ class Initializers { > */ > static class SetupContextJsonInitializer { > > - void setupModule(final SetupContext context, final boolean > includeStacktrace) { > + void setupModule(final SetupContext context, final boolean > includeStacktrace, final boolean stacktraceAsString) { > // JRE classes: we cannot edit those with Jackson annotations > context.setMixInAnnotations(StackTraceElement.class, > StackTraceElementMixIn.class); > // Log4j API classes: we do not want to edit those with > Jackson annotations because the API module should not depend on Jackson. > @@ -70,7 +70,7 @@ class Initializers { > // Log4j Core classes: we do not want to bring in Jackson at > runtime if we do not have to. > context.setMixInAnnotations(ExtendedStackTraceElement.class, > ExtendedStackTraceElementMixIn.class); > context.setMixInAnnotations(ThrowableProxy.class, > - includeStacktrace ? ThrowableProxyMixIn.class : > ThrowableProxyWithoutStacktraceMixIn.class); > + includeStacktrace ? (stacktraceAsString ? > ThrowableProxyWithStacktraceAsStringMixIn.class : > ThrowableProxyMixIn.class ) : ThrowableProxyWithoutStacktraceMixIn.class); > } > } > > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > 0b8f7431/log4j-core/src/main/java/org/apache/logging/log4j/ > core/jackson/Log4jJsonModule.java > ---------------------------------------------------------------------- > diff --git > a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/Log4jJsonModule.java > b/log4j-core/src/main/java/org/apache/logging/log4j/core/ > jackson/Log4jJsonModule.java > index 48bd137..e6aa49e 100644 > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/ > jackson/Log4jJsonModule.java > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/ > jackson/Log4jJsonModule.java > @@ -33,11 +33,13 @@ class Log4jJsonModule extends SimpleModule { > private static final long serialVersionUID = 1L; > private final boolean encodeThreadContextAsList; > private final boolean includeStacktrace; > + private final boolean stacktraceAsString; > > - Log4jJsonModule(final boolean encodeThreadContextAsList, final > boolean includeStacktrace) { > + Log4jJsonModule(final boolean encodeThreadContextAsList, final > boolean includeStacktrace, final boolean stacktraceAsString) { > super(Log4jJsonModule.class.getName(), new Version(2, 0, 0, > null, null, null)); > this.encodeThreadContextAsList = encodeThreadContextAsList; > this.includeStacktrace = includeStacktrace; > + this.stacktraceAsString = stacktraceAsString; > // MUST init here. > // Calling this from setupModule is too late! > //noinspection ThisEscapedInObjectConstruction > @@ -49,9 +51,9 @@ class Log4jJsonModule extends SimpleModule { > // Calling super is a MUST! > super.setupModule(context); > if (encodeThreadContextAsList) { > - new SetupContextInitializer().setupModule(context, > includeStacktrace); > + new SetupContextInitializer().setupModule(context, > includeStacktrace, stacktraceAsString); > } else { > - new SetupContextJsonInitializer().setupModule(context, > includeStacktrace); > + new SetupContextJsonInitializer().setupModule(context, > includeStacktrace, stacktraceAsString); > } > } > } > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > 0b8f7431/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ > Log4jJsonObjectMapper.java > ---------------------------------------------------------------------- > diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/ > jackson/Log4jJsonObjectMapper.java b/log4j-core/src/main/java/ > org/apache/logging/log4j/core/jackson/Log4jJsonObjectMapper.java > index 36b130d..858c9e7 100644 > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/ > jackson/Log4jJsonObjectMapper.java > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/ > jackson/Log4jJsonObjectMapper.java > @@ -33,14 +33,14 @@ public class Log4jJsonObjectMapper extends > ObjectMapper { > * Create a new instance using the {@link Log4jJsonModule}. > */ > public Log4jJsonObjectMapper() { > - this(false, true); > + this(false, true, false); > } > > /** > * Create a new instance using the {@link Log4jJsonModule}. > */ > - public Log4jJsonObjectMapper(final boolean encodeThreadContextAsList, > final boolean includeStacktrace) { > - this.registerModule(new Log4jJsonModule(encodeThreadContextAsList, > includeStacktrace)); > + public Log4jJsonObjectMapper(final boolean encodeThreadContextAsList, > final boolean includeStacktrace, final boolean stacktraceAsString) { > + this.registerModule(new Log4jJsonModule(encodeThreadContextAsList, > includeStacktrace, stacktraceAsString)); > this.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); > } > > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > 0b8f7431/log4j-core/src/main/java/org/apache/logging/log4j/ > core/jackson/Log4jXmlModule.java > ---------------------------------------------------------------------- > diff --git > a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/Log4jXmlModule.java > b/log4j-core/src/main/java/org/apache/logging/log4j/core/ > jackson/Log4jXmlModule.java > index 449e001..24292ed 100644 > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/ > jackson/Log4jXmlModule.java > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/ > jackson/Log4jXmlModule.java > @@ -30,10 +30,12 @@ final class Log4jXmlModule extends JacksonXmlModule { > > private static final long serialVersionUID = 1L; > private final boolean includeStacktrace; > + private final boolean stacktraceAsString; > > - Log4jXmlModule(final boolean includeStacktrace) { > + Log4jXmlModule(final boolean includeStacktrace, final boolean > stacktraceAsString) { > super(); > this.includeStacktrace = includeStacktrace; > + this.stacktraceAsString = stacktraceAsString; > // MUST init here. > // Calling this from setupModule is too late! > new SimpleModuleInitializer().initialize(this); > @@ -43,6 +45,6 @@ final class Log4jXmlModule extends JacksonXmlModule { > public void setupModule(final SetupContext context) { > // Calling super is a MUST! > super.setupModule(context); > - new SetupContextInitializer().setupModule(context, > includeStacktrace); > + new SetupContextInitializer().setupModule(context, > includeStacktrace, stacktraceAsString); > } > } > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > 0b8f7431/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ > Log4jXmlObjectMapper.java > ---------------------------------------------------------------------- > diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/ > jackson/Log4jXmlObjectMapper.java b/log4j-core/src/main/java/ > org/apache/logging/log4j/core/jackson/Log4jXmlObjectMapper.java > index 77d8ce4..b390a3f 100644 > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/ > jackson/Log4jXmlObjectMapper.java > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/ > jackson/Log4jXmlObjectMapper.java > @@ -34,14 +34,14 @@ public class Log4jXmlObjectMapper extends XmlMapper { > * Create a new instance using the {@link Log4jXmlModule}. > */ > public Log4jXmlObjectMapper() { > - this(true); > + this(true, false); > } > > /** > * Create a new instance using the {@link Log4jXmlModule}. > */ > - public Log4jXmlObjectMapper(final boolean includeStacktrace) { > - super(new Log4jXmlModule(includeStacktrace)); > + public Log4jXmlObjectMapper(final boolean includeStacktrace, final > boolean stacktraceAsString) { > + super(new Log4jXmlModule(includeStacktrace, stacktraceAsString)); > this.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); > } > > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > 0b8f7431/log4j-core/src/main/java/org/apache/logging/log4j/ > core/jackson/Log4jYamlModule.java > ---------------------------------------------------------------------- > diff --git > a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/Log4jYamlModule.java > b/log4j-core/src/main/java/org/apache/logging/log4j/core/ > jackson/Log4jYamlModule.java > index 2623ade..39ea514 100644 > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/ > jackson/Log4jYamlModule.java > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/ > jackson/Log4jYamlModule.java > @@ -33,11 +33,13 @@ final class Log4jYamlModule extends SimpleModule { > private static final long serialVersionUID = 1L; > private final boolean encodeThreadContextAsList; > private final boolean includeStacktrace; > + private final boolean stacktraceAsString; > > - Log4jYamlModule(final boolean encodeThreadContextAsList, final > boolean includeStacktrace) { > + Log4jYamlModule(final boolean encodeThreadContextAsList, final > boolean includeStacktrace, final boolean stacktraceAsString) { > super(Log4jYamlModule.class.getName(), new Version(2, 0, 0, > null, null, null)); > this.encodeThreadContextAsList = encodeThreadContextAsList; > this.includeStacktrace = includeStacktrace; > + this.stacktraceAsString = stacktraceAsString; > // MUST init here. > // Calling this from setupModule is too late! > //noinspection ThisEscapedInObjectConstruction > @@ -49,9 +51,9 @@ final class Log4jYamlModule extends SimpleModule { > // Calling super is a MUST! > super.setupModule(context); > if (encodeThreadContextAsList) { > - new SetupContextInitializer().setupModule(context, > includeStacktrace); > + new SetupContextInitializer().setupModule(context, > includeStacktrace, stacktraceAsString); > } else { > - new SetupContextJsonInitializer().setupModule(context, > includeStacktrace); > + new SetupContextJsonInitializer().setupModule(context, > includeStacktrace, stacktraceAsString); > } > } > } > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > 0b8f7431/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ > Log4jYamlObjectMapper.java > ---------------------------------------------------------------------- > diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/ > jackson/Log4jYamlObjectMapper.java b/log4j-core/src/main/java/ > org/apache/logging/log4j/core/jackson/Log4jYamlObjectMapper.java > index 2ccb567..0b80591 100644 > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/ > jackson/Log4jYamlObjectMapper.java > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/ > jackson/Log4jYamlObjectMapper.java > @@ -34,14 +34,14 @@ public class Log4jYamlObjectMapper extends YAMLMapper { > * Create a new instance using the {@link Log4jYamlModule}. > */ > public Log4jYamlObjectMapper() { > - this(false, true); > + this(false, true, false); > } > > /** > * Create a new instance using the {@link Log4jYamlModule}. > */ > - public Log4jYamlObjectMapper(final boolean encodeThreadContextAsList, > final boolean includeStacktrace) { > - this.registerModule(new Log4jYamlModule(encodeThreadContextAsList, > includeStacktrace)); > + public Log4jYamlObjectMapper(final boolean encodeThreadContextAsList, > final boolean includeStacktrace, final boolean stacktraceAsString) { > + this.registerModule(new Log4jYamlModule(encodeThreadContextAsList, > includeStacktrace, stacktraceAsString)); > this.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); > } > > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > 0b8f7431/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ > ThrowableProxyWithStacktraceAsStringMixIn.java > ---------------------------------------------------------------------- > diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/ > jackson/ThrowableProxyWithStacktraceAsStringMixIn.java > b/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ > ThrowableProxyWithStacktraceAsStringMixIn.java > new file mode 100644 > index 0000000..b6f5586 > --- /dev/null > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ > ThrowableProxyWithStacktraceAsStringMixIn.java > @@ -0,0 +1,77 @@ > +/* > + * Licensed to the Apache Software Foundation (ASF) under one or more > + * contributor license agreements. See the NOTICE file distributed with > + * this work for additional information regarding copyright ownership. > + * The ASF licenses this file to You 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 org.apache.logging.log4j.core.jackson; > + > +import com.fasterxml.jackson.annotation.JsonIgnore; > +import com.fasterxml.jackson.annotation.JsonProperty; > +import com.fasterxml.jackson.dataformat.xml.annotation. > JacksonXmlElementWrapper; > +import com.fasterxml.jackson.dataformat.xml.annotation. > JacksonXmlProperty; > +import org.apache.logging.log4j.core.impl.ExtendedStackTraceElement; > +import org.apache.logging.log4j.core.impl.ThrowableProxy; > + > +/** > + * Mix-in for {@link org.apache.logging.log4j.core.impl.ThrowableProxy}. > + */ > +abstract class ThrowableProxyWithStacktraceAsStringMixIn { > + > + @JsonProperty(JsonConstants.ELT_CAUSE) > + @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName > = XmlConstants.ELT_CAUSE) > + private ThrowableProxyWithStacktraceAsStringMixIn causeProxy; > + > + @JsonProperty > + @JacksonXmlProperty(isAttribute = true) > + private int commonElementCount; > + > + @JsonIgnore > + private ExtendedStackTraceElement[] extendedStackTrace; > + > + @JsonProperty > + @JacksonXmlProperty(isAttribute = true) > + private String localizedMessage; > + > + @JsonProperty > + @JacksonXmlProperty(isAttribute = true) > + private String message; > + > + @JsonProperty > + @JacksonXmlProperty(isAttribute = true) > + private String name; > + > + @JsonIgnore > + private transient Throwable throwable; > + > + @JsonIgnore > + public abstract String getCauseStackTraceAsString(); > + > + @JsonProperty(JsonConstants.ELT_EXTENDED_STACK_TRACE) > + public abstract String getExtendedStackTraceAsString(); > + > + @JsonIgnore > + public abstract StackTraceElement[] getStackTrace(); > + > + @JsonProperty(JsonConstants.ELT_SUPPRESSED) > + @JacksonXmlElementWrapper(namespace = XmlConstants.XML_NAMESPACE, > localName = XmlConstants.ELT_SUPPRESSED) > + @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName > = XmlConstants.ELT_SUPPRESSED_ITEM) > + public abstract ThrowableProxy[] getSuppressedProxies(); > + > + @JsonIgnore > + public abstract String getSuppressedStackTrace(); > + > + @JsonIgnore > + public abstract Throwable getThrowable(); > + > +} > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > 0b8f7431/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ > AbstractJacksonLayout.java > ---------------------------------------------------------------------- > diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/ > layout/AbstractJacksonLayout.java b/log4j-core/src/main/java/ > org/apache/logging/log4j/core/layout/AbstractJacksonLayout.java > index 1588cd1..7115df8 100644 > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/ > layout/AbstractJacksonLayout.java > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/ > layout/AbstractJacksonLayout.java > @@ -56,6 +56,9 @@ abstract class AbstractJacksonLayout extends > AbstractStringLayout { > @PluginBuilderAttribute > private boolean includeStacktrace = true; > > + @PluginBuilderAttribute > + private boolean stacktraceAsString = false; > + > protected String toStringOrNull(final byte[] header) { > return header == null ? null : new String(header, > Charset.defaultCharset()); > } > @@ -88,6 +91,10 @@ abstract class AbstractJacksonLayout extends > AbstractStringLayout { > return includeStacktrace; > } > > + public boolean isStacktraceAsString() { > + return stacktraceAsString; > + } > + > public B setEventEol(final boolean eventEol) { > this.eventEol = eventEol; > return asBuilder(); > @@ -122,6 +129,11 @@ abstract class AbstractJacksonLayout extends > AbstractStringLayout { > this.includeStacktrace = includeStacktrace; > return asBuilder(); > } > + > + public B setStacktraceAsString(boolean stacktraceAsString) { > + this.stacktraceAsString = stacktraceAsString; > + return asBuilder(); > + } > } > > protected final String eol; > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > 0b8f7431/log4j-core/src/main/java/org/apache/logging/log4j/ > core/layout/JacksonFactory.java > ---------------------------------------------------------------------- > diff --git > a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/JacksonFactory.java > b/log4j-core/src/main/java/org/apache/logging/log4j/core/ > layout/JacksonFactory.java > index a62bf94..41b1ebe 100644 > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/ > layout/JacksonFactory.java > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/ > layout/JacksonFactory.java > @@ -44,10 +44,12 @@ abstract class JacksonFactory { > > private final boolean encodeThreadContextAsList; > private final boolean includeStacktrace; > + private final boolean stacktraceAsString; > > - public JSON(final boolean encodeThreadContextAsList, final > boolean includeStacktrace) { > + public JSON(final boolean encodeThreadContextAsList, final > boolean includeStacktrace, final boolean stacktraceAsString) { > this.encodeThreadContextAsList = encodeThreadContextAsList; > this.includeStacktrace = includeStacktrace; > + this.stacktraceAsString = stacktraceAsString; > } > > @Override > @@ -72,7 +74,7 @@ abstract class JacksonFactory { > > @Override > protected ObjectMapper newObjectMapper() { > - return new Log4jJsonObjectMapper(encodeThreadContextAsList, > includeStacktrace); > + return new Log4jJsonObjectMapper(encodeThreadContextAsList, > includeStacktrace, stacktraceAsString); > } > > @Override > @@ -86,9 +88,12 @@ abstract class JacksonFactory { > static final int DEFAULT_INDENT = 1; > > private final boolean includeStacktrace; > + private final boolean stacktraceAsString; > > - public XML(final boolean includeStacktrace) { > + > + public XML(final boolean includeStacktrace, final boolean > stacktraceAsString) { > this.includeStacktrace = includeStacktrace; > + this.stacktraceAsString = stacktraceAsString; > } > > @Override > @@ -114,7 +119,7 @@ abstract class JacksonFactory { > > @Override > protected ObjectMapper newObjectMapper() { > - return new Log4jXmlObjectMapper(includeStacktrace); > + return new Log4jXmlObjectMapper(includeStacktrace, > stacktraceAsString); > } > > @Override > @@ -126,9 +131,12 @@ abstract class JacksonFactory { > static class YAML extends JacksonFactory { > > private final boolean includeStacktrace; > + private final boolean stacktraceAsString; > + > > - public YAML(final boolean includeStacktrace) { > + public YAML(final boolean includeStacktrace, final boolean > stacktraceAsString) { > this.includeStacktrace = includeStacktrace; > + this.stacktraceAsString = stacktraceAsString; > } > > @Override > @@ -153,7 +161,7 @@ abstract class JacksonFactory { > > @Override > protected ObjectMapper newObjectMapper() { > - return new Log4jYamlObjectMapper(false, includeStacktrace); > + return new Log4jYamlObjectMapper(false, includeStacktrace, > stacktraceAsString); > } > > @Override > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > 0b8f7431/log4j-core/src/main/java/org/apache/logging/log4j/ > core/layout/JsonLayout.java > ---------------------------------------------------------------------- > diff --git > a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/JsonLayout.java > b/log4j-core/src/main/java/org/apache/logging/log4j/core/ > layout/JsonLayout.java > index b15ab5a..acf511f 100644 > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/ > layout/JsonLayout.java > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/ > layout/JsonLayout.java > @@ -85,7 +85,7 @@ public final class JsonLayout extends > AbstractJacksonLayout { > final String headerPattern = toStringOrNull(getHeader()); > final String footerPattern = toStringOrNull(getFooter()); > return new JsonLayout(getConfiguration(), isLocationInfo(), > isProperties(), encodeThreadContextAsList, isComplete(), > - isCompact(), getEventEol(), headerPattern, > footerPattern, getCharset(), isIncludeStacktrace()); > + isCompact(), getEventEol(), headerPattern, > footerPattern, getCharset(), isIncludeStacktrace(), isStacktraceAsString()); > } > > public boolean isPropertiesAsList() { > @@ -101,8 +101,8 @@ public final class JsonLayout extends > AbstractJacksonLayout { > protected JsonLayout(final Configuration config, final boolean > locationInfo, final boolean properties, > final boolean encodeThreadContextAsList, > final boolean complete, final boolean compact, final boolean > eventEol, final String headerPattern, > - final String footerPattern, final Charset charset, final > boolean includeStacktrace) { > - super(config, new JacksonFactory.JSON(encodeThreadContextAsList, > includeStacktrace).newWriter( > + final String footerPattern, final Charset charset, final > boolean includeStacktrace, final boolean stacktraceAsString) { > + super(config, new JacksonFactory.JSON(encodeThreadContextAsList, > includeStacktrace, stacktraceAsString).newWriter( > locationInfo, properties, compact), > charset, compact, complete, eventEol, > PatternLayout.newSerializerBuilder(). > setConfiguration(config).setPattern(headerPattern). > setDefaultPattern(DEFAULT_HEADER).build(), > @@ -191,6 +191,8 @@ public final class JsonLayout extends > AbstractJacksonLayout { > * The character set to use, if {@code null}, uses "UTF-8". > * @param includeStacktrace > * If "true", includes the stacktrace of any Throwable in > the generated JSON, defaults to "true". > + * @param stacktraceAsString > + * If "true", the stacktrace will be rendered as string, > and not nested object, defaults to "false". > * @return A JSON Layout. > * > * @deprecated Use {@link #newBuilder()} instead > @@ -208,12 +210,13 @@ public final class JsonLayout extends > AbstractJacksonLayout { > @PluginAttribute(value = "header", defaultString = > DEFAULT_HEADER) final String headerPattern, > @PluginAttribute(value = "footer", defaultString = > DEFAULT_FOOTER) final String footerPattern, > @PluginAttribute(value = "charset", defaultString = "UTF-8") > final Charset charset, > - @PluginAttribute(value = "includeStacktrace", defaultBoolean > = true) final boolean includeStacktrace > + @PluginAttribute(value = "includeStacktrace", defaultBoolean > = true) final boolean includeStacktrace, > + @PluginAttribute(value = "stacktraceAsString", defaultBoolean > = false) final boolean stacktraceAsString > // @formatter:on > ) { > final boolean encodeThreadContextAsList = properties && > propertiesAsList; > return new JsonLayout(config, locationInfo, properties, > encodeThreadContextAsList, complete, compact, eventEol, > - headerPattern, footerPattern, charset, includeStacktrace); > + headerPattern, footerPattern, charset, includeStacktrace, > stacktraceAsString); > } > > @PluginBuilderFactory > @@ -228,7 +231,7 @@ public final class JsonLayout extends > AbstractJacksonLayout { > */ > public static JsonLayout createDefaultLayout() { > return new JsonLayout(new DefaultConfiguration(), false, false, > false, false, false, false, > - DEFAULT_HEADER, DEFAULT_FOOTER, StandardCharsets.UTF_8, > true); > + DEFAULT_HEADER, DEFAULT_FOOTER, StandardCharsets.UTF_8, > true, false); > } > > @Override > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > 0b8f7431/log4j-core/src/main/java/org/apache/logging/log4j/ > core/layout/XmlLayout.java > ---------------------------------------------------------------------- > diff --git > a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/XmlLayout.java > b/log4j-core/src/main/java/org/apache/logging/log4j/core/ > layout/XmlLayout.java > index 49de181..49641f1 100644 > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/ > layout/XmlLayout.java > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/ > layout/XmlLayout.java > @@ -69,7 +69,7 @@ public final class XmlLayout extends > AbstractJacksonLayout { > @Override > public XmlLayout build() { > return new XmlLayout(getConfiguration(), isLocationInfo(), > isProperties(), isComplete(), > - isCompact(), getCharset(), isIncludeStacktrace()); > + isCompact(), getCharset(), isIncludeStacktrace(), > isStacktraceAsString()); > } > } > > @@ -78,14 +78,14 @@ public final class XmlLayout extends > AbstractJacksonLayout { > */ > @Deprecated > protected XmlLayout(final boolean locationInfo, final boolean > properties, final boolean complete, > - final boolean compact, final Charset charset, > final boolean includeStacktrace) { > - this(null, locationInfo, properties, complete, compact, charset, > includeStacktrace); > + final boolean compact, final Charset charset, > final boolean includeStacktrace, final boolean stacktraceAsString) { > + this(null, locationInfo, properties, complete, compact, charset, > includeStacktrace, stacktraceAsString); > } > > private XmlLayout(final Configuration config, final boolean > locationInfo, final boolean properties, > final boolean complete, final boolean compact, > final Charset charset, > - final boolean includeStacktrace) { > - super(config, new JacksonFactory.XML( > includeStacktrace).newWriter( > + final boolean includeStacktrace, final boolean > stacktraceAsString) { > + super(config, new JacksonFactory.XML(includeStacktrace, > stacktraceAsString).newWriter( > locationInfo, properties, compact), charset, compact, > complete, false, null, null); > } > > @@ -165,6 +165,7 @@ public final class XmlLayout extends > AbstractJacksonLayout { > * @param charset The character set to use, if {@code null}, uses > "UTF-8". > * @param includeStacktrace > * If "true", includes the stacktrace of any Throwable in > the generated XML, defaults to "true". > + * @param stacktraceAsString If "true", the stacktrace will be > rendered as string, and not nested object, defaults to "false". > * @return An XML Layout. > * > * @deprecated Use {@link #newBuilder()} instead > @@ -177,10 +178,12 @@ public final class XmlLayout extends > AbstractJacksonLayout { > @PluginAttribute(value = "complete") final boolean complete, > @PluginAttribute(value = "compact") final boolean compact, > @PluginAttribute(value = "charset", defaultString = "UTF-8") > final Charset charset, > - @PluginAttribute(value = "includeStacktrace", defaultBoolean > = true) final boolean includeStacktrace) > + @PluginAttribute(value = "includeStacktrace", defaultBoolean > = true) final boolean includeStacktrace, > + @PluginAttribute(value = "stacktraceAsString", defaultBoolean > = false) final boolean stacktraceAsString > + ) > // @formatter:on > { > - return new XmlLayout(null, locationInfo, properties, complete, > compact, charset, includeStacktrace); > + return new XmlLayout(null, locationInfo, properties, complete, > compact, charset, includeStacktrace, stacktraceAsString); > } > > @PluginBuilderFactory > @@ -194,6 +197,6 @@ public final class XmlLayout extends > AbstractJacksonLayout { > * @return an XML Layout. > */ > public static XmlLayout createDefaultLayout() { > - return new XmlLayout(null, false, false, false, false, > StandardCharsets.UTF_8, true); > + return new XmlLayout(null, false, false, false, false, > StandardCharsets.UTF_8, true, false); > } > } > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > 0b8f7431/log4j-core/src/main/java/org/apache/logging/log4j/ > core/layout/YamlLayout.java > ---------------------------------------------------------------------- > diff --git > a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/YamlLayout.java > b/log4j-core/src/main/java/org/apache/logging/log4j/core/ > layout/YamlLayout.java > index bf8786b..40188b3 100644 > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/ > layout/YamlLayout.java > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/ > layout/YamlLayout.java > @@ -62,14 +62,14 @@ public final class YamlLayout extends > AbstractJacksonLayout { > final String headerPattern = toStringOrNull(getHeader()); > final String footerPattern = toStringOrNull(getFooter()); > return new YamlLayout(getConfiguration(), isLocationInfo(), > isProperties(), isComplete(), > - isCompact(), getEventEol(), headerPattern, footerPattern, > getCharset(), isIncludeStacktrace()); > + isCompact(), getEventEol(), headerPattern, footerPattern, > getCharset(), isIncludeStacktrace(), isStacktraceAsString()); > } > } > > protected YamlLayout(final Configuration config, final boolean > locationInfo, final boolean properties, > final boolean complete, final boolean compact, final boolean > eventEol, final String headerPattern, > - final String footerPattern, final Charset charset, final > boolean includeStacktrace) { > - super(config, new JacksonFactory.YAML( > includeStacktrace).newWriter(locationInfo, properties, compact), charset, > compact, > + final String footerPattern, final Charset charset, final > boolean includeStacktrace, final boolean stacktraceAsString) { > + super(config, new JacksonFactory.YAML(includeStacktrace, > stacktraceAsString).newWriter(locationInfo, properties, compact), > charset, compact, > complete, eventEol, > PatternLayout.newSerializerBuilder(). > setConfiguration(config).setPattern(headerPattern). > setDefaultPattern(DEFAULT_HEADER).build(), > PatternLayout.newSerializerBuilder(). > setConfiguration(config).setPattern(footerPattern). > setDefaultPattern(DEFAULT_FOOTER).build()); > @@ -146,6 +146,8 @@ public final class YamlLayout extends > AbstractJacksonLayout { > * The character set to use, if {@code null}, uses "UTF-8". > * @param includeStacktrace > * If "true", includes the stacktrace of any Throwable in > the generated YAML, defaults to "true". > + * @param stacktraceAsString > + * If "true", the stacktrace will be rendered as string, > and not nested object, defaults to "false". > * @return A YAML Layout. > * > * @deprecated Use {@link #newBuilder()} instead > @@ -159,11 +161,12 @@ public final class YamlLayout extends > AbstractJacksonLayout { > @PluginAttribute(value = "header", defaultString = > DEFAULT_HEADER) final String headerPattern, > @PluginAttribute(value = "footer", defaultString = > DEFAULT_FOOTER) final String footerPattern, > @PluginAttribute(value = "charset", defaultString = "UTF-8") > final Charset charset, > - @PluginAttribute(value = "includeStacktrace", defaultBoolean > = true) final boolean includeStacktrace > + @PluginAttribute(value = "includeStacktrace", defaultBoolean > = true) final boolean includeStacktrace, > + @PluginAttribute(value = "stacktraceAsString", defaultBoolean > = false) final boolean stacktraceAsString > // @formatter:on > ) { > return new YamlLayout(config, locationInfo, properties, false, > false, true, headerPattern, footerPattern, > - charset, includeStacktrace); > + charset, includeStacktrace, stacktraceAsString); > } > > @PluginBuilderFactory > @@ -178,6 +181,6 @@ public final class YamlLayout extends > AbstractJacksonLayout { > */ > public static AbstractJacksonLayout createDefaultLayout() { > return new YamlLayout(new DefaultConfiguration(), false, false, > false, false, false, DEFAULT_HEADER, > - DEFAULT_FOOTER, StandardCharsets.UTF_8, true); > + DEFAULT_FOOTER, StandardCharsets.UTF_8, true, false); > } > } > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > 0b8f7431/log4j-core/src/test/java/org/apache/logging/log4j/ > MarkerMixInXmlTest.java > ---------------------------------------------------------------------- > diff --git > a/log4j-core/src/test/java/org/apache/logging/log4j/MarkerMixInXmlTest.java > b/log4j-core/src/test/java/org/apache/logging/log4j/ > MarkerMixInXmlTest.java > index 3b80811..963d3f6 100644 > --- a/log4j-core/src/test/java/org/apache/logging/log4j/ > MarkerMixInXmlTest.java > +++ b/log4j-core/src/test/java/org/apache/logging/log4j/ > MarkerMixInXmlTest.java > @@ -28,7 +28,7 @@ public class MarkerMixInXmlTest extends MarkerMixInTest { > > @Override > protected ObjectMapper newObjectMapper() { > - return new Log4jXmlObjectMapper(true); > + return new Log4jXmlObjectMapper(true, false); > } > > } > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > 0b8f7431/log4j-core/src/test/java/org/apache/logging/log4j/core/jackson/ > LevelMixInJsonTest.java > ---------------------------------------------------------------------- > diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/ > jackson/LevelMixInJsonTest.java b/log4j-core/src/test/java/ > org/apache/logging/log4j/core/jackson/LevelMixInJsonTest.java > index 8b6e23d..87eab6b 100644 > --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/ > jackson/LevelMixInJsonTest.java > +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/ > jackson/LevelMixInJsonTest.java > @@ -26,7 +26,7 @@ public class LevelMixInJsonTest extends LevelMixInTest { > > @Override > protected ObjectMapper newObjectMapper() { > - return new Log4jJsonObjectMapper(false, true); > + return new Log4jJsonObjectMapper(false, true, false); > } > > } > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > 0b8f7431/log4j-core/src/test/java/org/apache/logging/log4j/core/jackson/ > StackTraceElementMixInTest.java > ---------------------------------------------------------------------- > diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/ > jackson/StackTraceElementMixInTest.java b/log4j-core/src/test/java/ > org/apache/logging/log4j/core/jackson/StackTraceElementMixInTest.java > index 38d943b..aec001c 100644 > --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/jackson/ > StackTraceElementMixInTest.java > +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/jackson/ > StackTraceElementMixInTest.java > @@ -81,7 +81,7 @@ public class StackTraceElementMixInTest { > public void testFromJsonWithLog4jModule() throws Exception { > final ObjectMapper mapper = new ObjectMapper(); > final boolean encodeThreadContextAsList = false; > - final SimpleModule module = new > Log4jJsonModule(encodeThreadContextAsList, > true); > + final SimpleModule module = new > Log4jJsonModule(encodeThreadContextAsList, > true, false); > module.addDeserializer(StackTraceElement.class, new > Log4jStackTraceElementDeserializer()); > mapper.registerModule(module); > final StackTraceElement expected = new > StackTraceElement("package.SomeClass", > "someMethod", "SomeClass.java", 123); > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > 0b8f7431/log4j-core/src/test/java/org/apache/logging/log4j/ > core/layout/JsonLayoutTest.java > ---------------------------------------------------------------------- > diff --git > a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/JsonLayoutTest.java > b/log4j-core/src/test/java/org/apache/logging/log4j/core/ > layout/JsonLayoutTest.java > index b458054..e1da716 100644 > --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/ > layout/JsonLayoutTest.java > +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/ > layout/JsonLayoutTest.java > @@ -142,7 +142,7 @@ public class JsonLayoutTest { > assertEquals(str, !compact || eventEol, str.contains("\n")); > assertEquals(str, locationInfo, str.contains("source")); > assertEquals(str, includeContext, str.contains("contextMap")); > - final Log4jLogEvent actual = new > Log4jJsonObjectMapper(contextMapAslist, > includeStacktrace).readValue(str, Log4jLogEvent.class); > + final Log4jLogEvent actual = new > Log4jJsonObjectMapper(contextMapAslist, > includeStacktrace, false).readValue(str, Log4jLogEvent.class); > LogEventFixtures.assertEqualLogEvents(expected, actual, > locationInfo, includeContext, includeStacktrace); > if (includeContext) { > this.checkMapEntry("MDC.A", "A_Value", compact, str, > contextMapAslist); > @@ -340,7 +340,7 @@ public class JsonLayoutTest { > // @formatter:on > final String str = layout.toSerializable(expected); > assertTrue(str, str.contains("\"loggerName\":\"a.B\"")); > - final Log4jLogEvent actual = new > Log4jJsonObjectMapper(propertiesAsList, > true).readValue(str, Log4jLogEvent.class); > + final Log4jLogEvent actual = new > Log4jJsonObjectMapper(propertiesAsList, > true, false).readValue(str, Log4jLogEvent.class); > assertEquals(expected.getLoggerName(), actual.getLoggerName()); > assertEquals(expected, actual); > } > @@ -370,6 +370,30 @@ public class JsonLayoutTest { > this.testAllFeatures(false, false, false, false, false, false); > } > > + @Test > + public void testStacktraceAsString() throws Exception { > + final String str = prepareJSONForStacktraceTests(true); > + assertTrue(str, str.contains("\"extendedStackTrace\":\"")); > + } > + > + @Test > + public void testStacktraceAsMap() throws Exception { > + final String str = prepareJSONForStacktraceTests(false); > + assertTrue(str, str.contains("\"extendedStackTrace\":[")); > + } > + > + private String prepareJSONForStacktraceTests(final boolean > stacktraceAsString) { > + final Log4jLogEvent expected = LogEventFixtures.createLogEvent(); > + // @formatter:off > + final AbstractJacksonLayout layout = JsonLayout.newBuilder() > + .setCompact(true) > + .setIncludeStacktrace(true) > + .setStacktraceAsString(stacktraceAsString) > + .build(); > + // @formatter:off > + return layout.toSerializable(expected); > + } > + > private String toPropertySeparator(final boolean compact) { > return compact ? ":" : " : "; > } > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > 0b8f7431/log4j-core/src/test/java/org/apache/logging/log4j/ > core/layout/XmlLayoutTest.java > ---------------------------------------------------------------------- > diff --git > a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/XmlLayoutTest.java > b/log4j-core/src/test/java/org/apache/logging/log4j/core/ > layout/XmlLayoutTest.java > index 0e6595c..bf367e5 100644 > --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/ > layout/XmlLayoutTest.java > +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/ > layout/XmlLayoutTest.java > @@ -128,7 +128,7 @@ public class XmlLayoutTest { > private void testAllFeatures(final boolean includeSource, final > boolean compact, final boolean includeContext, final boolean > includeStacktrace) throws IOException, > JsonParseException, JsonMappingException { > final Log4jLogEvent expected = LogEventFixtures.createLogEvent(); > - final XmlLayout layout = XmlLayout.createLayout(includeSource, > includeContext, false, compact, StandardCharsets.UTF_8, includeStacktrace); > + final XmlLayout layout = XmlLayout.createLayout(includeSource, > includeContext, false, compact, StandardCharsets.UTF_8, includeStacktrace, > false); > final String str = layout.toSerializable(expected); > // System.out.println(str); > assertEquals(str, !compact, str.contains("\n")); > @@ -222,7 +222,7 @@ public class XmlLayoutTest { > this.rootLogger.removeAppender(appender); > } > // set up appender > - final XmlLayout layout = XmlLayout.createLayout(true, true, true, > false, null, true); > + final XmlLayout layout = XmlLayout.createLayout(true, true, true, > false, null, true, false); > final ListAppender appender = new ListAppender("List", null, > layout, true, false); > appender.start(); > > @@ -271,7 +271,7 @@ public class XmlLayoutTest { > > @Test > public void testLayoutLoggerName() { > - final XmlLayout layout = XmlLayout.createLayout(false, true, > true, false, null, true); > + final XmlLayout layout = XmlLayout.createLayout(false, true, > true, false, null, true, false); > final Log4jLogEvent event = Log4jLogEvent.newBuilder() // > .setLoggerName("a.B") // > .setLoggerFqcn("f.q.c.n") // > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > 0b8f7431/log4j-core/src/test/java/org/apache/logging/log4j/ > core/layout/YamlLayoutTest.java > ---------------------------------------------------------------------- > diff --git > a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/YamlLayoutTest.java > b/log4j-core/src/test/java/org/apache/logging/log4j/core/ > layout/YamlLayoutTest.java > index 97493a4..2e8c1d1 100644 > --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/ > layout/YamlLayoutTest.java > +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/ > layout/YamlLayoutTest.java > @@ -116,14 +116,14 @@ public class YamlLayoutTest { > final boolean includeContext, final boolean contextMapAslist, > final boolean includeStacktrace) throws Exception { > final Log4jLogEvent expected = LogEventFixtures.createLogEvent(); > final AbstractJacksonLayout layout = > YamlLayout.createLayout(null, includeSource, includeContext, null, null, > - StandardCharsets.UTF_8, includeStacktrace); > + StandardCharsets.UTF_8, includeStacktrace, false); > final String str = layout.toSerializable(expected); > // System.out.println(str); > // Just check for \n since \r might or might not be there. > assertEquals(str, !compact || eventEol, str.contains("\n")); > assertEquals(str, includeSource, str.contains("source")); > assertEquals(str, includeContext, str.contains("contextMap")); > - final Log4jLogEvent actual = new > Log4jYamlObjectMapper(contextMapAslist, > includeStacktrace).readValue(str, Log4jLogEvent.class); > + final Log4jLogEvent actual = new > Log4jYamlObjectMapper(contextMapAslist, > includeStacktrace,false).readValue(str, Log4jLogEvent.class); > LogEventFixtures.assertEqualLogEvents(expected, actual, > includeSource, includeContext, includeStacktrace); > if (includeContext) { > this.checkMapEntry("MDC.A", "A_Value", compact, str); > @@ -195,7 +195,7 @@ public class YamlLayoutTest { > } > final Configuration configuration = rootLogger.getContext(). > getConfiguration(); > // set up appender > - final AbstractJacksonLayout layout = > YamlLayout.createLayout(configuration, > true, true, null, null, null, true); > + final AbstractJacksonLayout layout = > YamlLayout.createLayout(configuration, > true, true, null, null, null, true, false); > final ListAppender appender = new ListAppender("List", null, > layout, true, false); > appender.start(); > > @@ -231,7 +231,7 @@ public class YamlLayoutTest { > final Configuration configuration = rootLogger.getContext(). > getConfiguration(); > // set up appender > // Use [[ and ]] to test header and footer (instead of [ and ]) > - final AbstractJacksonLayout layout = > YamlLayout.createLayout(configuration, > true, true, "[[", "]]", null, true); > + final AbstractJacksonLayout layout = > YamlLayout.createLayout(configuration, > true, true, "[[", "]]", null, true, false); > final ListAppender appender = new ListAppender("List", null, > layout, true, false); > appender.start(); > > @@ -270,7 +270,7 @@ public class YamlLayoutTest { > @Test > public void testLayoutLoggerName() throws Exception { > final AbstractJacksonLayout layout = > YamlLayout.createLayout(null, false, false, null, null, > - StandardCharsets.UTF_8, true); > + StandardCharsets.UTF_8, true, false); > final Log4jLogEvent expected = Log4jLogEvent.newBuilder() // > .setLoggerName("a.B") // > .setLoggerFqcn("f.q.c.n") // > @@ -280,7 +280,7 @@ public class YamlLayoutTest { > .setTimeMillis(1).build(); > final String str = layout.toSerializable(expected); > assertTrue(str, str.contains("loggerName: \"a.B\"")); > - final Log4jLogEvent actual = new Log4jYamlObjectMapper(false, > true).readValue(str, Log4jLogEvent.class); > + final Log4jLogEvent actual = new Log4jYamlObjectMapper(false, > true, false).readValue(str, Log4jLogEvent.class); > assertEquals(expected.getLoggerName(), actual.getLoggerName()); > assertEquals(expected, actual); > } > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > 0b8f7431/src/site/xdoc/manual/layouts.xml.vm > ---------------------------------------------------------------------- > diff --git a/src/site/xdoc/manual/layouts.xml.vm b/src/site/xdoc/manual/ > layouts.xml.vm > index 6325c01..d7eaa6b 100644 > --- a/src/site/xdoc/manual/layouts.xml.vm > +++ b/src/site/xdoc/manual/layouts.xml.vm > @@ -449,6 +449,11 @@ logger.debug("one={}, two={}, three={}", 1, 2, 3); > <td>boolean</td> > <td>If true, include full stacktrace of any logged > #javadoc('java/lang', 'Throwable') (optional, default to true).</td> > </tr> > + <tr> > + <td>stacktraceAsString</td> > + <td>boolean</td> > + <td>Whether to format the stackstrace as a string, and not > a nested object (optional, defaults to false).</td> > + </tr> > <caption align="top">JsonLayout Parameters</caption> > </table> > <p> > @@ -2178,6 +2183,11 @@ at org.apache.logging.log4j.core. > pattern.ExtendedThrowableTest.testException(Ext > <td>boolean</td> > <td>If true, include full stacktrace of any logged > #javadoc('java/lang', 'Throwable') (optional, default to true).</td> > </tr> > + <tr> > + <td>stacktraceAsString</td> > + <td>boolean</td> > + <td>Whether to format the stackstrace as a string, and not > a nested object (optional, defaults to false).</td> > + </tr> > <caption align="top">XmlLayout Parameters</caption> > </table> > <p> > @@ -2262,6 +2272,11 @@ source: > <td>boolean</td> > <td>If true, include full stacktrace of any logged > #javadoc('java/lang', 'Throwable') (optional, default to true).</td> > </tr> > + <tr> > + <td>stacktraceAsString</td> > + <td>boolean</td> > + <td>Whether to format the stackstrace as a string, and not > a nested object (optional, defaults to false).</td> > + </tr> > <caption align="top">YamlLayout Parameters</caption> > </table> > <p> > >
