This is an automated email from the ASF dual-hosted git repository.
rgoers pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
The following commit(s) were added to refs/heads/master by this push:
new 4fea4ff LOG4J2-2588 - Add option to restore printing timeMillis in
the JsonLayout.
4fea4ff is described below
commit 4fea4ff5c08a31801b4f728055e09262606e7679
Author: Ralph Goers <[email protected]>
AuthorDate: Sun Apr 19 14:21:44 2020 -0700
LOG4J2-2588 - Add option to restore printing timeMillis in the JsonLayout.
---
.../jackson/json/layout/JsonJacksonFactory.java | 10 +++
.../log4j/jackson/json/layout/JsonLayout.java | 8 +--
.../jackson/json/layout/JsonLayoutMillisTest.java | 74 ++++++++++++++++++++++
.../resources/log4j2-json-layout-timestamp.xml | 31 +++++++++
.../jackson/xml/layout/XmlJacksonFactory.java | 10 +++
.../log4j/jackson/xml/layout/XmlLayout.java | 8 +--
.../log4j/jackson/yaml/layout/YamlConstants.java | 1 +
.../jackson/yaml/layout/YamlJacksonFactory.java | 10 +++
.../log4j/jackson/yaml/layout/YamlLayout.java | 8 +--
.../log4j/jackson/AbstractJacksonFactory.java | 14 +++-
.../log4j/jackson/AbstractJacksonLayout.java | 17 +++++
.../logging/log4j/jackson/JsonConstants.java | 1 +
.../logging/log4j/jackson/LogEventJsonMixIn.java | 2 +-
.../jackson/LogEventWithContextListMixIn.java | 2 +-
.../apache/logging/log4j/jackson/XmlConstants.java | 1 +
src/changes/changes.xml | 3 +
src/site/asciidoc/manual/layouts.adoc | 5 ++
17 files changed, 189 insertions(+), 16 deletions(-)
diff --git
a/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/layout/JsonJacksonFactory.java
b/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/layout/JsonJacksonFactory.java
index 215db50..5ba38f9 100644
---
a/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/layout/JsonJacksonFactory.java
+++
b/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/layout/JsonJacksonFactory.java
@@ -27,6 +27,16 @@ class JsonJacksonFactory extends AbstractJacksonFactory {
}
@Override
+ protected String getPropertyNameForTimeMillis() {
+ return JsonConstants.ELT_TIME_MILLIS;
+ }
+
+ @Override
+ protected String getPropertyNameForInstant() {
+ return JsonConstants.ELT_INSTANT;
+ }
+
+ @Override
protected String getPropertyNameForNanoTime() {
return JsonConstants.ELT_NANO_TIME;
}
diff --git
a/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/layout/JsonLayout.java
b/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/layout/JsonLayout.java
index bbdb22d..f2485e4 100644
---
a/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/layout/JsonLayout.java
+++
b/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/layout/JsonLayout.java
@@ -99,7 +99,7 @@ public final class JsonLayout extends AbstractJacksonLayout {
final String footerPattern = toStringOrNull(getFooter());
return new JsonLayout(getConfiguration(), isLocationInfo(),
isProperties(), encodeThreadContextAsList,
isComplete(), isCompact(), getEventEol(), getEndOfLine(),
headerPattern, footerPattern, getCharset(),
- isIncludeStacktrace(), isStacktraceAsString(),
isIncludeNullDelimiter(),
+ isIncludeStacktrace(), isStacktraceAsString(),
isIncludeNullDelimiter(), isIncludeTimeMillis(),
getAdditionalFields(), getObjectMessageAsJsonObject());
}
@@ -168,7 +168,7 @@ public final class JsonLayout extends AbstractJacksonLayout
{
*/
public static JsonLayout createDefaultLayout() {
return new JsonLayout(new DefaultConfiguration(), false, false, false,
false, false, false, null,
- DEFAULT_HEADER, DEFAULT_FOOTER, StandardCharsets.UTF_8, true,
false, false, null, false);
+ DEFAULT_HEADER, DEFAULT_FOOTER, StandardCharsets.UTF_8, true,
false, false, false, null, false);
}
@PluginFactory
@@ -181,10 +181,10 @@ public final class JsonLayout extends
AbstractJacksonLayout {
final boolean complete, final boolean compact, final
boolean eventEol, final String endOfLine,
final String headerPattern, final String footerPattern,
final Charset charset,
final boolean includeStacktrace, final boolean
stacktraceAsString,
- final boolean includeNullDelimiter,
+ final boolean includeNullDelimiter, final boolean
includeTimeMillis,
final KeyValuePair[] additionalFields, final boolean
objectMessageAsJsonObject) {
super(config, new JsonJacksonFactory(encodeThreadContextAsList,
includeStacktrace, stacktraceAsString, objectMessageAsJsonObject).newWriter(
- locationInfo, properties, compact),
+ locationInfo, properties, compact, includeTimeMillis),
charset, compact, complete, eventEol, endOfLine,
PatternLayout.newSerializerBuilder().setConfiguration(config).setPattern(headerPattern).setDefaultPattern(DEFAULT_HEADER).build(),
PatternLayout.newSerializerBuilder().setConfiguration(config).setPattern(footerPattern).setDefaultPattern(DEFAULT_FOOTER).build(),
diff --git
a/log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/layout/JsonLayoutMillisTest.java
b/log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/layout/JsonLayoutMillisTest.java
new file mode 100644
index 0000000..2ec062d
--- /dev/null
+++
b/log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/layout/JsonLayoutMillisTest.java
@@ -0,0 +1,74 @@
+/*
+ * 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.jackson.json.layout;
+
+import org.apache.logging.log4j.categories.Layouts;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.Logger;
+import org.apache.logging.log4j.junit.LoggerContextRule;
+import org.apache.logging.log4j.test.appender.ListAppender;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Tests the JsonLayout class with millis.
+ */
+@Category(Layouts.Json.class)
+public class JsonLayoutMillisTest {
+
+ private static final String CONFIG = "log4j2-json-layout-timestamp.xml";
+
+ private ListAppender app;
+
+ @Rule
+ public LoggerContextRule context = new LoggerContextRule(CONFIG);
+
+ private Logger logger;
+
+ private void assertEventCount(final List<LogEvent> events, final int
expected) {
+ assertEquals("Incorrect number of events.", expected, events.size());
+ }
+
+ @Before
+ public void before() {
+ logger = context.getLogger("LayoutTest");
+ //
+ app = context.getListAppender("List").clear();
+ }
+
+ @Test
+ public void testTimestamp() {
+ logger.info("This is a test message");
+ List<String> message = app.getMessages();
+ assertTrue("No messages", message != null && message.size() > 0);
+ String json = message.get(0);
+ System.out.println(json);
+ assertNotNull("No JSON message", json);
+ assertTrue("No timestamp", json.contains("\"timeMillis\":"));
+ assertFalse("Instant is present", json.contains("instant:"));
+ }
+
+}
diff --git
a/log4j-layout-jackson-json/src/test/resources/log4j2-json-layout-timestamp.xml
b/log4j-layout-jackson-json/src/test/resources/log4j2-json-layout-timestamp.xml
new file mode 100644
index 0000000..7e199d1
--- /dev/null
+++
b/log4j-layout-jackson-json/src/test/resources/log4j2-json-layout-timestamp.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+
+-->
+<Configuration status="INFO" packages="">
+ <Appenders>
+ <List name="List">
+ <JsonLayout compact="true" eventEol="true"
includeTimeMillis="true"/>
+ </List>
+ </Appenders>
+
+ <Loggers>
+ <Root level="INFO">
+ <AppenderRef ref="List"/>
+ </Root>
+ </Loggers>
+</Configuration>
diff --git
a/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/layout/XmlJacksonFactory.java
b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/layout/XmlJacksonFactory.java
index d291cd0..616e48a 100644
---
a/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/layout/XmlJacksonFactory.java
+++
b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/layout/XmlJacksonFactory.java
@@ -22,6 +22,16 @@ class XmlJacksonFactory extends AbstractJacksonFactory {
}
@Override
+ protected String getPropertyNameForTimeMillis() {
+ return XmlConstants.ELT_TIME_MILLIS;
+ }
+
+ @Override
+ protected String getPropertyNameForInstant() {
+ return XmlConstants.ELT_INSTANT;
+ }
+
+ @Override
protected String getPropertyNameForNanoTime() {
return JsonConstants.ELT_NANO_TIME;
}
diff --git
a/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/layout/XmlLayout.java
b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/layout/XmlLayout.java
index 312761f..2072ff1 100644
---
a/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/layout/XmlLayout.java
+++
b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/layout/XmlLayout.java
@@ -78,7 +78,7 @@ public final class XmlLayout extends AbstractJacksonLayout {
public XmlLayout build() {
return new XmlLayout(getConfiguration(), isLocationInfo(),
isProperties(), isComplete(), isCompact(),
getCharset(), isIncludeStacktrace(),
isStacktraceAsString(), isIncludeNullDelimiter(),
- getAdditionalFields());
+ isIncludeNullDelimiter(), getAdditionalFields());
}
}
@@ -106,7 +106,7 @@ 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, false, false, null);
+ return new XmlLayout(null, false, false, false, false,
StandardCharsets.UTF_8, true, false, false, false, null);
}
@PluginFactory
@@ -116,11 +116,11 @@ public final class XmlLayout extends
AbstractJacksonLayout {
private XmlLayout(final Configuration config, final boolean locationInfo,
final boolean properties,
final boolean complete, final boolean compact, final Charset
charset, final boolean includeStacktrace,
- final boolean stacktraceAsString, final boolean
includeNullDelimiter,
+ final boolean stacktraceAsString, final boolean
includeNullDelimiter, final boolean includeTimeMillis,
final KeyValuePair[] additionalFields) {
super(config,
new XmlJacksonFactory(includeStacktrace,
stacktraceAsString).newWriter(locationInfo, properties,
- compact),
+ compact, includeTimeMillis),
charset, compact, complete, false, null, null,
includeNullDelimiter, additionalFields);
}
diff --git
a/log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/layout/YamlConstants.java
b/log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/layout/YamlConstants.java
index 856a201..f93c379 100644
---
a/log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/layout/YamlConstants.java
+++
b/log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/layout/YamlConstants.java
@@ -32,4 +32,5 @@ public class YamlConstants {
static final String ELT_EXTENDED_STACK_TRACE = "extendedStackTrace";
static final String ELT_NANO_TIME = "nanoTime";
static final String ELT_INSTANT = "instant";
+ static final String ELT_TIME_MILLIS = "timeMillis";
}
diff --git
a/log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/layout/YamlJacksonFactory.java
b/log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/layout/YamlJacksonFactory.java
index 76d1fda..a55365d 100644
---
a/log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/layout/YamlJacksonFactory.java
+++
b/log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/layout/YamlJacksonFactory.java
@@ -37,6 +37,16 @@ class YamlJacksonFactory extends AbstractJacksonFactory {
}
@Override
+ protected String getPropertyNameForTimeMillis() {
+ return YamlConstants.ELT_TIME_MILLIS;
+ }
+
+ @Override
+ protected String getPropertyNameForInstant() {
+ return YamlConstants.ELT_INSTANT;
+ }
+
+ @Override
protected String getPropertyNameForNanoTime() {
return YamlConstants.ELT_NANO_TIME;
}
diff --git
a/log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/layout/YamlLayout.java
b/log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/layout/YamlLayout.java
index 7bdfbfb..e0f3c1e 100644
---
a/log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/layout/YamlLayout.java
+++
b/log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/layout/YamlLayout.java
@@ -70,7 +70,7 @@ public final class YamlLayout extends AbstractJacksonLayout {
final String footerPattern = toStringOrNull(getFooter());
return new YamlLayout(getConfiguration(), isLocationInfo(),
isProperties(), isComplete(), isCompact(),
getEventEol(), headerPattern, footerPattern, getCharset(),
isIncludeStacktrace(),
- isStacktraceAsString(), isIncludeNullDelimiter(),
getAdditionalFields());
+ isStacktraceAsString(), isIncludeNullDelimiter(),
isIncludeTimeMillis(), getAdditionalFields());
}
}
@@ -109,7 +109,7 @@ 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, false, false,
null);
+ DEFAULT_FOOTER, StandardCharsets.UTF_8, true, false, false,
false, null);
}
@PluginFactory
@@ -120,11 +120,11 @@ public final class YamlLayout extends
AbstractJacksonLayout {
private 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,
- final boolean stacktraceAsString, final boolean
includeNullDelimiter,
+ final boolean stacktraceAsString, final boolean
includeNullDelimiter, final boolean includeTimeMillis,
final KeyValuePair[] additionalFields) {
super(config,
new YamlJacksonFactory(includeStacktrace,
stacktraceAsString).newWriter(locationInfo, properties,
- compact),
+ compact, includeTimeMillis),
charset, compact, complete, eventEol,
PatternLayout.newSerializerBuilder().setConfiguration(config).setPattern(headerPattern)
.setDefaultPattern(DEFAULT_HEADER).build(),
diff --git
a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/AbstractJacksonFactory.java
b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/AbstractJacksonFactory.java
index ad4503c..ba56e3f 100644
---
a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/AbstractJacksonFactory.java
+++
b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/AbstractJacksonFactory.java
@@ -40,6 +40,10 @@ public abstract class AbstractJacksonFactory {
abstract protected String getPropertyNameForContextMap();
+ abstract protected String getPropertyNameForTimeMillis();
+
+ abstract protected String getPropertyNameForInstant();
+
abstract protected String getPropertyNameForNanoTime();
abstract protected String getPropertyNameForSource();
@@ -52,9 +56,10 @@ public abstract class AbstractJacksonFactory {
abstract protected PrettyPrinter newPrettyPrinter();
- public ObjectWriter newWriter(final boolean locationInfo, final boolean
properties, final boolean compact) {
+ public ObjectWriter newWriter(final boolean locationInfo, final boolean
properties, final boolean compact,
+ final boolean includeMillis) {
final SimpleFilterProvider filters = new SimpleFilterProvider();
- final Set<String> except = new HashSet<>(4);
+ final Set<String> except = new HashSet<>(5);
if (!locationInfo) {
except.add(this.getPropertyNameForSource());
}
@@ -64,6 +69,11 @@ public abstract class AbstractJacksonFactory {
if (!includeStacktrace) {
except.add(this.getPropertyNameForStackTrace());
}
+ if (includeMillis) {
+ except.add(getPropertyNameForInstant());
+ } else {
+ except.add(getPropertyNameForTimeMillis());
+ }
except.add(this.getPropertyNameForNanoTime());
filters.addFilter(Log4jLogEvent.class.getName(),
SimpleBeanPropertyFilter.serializeAllExcept(except));
final ObjectWriter writer = this.newObjectMapper()
diff --git
a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/AbstractJacksonLayout.java
b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/AbstractJacksonLayout.java
index 5a28f45..bbddb7a 100644
---
a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/AbstractJacksonLayout.java
+++
b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/AbstractJacksonLayout.java
@@ -73,6 +73,9 @@ public abstract class AbstractJacksonLayout extends
AbstractStringLayout {
@PluginBuilderAttribute
private boolean includeNullDelimiter = false;
+ @PluginBuilderAttribute
+ private boolean includeTimeMillis = false;
+
@PluginElement("AdditionalField")
private KeyValuePair[] additionalFields;
@@ -100,6 +103,10 @@ public abstract class AbstractJacksonLayout extends
AbstractStringLayout {
return includeNullDelimiter;
}
+ public boolean isIncludeTimeMillis() {
+ return includeTimeMillis;
+ }
+
/**
* If "true", includes the stack trace of any Throwable in the
generated data, defaults to "true".
*
@@ -162,6 +169,16 @@ public abstract class AbstractJacksonLayout extends
AbstractStringLayout {
}
/**
+ * Whether to include the timestamp (in addition to the Instant)
(optional, default to false).
+ *
+ * @return this builder
+ */
+ public B setIncludeTimeMillis(final boolean includeTimeMillis) {
+ this.includeTimeMillis = includeTimeMillis;
+ return asBuilder();
+ }
+
+ /**
* If "true", includes the stacktrace of any Throwable in the
generated JSON, defaults to "true".
*
* @param includeStacktrace
diff --git
a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/JsonConstants.java
b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/JsonConstants.java
index 1db6f52..e28941b 100644
---
a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/JsonConstants.java
+++
b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/JsonConstants.java
@@ -33,4 +33,5 @@ public final class JsonConstants {
public static final String ELT_EXTENDED_STACK_TRACE = "extendedStackTrace";
public static final String ELT_NANO_TIME = "nanoTime";
public static final String ELT_INSTANT = "instant";
+ public static final String ELT_TIME_MILLIS = "timeMillis";
}
diff --git
a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/LogEventJsonMixIn.java
b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/LogEventJsonMixIn.java
index 8061e24..5ffab97 100644
---
a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/LogEventJsonMixIn.java
+++
b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/LogEventJsonMixIn.java
@@ -119,7 +119,7 @@ public abstract class LogEventJsonMixIn /* extends
AbstractLogEventMixIn */ impl
@Override
public abstract ThrowableProxy getThrownProxy();
- @JsonIgnore // ignore from 2.11
+ @JsonProperty(JsonConstants.ELT_TIME_MILLIS)
@Override
public abstract long getTimeMillis();
diff --git
a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/LogEventWithContextListMixIn.java
b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/LogEventWithContextListMixIn.java
index 8c0fe5a..6c253e2 100644
---
a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/LogEventWithContextListMixIn.java
+++
b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/LogEventWithContextListMixIn.java
@@ -103,7 +103,7 @@ abstract class LogEventWithContextListMixIn implements
LogEvent {
@Override
public abstract ThrowableProxy getThrownProxy();
- @JsonIgnore // ignore from 2.11
+ @JsonProperty(JsonConstants.ELT_TIME_MILLIS)
@Override
public abstract long getTimeMillis();
diff --git
a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/XmlConstants.java
b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/XmlConstants.java
index 10dc37d..f736ca8 100644
---
a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/XmlConstants.java
+++
b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/XmlConstants.java
@@ -27,6 +27,7 @@ public final class XmlConstants {
public static final String ELT_EVENT = "Event";
public static final String ELT_EXTENDED_STACK_TRACE = "ExtendedStackTrace";
public static final String ELT_EXTENDED_STACK_TRACE_ITEM =
"ExtendedStackTraceItem";
+ public static final String ELT_TIME_MILLIS = "TimeMillis";
public static final String ELT_INSTANT = "Instant";
public static final String ELT_MARKER = "Marker";
public static final String ELT_MESSAGE = "Message";
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 0afccfc..1769071 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -169,6 +169,9 @@
</action>
</release>
<release version="2.13.2" date="2020-MM-DD" description="GA Release
2.13.2">
+ <action issue="LOG4J2-2588" dev="rgoers" type="fix">
+ Add option to restore printing timeMillis in the JsonLayout.
+ </action>
<action issue="LOG4J2-2766" dev="rgoers" type="fix">
Initialize pattern processor before triggering policy during
reconriguration.
</action>
diff --git a/src/site/asciidoc/manual/layouts.adoc
b/src/site/asciidoc/manual/layouts.adoc
index 16d006e..3dbfa3a 100644
--- a/src/site/asciidoc/manual/layouts.adoc
+++ b/src/site/asciidoc/manual/layouts.adoc
@@ -452,6 +452,11 @@ expensive operation and may impact performance. Use with
caution.
https://docs.oracle.com/javase/6/docs/api/java/lang/Throwable.html[Throwable]
(optional, default to true).
+|includeTimeMillis
+|boolean
+|If true, the timeMillis attribute is included in the Json payload instead of
the instant. timeMillis
+will contain the number of milliseconds since midnight, January 1, 1970 UTC.
+
|stacktraceAsString
|boolean
|Whether to format the stacktrace as a