]]>
+
+ false
+ true
+
+
+
+ non-aggregate
+
+ javadoc
+
+
+
+
+
+ org.codehaus.mojo
+ findbugs-maven-plugin
+ ${findbugs.plugin.version}
+
+ true
+ -Duser.language=en
+ Normal
+ Default
+ ${log4jParentDir}/findbugs-exclude-filter.xml
+
+
+
+ org.apache.maven.plugins
+ maven-jxr-plugin
+ ${jxr.plugin.version}
+
+
+ non-aggregate
+
+ jxr
+
+
+
+ aggregate
+
+ aggregate
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-pmd-plugin
+ ${pmd.plugin.version}
+
+ ${maven.compiler.target}
+
+
+
+
+
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqAppender.java b/log4j-jeromq/src/main/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqAppender.java
similarity index 100%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqAppender.java
rename to log4j-jeromq/src/main/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqAppender.java
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqManager.java b/log4j-jeromq/src/main/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqManager.java
similarity index 97%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqManager.java
rename to log4j-jeromq/src/main/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqManager.java
index a438faf0752..0326ebe8ca2 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqManager.java
+++ b/log4j-jeromq/src/main/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqManager.java
@@ -1,222 +1,222 @@
-/*
- * 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.appender.mom.jeromq;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.core.appender.AbstractManager;
-import org.apache.logging.log4j.core.appender.ManagerFactory;
-import org.apache.logging.log4j.core.util.ShutdownCallbackRegistry;
-import org.apache.logging.log4j.util.PropertiesUtil;
-import org.zeromq.ZMQ;
-
-/**
- * Manager for publishing messages via JeroMq.
- *
- * @since 2.6
- */
-public class JeroMqManager extends AbstractManager {
-
- /**
- * System property to enable shutdown hook.
- */
- public static final String SYS_PROPERTY_ENABLE_SHUTDOWN_HOOK = "log4j.jeromq.enableShutdownHook";
-
- /**
- * System property to control JeroMQ I/O thread count.
- */
- public static final String SYS_PROPERTY_IO_THREADS = "log4j.jeromq.ioThreads";
-
- private static final JeroMqManagerFactory FACTORY = new JeroMqManagerFactory();
- private static final ZMQ.Context CONTEXT;
-
- static {
- LOGGER.trace("JeroMqManager using ZMQ version {}", ZMQ.getVersionString());
-
- final int ioThreads = PropertiesUtil.getProperties().getIntegerProperty(SYS_PROPERTY_IO_THREADS, 1);
- LOGGER.trace("JeroMqManager creating ZMQ context with ioThreads = {}", ioThreads);
- CONTEXT = ZMQ.context(ioThreads);
-
- final boolean enableShutdownHook = PropertiesUtil.getProperties().getBooleanProperty(
- SYS_PROPERTY_ENABLE_SHUTDOWN_HOOK, true);
- if (enableShutdownHook) {
- ((ShutdownCallbackRegistry) LogManager.getFactory()).addShutdownCallback(new Runnable() {
- @Override
- public void run() {
- CONTEXT.close();
- }
- });
- }
- }
-
- private final ZMQ.Socket publisher;
-
- private JeroMqManager(final String name, final JeroMqConfiguration config) {
- super(null, name);
- publisher = CONTEXT.socket(ZMQ.PUB);
- publisher.setAffinity(config.affinity);
- publisher.setBacklog(config.backlog);
- publisher.setDelayAttachOnConnect(config.delayAttachOnConnect);
- if (config.identity != null) {
- publisher.setIdentity(config.identity);
- }
- publisher.setIPv4Only(config.ipv4Only);
- publisher.setLinger(config.linger);
- publisher.setMaxMsgSize(config.maxMsgSize);
- publisher.setRcvHWM(config.rcvHwm);
- publisher.setReceiveBufferSize(config.receiveBufferSize);
- publisher.setReceiveTimeOut(config.receiveTimeOut);
- publisher.setReconnectIVL(config.reconnectIVL);
- publisher.setReconnectIVLMax(config.reconnectIVLMax);
- publisher.setSendBufferSize(config.sendBufferSize);
- publisher.setSendTimeOut(config.sendTimeOut);
- publisher.setSndHWM(config.sndHwm);
- publisher.setTCPKeepAlive(config.tcpKeepAlive);
- publisher.setTCPKeepAliveCount(config.tcpKeepAliveCount);
- publisher.setTCPKeepAliveIdle(config.tcpKeepAliveIdle);
- publisher.setTCPKeepAliveInterval(config.tcpKeepAliveInterval);
- publisher.setXpubVerbose(config.xpubVerbose);
- for (final String endpoint : config.endpoints) {
- publisher.bind(endpoint);
- }
- LOGGER.debug("Created JeroMqManager with {}", config);
- }
-
- public boolean send(final byte[] data) {
- return publisher.send(data);
- }
-
- @Override
- protected boolean releaseSub(final long timeout, final TimeUnit timeUnit) {
- publisher.close();
- return true;
- }
-
- public static JeroMqManager getJeroMqManager(final String name, final long affinity, final long backlog,
- final boolean delayAttachOnConnect, final byte[] identity,
- final boolean ipv4Only, final long linger, final long maxMsgSize,
- final long rcvHwm, final long receiveBufferSize,
- final int receiveTimeOut, final long reconnectIVL,
- final long reconnectIVLMax, final long sendBufferSize,
- final int sendTimeOut, final long sndHwm, final int tcpKeepAlive,
- final long tcpKeepAliveCount, final long tcpKeepAliveIdle,
- final long tcpKeepAliveInterval, final boolean xpubVerbose,
- final List endpoints) {
- return getManager(name, FACTORY,
- new JeroMqConfiguration(affinity, backlog, delayAttachOnConnect, identity, ipv4Only, linger, maxMsgSize,
- rcvHwm, receiveBufferSize, receiveTimeOut, reconnectIVL, reconnectIVLMax, sendBufferSize, sendTimeOut,
- sndHwm, tcpKeepAlive, tcpKeepAliveCount, tcpKeepAliveIdle, tcpKeepAliveInterval, xpubVerbose,
- endpoints));
- }
-
- public static ZMQ.Context getContext() {
- return CONTEXT;
- }
-
- private static class JeroMqConfiguration {
- private final long affinity;
- private final long backlog;
- private final boolean delayAttachOnConnect;
- private final byte[] identity;
- private final boolean ipv4Only;
- private final long linger;
- private final long maxMsgSize;
- private final long rcvHwm;
- private final long receiveBufferSize;
- private final int receiveTimeOut;
- private final long reconnectIVL;
- private final long reconnectIVLMax;
- private final long sendBufferSize;
- private final int sendTimeOut;
- private final long sndHwm;
- private final int tcpKeepAlive;
- private final long tcpKeepAliveCount;
- private final long tcpKeepAliveIdle;
- private final long tcpKeepAliveInterval;
- private final boolean xpubVerbose;
- private final List endpoints;
-
- private JeroMqConfiguration(final long affinity, final long backlog, final boolean delayAttachOnConnect,
- final byte[] identity, final boolean ipv4Only, final long linger,
- final long maxMsgSize, final long rcvHwm, final long receiveBufferSize,
- final int receiveTimeOut, final long reconnectIVL, final long reconnectIVLMax,
- final long sendBufferSize, final int sendTimeOut, final long sndHwm,
- final int tcpKeepAlive, final long tcpKeepAliveCount, final long tcpKeepAliveIdle,
- final long tcpKeepAliveInterval, final boolean xpubVerbose,
- final List endpoints) {
- this.affinity = affinity;
- this.backlog = backlog;
- this.delayAttachOnConnect = delayAttachOnConnect;
- this.identity = identity;
- this.ipv4Only = ipv4Only;
- this.linger = linger;
- this.maxMsgSize = maxMsgSize;
- this.rcvHwm = rcvHwm;
- this.receiveBufferSize = receiveBufferSize;
- this.receiveTimeOut = receiveTimeOut;
- this.reconnectIVL = reconnectIVL;
- this.reconnectIVLMax = reconnectIVLMax;
- this.sendBufferSize = sendBufferSize;
- this.sendTimeOut = sendTimeOut;
- this.sndHwm = sndHwm;
- this.tcpKeepAlive = tcpKeepAlive;
- this.tcpKeepAliveCount = tcpKeepAliveCount;
- this.tcpKeepAliveIdle = tcpKeepAliveIdle;
- this.tcpKeepAliveInterval = tcpKeepAliveInterval;
- this.xpubVerbose = xpubVerbose;
- this.endpoints = endpoints;
- }
-
- @Override
- public String toString() {
- return "JeroMqConfiguration{" +
- "affinity=" + affinity +
- ", backlog=" + backlog +
- ", delayAttachOnConnect=" + delayAttachOnConnect +
- ", identity=" + Arrays.toString(identity) +
- ", ipv4Only=" + ipv4Only +
- ", linger=" + linger +
- ", maxMsgSize=" + maxMsgSize +
- ", rcvHwm=" + rcvHwm +
- ", receiveBufferSize=" + receiveBufferSize +
- ", receiveTimeOut=" + receiveTimeOut +
- ", reconnectIVL=" + reconnectIVL +
- ", reconnectIVLMax=" + reconnectIVLMax +
- ", sendBufferSize=" + sendBufferSize +
- ", sendTimeOut=" + sendTimeOut +
- ", sndHwm=" + sndHwm +
- ", tcpKeepAlive=" + tcpKeepAlive +
- ", tcpKeepAliveCount=" + tcpKeepAliveCount +
- ", tcpKeepAliveIdle=" + tcpKeepAliveIdle +
- ", tcpKeepAliveInterval=" + tcpKeepAliveInterval +
- ", xpubVerbose=" + xpubVerbose +
- ", endpoints=" + endpoints +
- '}';
- }
- }
-
- private static class JeroMqManagerFactory implements ManagerFactory {
- @Override
- public JeroMqManager createManager(final String name, final JeroMqConfiguration data) {
- return new JeroMqManager(name, data);
- }
- }
-}
+/*
+ * 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.appender.mom.jeromq;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.core.appender.AbstractManager;
+import org.apache.logging.log4j.core.appender.ManagerFactory;
+import org.apache.logging.log4j.core.util.ShutdownCallbackRegistry;
+import org.apache.logging.log4j.util.PropertiesUtil;
+import org.zeromq.ZMQ;
+
+/**
+ * Manager for publishing messages via JeroMq.
+ *
+ * @since 2.6
+ */
+public class JeroMqManager extends AbstractManager {
+
+ /**
+ * System property to enable shutdown hook.
+ */
+ public static final String SYS_PROPERTY_ENABLE_SHUTDOWN_HOOK = "log4j.jeromq.enableShutdownHook";
+
+ /**
+ * System property to control JeroMQ I/O thread count.
+ */
+ public static final String SYS_PROPERTY_IO_THREADS = "log4j.jeromq.ioThreads";
+
+ private static final JeroMqManagerFactory FACTORY = new JeroMqManagerFactory();
+ private static final ZMQ.Context CONTEXT;
+
+ static {
+ LOGGER.trace("JeroMqManager using ZMQ version {}", ZMQ.getVersionString());
+
+ final int ioThreads = PropertiesUtil.getProperties().getIntegerProperty(SYS_PROPERTY_IO_THREADS, 1);
+ LOGGER.trace("JeroMqManager creating ZMQ context with ioThreads = {}", ioThreads);
+ CONTEXT = ZMQ.context(ioThreads);
+
+ final boolean enableShutdownHook = PropertiesUtil.getProperties().getBooleanProperty(
+ SYS_PROPERTY_ENABLE_SHUTDOWN_HOOK, true);
+ if (enableShutdownHook) {
+ ((ShutdownCallbackRegistry) LogManager.getFactory()).addShutdownCallback(new Runnable() {
+ @Override
+ public void run() {
+ CONTEXT.close();
+ }
+ });
+ }
+ }
+
+ private final ZMQ.Socket publisher;
+
+ private JeroMqManager(final String name, final JeroMqConfiguration config) {
+ super(null, name);
+ publisher = CONTEXT.socket(ZMQ.PUB);
+ publisher.setAffinity(config.affinity);
+ publisher.setBacklog(config.backlog);
+ publisher.setDelayAttachOnConnect(config.delayAttachOnConnect);
+ if (config.identity != null) {
+ publisher.setIdentity(config.identity);
+ }
+ publisher.setIPv4Only(config.ipv4Only);
+ publisher.setLinger(config.linger);
+ publisher.setMaxMsgSize(config.maxMsgSize);
+ publisher.setRcvHWM(config.rcvHwm);
+ publisher.setReceiveBufferSize(config.receiveBufferSize);
+ publisher.setReceiveTimeOut(config.receiveTimeOut);
+ publisher.setReconnectIVL(config.reconnectIVL);
+ publisher.setReconnectIVLMax(config.reconnectIVLMax);
+ publisher.setSendBufferSize(config.sendBufferSize);
+ publisher.setSendTimeOut(config.sendTimeOut);
+ publisher.setSndHWM(config.sndHwm);
+ publisher.setTCPKeepAlive(config.tcpKeepAlive);
+ publisher.setTCPKeepAliveCount(config.tcpKeepAliveCount);
+ publisher.setTCPKeepAliveIdle(config.tcpKeepAliveIdle);
+ publisher.setTCPKeepAliveInterval(config.tcpKeepAliveInterval);
+ publisher.setXpubVerbose(config.xpubVerbose);
+ for (final String endpoint : config.endpoints) {
+ publisher.bind(endpoint);
+ }
+ LOGGER.debug("Created JeroMqManager with {}", config);
+ }
+
+ public boolean send(final byte[] data) {
+ return publisher.send(data);
+ }
+
+ @Override
+ protected boolean releaseSub(final long timeout, final TimeUnit timeUnit) {
+ publisher.close();
+ return true;
+ }
+
+ public static JeroMqManager getJeroMqManager(final String name, final long affinity, final long backlog,
+ final boolean delayAttachOnConnect, final byte[] identity,
+ final boolean ipv4Only, final long linger, final long maxMsgSize,
+ final long rcvHwm, final long receiveBufferSize,
+ final int receiveTimeOut, final long reconnectIVL,
+ final long reconnectIVLMax, final long sendBufferSize,
+ final int sendTimeOut, final long sndHwm, final int tcpKeepAlive,
+ final long tcpKeepAliveCount, final long tcpKeepAliveIdle,
+ final long tcpKeepAliveInterval, final boolean xpubVerbose,
+ final List endpoints) {
+ return getManager(name, FACTORY,
+ new JeroMqConfiguration(affinity, backlog, delayAttachOnConnect, identity, ipv4Only, linger, maxMsgSize,
+ rcvHwm, receiveBufferSize, receiveTimeOut, reconnectIVL, reconnectIVLMax, sendBufferSize, sendTimeOut,
+ sndHwm, tcpKeepAlive, tcpKeepAliveCount, tcpKeepAliveIdle, tcpKeepAliveInterval, xpubVerbose,
+ endpoints));
+ }
+
+ public static ZMQ.Context getContext() {
+ return CONTEXT;
+ }
+
+ private static class JeroMqConfiguration {
+ private final long affinity;
+ private final long backlog;
+ private final boolean delayAttachOnConnect;
+ private final byte[] identity;
+ private final boolean ipv4Only;
+ private final long linger;
+ private final long maxMsgSize;
+ private final long rcvHwm;
+ private final long receiveBufferSize;
+ private final int receiveTimeOut;
+ private final long reconnectIVL;
+ private final long reconnectIVLMax;
+ private final long sendBufferSize;
+ private final int sendTimeOut;
+ private final long sndHwm;
+ private final int tcpKeepAlive;
+ private final long tcpKeepAliveCount;
+ private final long tcpKeepAliveIdle;
+ private final long tcpKeepAliveInterval;
+ private final boolean xpubVerbose;
+ private final List endpoints;
+
+ private JeroMqConfiguration(final long affinity, final long backlog, final boolean delayAttachOnConnect,
+ final byte[] identity, final boolean ipv4Only, final long linger,
+ final long maxMsgSize, final long rcvHwm, final long receiveBufferSize,
+ final int receiveTimeOut, final long reconnectIVL, final long reconnectIVLMax,
+ final long sendBufferSize, final int sendTimeOut, final long sndHwm,
+ final int tcpKeepAlive, final long tcpKeepAliveCount, final long tcpKeepAliveIdle,
+ final long tcpKeepAliveInterval, final boolean xpubVerbose,
+ final List endpoints) {
+ this.affinity = affinity;
+ this.backlog = backlog;
+ this.delayAttachOnConnect = delayAttachOnConnect;
+ this.identity = identity;
+ this.ipv4Only = ipv4Only;
+ this.linger = linger;
+ this.maxMsgSize = maxMsgSize;
+ this.rcvHwm = rcvHwm;
+ this.receiveBufferSize = receiveBufferSize;
+ this.receiveTimeOut = receiveTimeOut;
+ this.reconnectIVL = reconnectIVL;
+ this.reconnectIVLMax = reconnectIVLMax;
+ this.sendBufferSize = sendBufferSize;
+ this.sendTimeOut = sendTimeOut;
+ this.sndHwm = sndHwm;
+ this.tcpKeepAlive = tcpKeepAlive;
+ this.tcpKeepAliveCount = tcpKeepAliveCount;
+ this.tcpKeepAliveIdle = tcpKeepAliveIdle;
+ this.tcpKeepAliveInterval = tcpKeepAliveInterval;
+ this.xpubVerbose = xpubVerbose;
+ this.endpoints = endpoints;
+ }
+
+ @Override
+ public String toString() {
+ return "JeroMqConfiguration{" +
+ "affinity=" + affinity +
+ ", backlog=" + backlog +
+ ", delayAttachOnConnect=" + delayAttachOnConnect +
+ ", identity=" + Arrays.toString(identity) +
+ ", ipv4Only=" + ipv4Only +
+ ", linger=" + linger +
+ ", maxMsgSize=" + maxMsgSize +
+ ", rcvHwm=" + rcvHwm +
+ ", receiveBufferSize=" + receiveBufferSize +
+ ", receiveTimeOut=" + receiveTimeOut +
+ ", reconnectIVL=" + reconnectIVL +
+ ", reconnectIVLMax=" + reconnectIVLMax +
+ ", sendBufferSize=" + sendBufferSize +
+ ", sendTimeOut=" + sendTimeOut +
+ ", sndHwm=" + sndHwm +
+ ", tcpKeepAlive=" + tcpKeepAlive +
+ ", tcpKeepAliveCount=" + tcpKeepAliveCount +
+ ", tcpKeepAliveIdle=" + tcpKeepAliveIdle +
+ ", tcpKeepAliveInterval=" + tcpKeepAliveInterval +
+ ", xpubVerbose=" + xpubVerbose +
+ ", endpoints=" + endpoints +
+ '}';
+ }
+ }
+
+ private static class JeroMqManagerFactory implements ManagerFactory {
+ @Override
+ public JeroMqManager createManager(final String name, final JeroMqConfiguration data) {
+ return new JeroMqManager(name, data);
+ }
+ }
+}
diff --git a/log4j-jeromq/src/site/manual/index.md b/log4j-jeromq/src/site/manual/index.md
new file mode 100644
index 00000000000..66fe24fe304
--- /dev/null
+++ b/log4j-jeromq/src/site/manual/index.md
@@ -0,0 +1,33 @@
+
+
+
+# Apache Log4j ZeroMQ using JeroMQ module
+
+As of Log4j 2.11.0, ZeroMQ using JeroMQ support has moved from the existing module logj-core to the new module log4j-jeromq.
+
+## Requirements
+
+This module was introduced in Log4j 2.11.0 and requires the jeromq JAR.
+
+Some features may require optional
+[dependencies](../runtime-dependencies.html). These dependencies are specified in the
+documentation for those features.
+
+Some Log4j features require external dependencies.
+See the [Dependency Tree](dependencies.html#Dependency_Tree)
+for the exact list of JAR files needed for these features.
diff --git a/log4j-jeromq/src/site/site.xml b/log4j-jeromq/src/site/site.xml
new file mode 100644
index 00000000000..6d4cddc0b14
--- /dev/null
+++ b/log4j-jeromq/src/site/site.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqAppenderTest.java b/log4j-jeromq/src/test/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqAppenderTest.java
similarity index 100%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqAppenderTest.java
rename to log4j-jeromq/src/test/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqAppenderTest.java
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqTestClient.java b/log4j-jeromq/src/test/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqTestClient.java
similarity index 97%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqTestClient.java
rename to log4j-jeromq/src/test/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqTestClient.java
index ddd06abcf43..b84cc729f72 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqTestClient.java
+++ b/log4j-jeromq/src/test/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqTestClient.java
@@ -1,55 +1,55 @@
-/*
- * 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.appender.mom.jeromq;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.Callable;
-
-import org.zeromq.ZMQ;
-
-class JeroMqTestClient implements Callable> {
-
- private final ZMQ.Context context;
-
- private final String endpoint;
- private final List messages;
- private final int receiveCount;
-
- JeroMqTestClient(final ZMQ.Context context, final String endpoint, final int receiveCount) {
- super();
- this.context = context;
- this.endpoint = endpoint;
- this.receiveCount = receiveCount;
- this.messages = new ArrayList<>(receiveCount);
- }
-
- @Override
- public List call() throws Exception {
- try (ZMQ.Socket subscriber = context.socket(ZMQ.SUB)) {
- subscriber.connect(endpoint);
- subscriber.subscribe(new byte[0]);
- for (int messageNum = 0; messageNum < receiveCount
- && !Thread.currentThread().isInterrupted(); messageNum++) {
- // Use trim to remove the tailing '0' character
- messages.add(subscriber.recvStr(0).trim());
- }
- }
- return messages;
- }
+/*
+ * 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.appender.mom.jeromq;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Callable;
+
+import org.zeromq.ZMQ;
+
+class JeroMqTestClient implements Callable> {
+
+ private final ZMQ.Context context;
+
+ private final String endpoint;
+ private final List messages;
+ private final int receiveCount;
+
+ JeroMqTestClient(final ZMQ.Context context, final String endpoint, final int receiveCount) {
+ super();
+ this.context = context;
+ this.endpoint = endpoint;
+ this.receiveCount = receiveCount;
+ this.messages = new ArrayList<>(receiveCount);
+ }
+
+ @Override
+ public List call() throws Exception {
+ try (ZMQ.Socket subscriber = context.socket(ZMQ.SUB)) {
+ subscriber.connect(endpoint);
+ subscriber.subscribe(new byte[0]);
+ for (int messageNum = 0; messageNum < receiveCount
+ && !Thread.currentThread().isInterrupted(); messageNum++) {
+ // Use trim to remove the tailing '0' character
+ messages.add(subscriber.recvStr(0).trim());
+ }
+ }
+ return messages;
+ }
}
\ No newline at end of file
diff --git a/log4j-jeromq/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-h2-jpa-base.xml b/log4j-jeromq/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-h2-jpa-base.xml
new file mode 100644
index 00000000000..ad22f659779
--- /dev/null
+++ b/log4j-jeromq/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-h2-jpa-base.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/log4j-jeromq/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-h2-jpa-basic.xml b/log4j-jeromq/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-h2-jpa-basic.xml
new file mode 100644
index 00000000000..af3a0b74620
--- /dev/null
+++ b/log4j-jeromq/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-h2-jpa-basic.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/log4j-jeromq/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-hsqldb-jpa-base.xml b/log4j-jeromq/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-hsqldb-jpa-base.xml
new file mode 100644
index 00000000000..3f6e50a0367
--- /dev/null
+++ b/log4j-jeromq/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-hsqldb-jpa-base.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/log4j-jeromq/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-hsqldb-jpa-basic.xml b/log4j-jeromq/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-hsqldb-jpa-basic.xml
new file mode 100644
index 00000000000..8215ea3a2b9
--- /dev/null
+++ b/log4j-jeromq/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-hsqldb-jpa-basic.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pom.xml b/pom.xml
index 362eb419ff9..34bb67020c9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1336,6 +1336,7 @@
log4j-bomlog4j-jdbc-dbcp2log4j-jpa
+ log4j-jeromqlog4j-couchdblog4j-mongodb2log4j-mongodb3
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 431e665de11..aea4e1c678c 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -164,6 +164,9 @@
Update Jackson from 2.9.3 to 2.9.4.
+
+ Split off ZeroMq/JeroMq support into a new module log4j-jeromq.
+
diff --git a/src/site/xdoc/manual/appenders.xml b/src/site/xdoc/manual/appenders.xml
index a6401bb8159..bcd77368b74 100644
--- a/src/site/xdoc/manual/appenders.xml
+++ b/src/site/xdoc/manual/appenders.xml
@@ -5218,6 +5218,9 @@ public class JpaLogEntity extends AbstractLogEventWrapperEntity {
+
+ As of Log4j 2.11.0, ZeroMQ/JeroMQ support has moved from the existing module logj-core to the new module log4j-jeromq.
+
- * @since 2.11
+ * @since 2.11.0
*/
public interface Instant {
/**
diff --git a/log4j-core-java9/src/main/java/org/apache/logging/log4j/core/util/MutableInstant.java b/log4j-core-java9/src/main/java/org/apache/logging/log4j/core/util/MutableInstant.java
index 8960fc53f53..a8851019393 100644
--- a/log4j-core-java9/src/main/java/org/apache/logging/log4j/core/util/MutableInstant.java
+++ b/log4j-core-java9/src/main/java/org/apache/logging/log4j/core/util/MutableInstant.java
@@ -31,7 +31,7 @@
* Instances of this class are not thread-safe and should not be shared between threads.
*
*
- * @since 2.11
+ * @since 2.11.0
*/
@PerformanceSensitive("allocation")
public class MutableInstant implements Instant, Serializable {
diff --git a/log4j-core-java9/src/main/java/org/apache/logging/log4j/core/util/PreciseClock.java b/log4j-core-java9/src/main/java/org/apache/logging/log4j/core/util/PreciseClock.java
index 3d1f314ee60..7dc0700f0ef 100644
--- a/log4j-core-java9/src/main/java/org/apache/logging/log4j/core/util/PreciseClock.java
+++ b/log4j-core-java9/src/main/java/org/apache/logging/log4j/core/util/PreciseClock.java
@@ -23,14 +23,14 @@
* Extension of the {@link Clock} interface that is able to provide more accurate time information than milliseconds
* since the epoch. {@code PreciseClock} implementations are free to return millisecond-precision time
* if that is the most accurate time information available on this platform.
- * @since 2.11
+ * @since 2.11.0
*/
public interface PreciseClock extends Clock {
/**
* Initializes the specified instant with time information as accurate as available on this platform.
* @param mutableInstant the container to be initialized with the accurate time information
- * @since 2.11
+ * @since 2.11.0
*/
void init(final MutableInstant mutableInstant);
}
diff --git a/log4j-core-java9/src/main/java/org/apache/logging/log4j/core/util/SystemClock.java b/log4j-core-java9/src/main/java/org/apache/logging/log4j/core/util/SystemClock.java
index a74a1fde110..6eb2379534a 100644
--- a/log4j-core-java9/src/main/java/org/apache/logging/log4j/core/util/SystemClock.java
+++ b/log4j-core-java9/src/main/java/org/apache/logging/log4j/core/util/SystemClock.java
@@ -20,7 +20,7 @@
/**
* Implementation of the {@code Clock} interface that returns the system time.
- * @since 2.11
+ * @since 2.11.0
*/
public final class SystemClock implements Clock, PreciseClock {
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/LogEvent.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/LogEvent.java
index 0879f40a1b3..017eb2e69ff 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/LogEvent.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/LogEvent.java
@@ -141,7 +141,7 @@ public interface LogEvent extends Serializable {
*
*
* @return the {@code Instant} holding timestamp details for this log event
- * @since 2.11
+ * @since 2.11.0
*/
Instant getInstant();
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
index 48076d838f8..d7da56ca4b9 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
@@ -581,7 +581,7 @@ public long getTimeMillis() {
/**
* {@inheritDoc}
- * @since 2.11
+ * @since 2.11.0
*/
@Override
public Instant getInstant() {
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/Instant.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/Instant.java
index ab50da11a69..c9609cd02a5 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/Instant.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/Instant.java
@@ -25,14 +25,16 @@
* Provides methods for obtaining high precision time information similar to the
* Instant class introduced in Java 8,
* while also supporting the legacy millisecond precision API.
- *
+ *
+ *
* Depending on the platform, time sources ({@link Clock} implementations) may produce high precision or millisecond
* precision time values. At the same time, some time value consumers (for example timestamp formatters) may only be
* able to consume time values of millisecond precision, while some others may require a high precision time value.
- *
]]>
+
+ false
+ true
+
+
+
+ non-aggregate
+
+ javadoc
+
+
+
+
+
+ org.codehaus.mojo
+ findbugs-maven-plugin
+ ${findbugs.plugin.version}
+
+ true
+ -Duser.language=en
+ Normal
+ Default
+ ${log4jParentDir}/findbugs-exclude-filter.xml
+
+
+
+ org.apache.maven.plugins
+ maven-jxr-plugin
+ ${jxr.plugin.version}
+
+
+ non-aggregate
+
+ jxr
+
+
+
+ aggregate
+
+ aggregate
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-pmd-plugin
+ ${pmd.plugin.version}
+
+ ${maven.compiler.target}
+
+
+
+
+
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SmtpAppender.java b/log4j-smtp/src/main/java/org/apache/logging/log4j/core/appender/SmtpAppender.java
similarity index 100%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SmtpAppender.java
rename to log4j-smtp/src/main/java/org/apache/logging/log4j/core/appender/SmtpAppender.java
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/MimeMessageBuilder.java b/log4j-smtp/src/main/java/org/apache/logging/log4j/core/net/MimeMessageBuilder.java
similarity index 100%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/net/MimeMessageBuilder.java
rename to log4j-smtp/src/main/java/org/apache/logging/log4j/core/net/MimeMessageBuilder.java
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SmtpManager.java b/log4j-smtp/src/main/java/org/apache/logging/log4j/core/net/SmtpManager.java
similarity index 100%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/net/SmtpManager.java
rename to log4j-smtp/src/main/java/org/apache/logging/log4j/core/net/SmtpManager.java
diff --git a/log4j-smtp/src/site/manual/index.md b/log4j-smtp/src/site/manual/index.md
new file mode 100644
index 00000000000..318d365b451
--- /dev/null
+++ b/log4j-smtp/src/site/manual/index.md
@@ -0,0 +1,33 @@
+
+
+
+# Apache Log4j Simple Mail Transfer Protocol module
+
+As of Log4j 2.11.0, Simple Mail Transfer Protocol (SMTP) support has moved from the existing module logj-core to the new module log4j-smtp.
+
+## Requirements
+
+This module was introduced in Log4j 2.11.0 and requires the jeromq JAR.
+
+Some features may require optional
+[dependencies](../runtime-dependencies.html). These dependencies are specified in the
+documentation for those features.
+
+Some Log4j features require external dependencies.
+See the [Dependency Tree](dependencies.html#Dependency_Tree)
+for the exact list of JAR files needed for these features.
diff --git a/log4j-smtp/src/site/site.xml b/log4j-smtp/src/site/site.xml
new file mode 100644
index 00000000000..6d4cddc0b14
--- /dev/null
+++ b/log4j-smtp/src/site/site.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/log4j-core/src/test/java/org/apache/logging/dumbster/smtp/SimpleSmtpServer.java b/log4j-smtp/src/test/java/org/apache/logging/dumbster/smtp/SimpleSmtpServer.java
similarity index 100%
rename from log4j-core/src/test/java/org/apache/logging/dumbster/smtp/SimpleSmtpServer.java
rename to log4j-smtp/src/test/java/org/apache/logging/dumbster/smtp/SimpleSmtpServer.java
diff --git a/log4j-core/src/test/java/org/apache/logging/dumbster/smtp/SmtpActionType.java b/log4j-smtp/src/test/java/org/apache/logging/dumbster/smtp/SmtpActionType.java
similarity index 96%
rename from log4j-core/src/test/java/org/apache/logging/dumbster/smtp/SmtpActionType.java
rename to log4j-smtp/src/test/java/org/apache/logging/dumbster/smtp/SmtpActionType.java
index 9397ebb4b8f..8709e8c5ffb 100644
--- a/log4j-core/src/test/java/org/apache/logging/dumbster/smtp/SmtpActionType.java
+++ b/log4j-smtp/src/test/java/org/apache/logging/dumbster/smtp/SmtpActionType.java
@@ -1,202 +1,202 @@
-/*
- * 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.dumbster.smtp;
-
-/**
- * Represents an SMTP action or command.
- */
-public class SmtpActionType {
- /**
- * Internal value for the action type.
- */
- private final byte value;
-
- /**
- * Internal representation of the CONNECT action.
- */
- private static final byte CONNECT_BYTE = (byte) 1;
- /**
- * Internal representation of the EHLO action.
- */
- private static final byte EHLO_BYTE = (byte) 2;
- /**
- * Internal representation of the MAIL FROM action.
- */
- private static final byte MAIL_BYTE = (byte) 3;
- /**
- * Internal representation of the RCPT action.
- */
- private static final byte RCPT_BYTE = (byte) 4;
- /**
- * Internal representation of the DATA action.
- */
- private static final byte DATA_BYTE = (byte) 5;
- /**
- * Internal representation of the DATA END (.) action.
- */
- private static final byte DATA_END_BYTE = (byte) 6;
- /**
- * Internal representation of the QUIT action.
- */
- private static final byte QUIT_BYTE = (byte) 7;
- /**
- * Internal representation of an unrecognized action: body text gets this action type.
- */
- private static final byte UNREC_BYTE = (byte) 8;
- /**
- * Internal representation of the blank line action: separates headers and body text.
- */
- private static final byte BLANK_LINE_BYTE = (byte) 9;
-
- /**
- * Internal representation of the stateless RSET action.
- */
- private static final byte RSET_BYTE = (byte) -1;
- /**
- * Internal representation of the stateless VRFY action.
- */
- private static final byte VRFY_BYTE = (byte) -2;
- /**
- * Internal representation of the stateless EXPN action.
- */
- private static final byte EXPN_BYTE = (byte) -3;
- /**
- * Internal representation of the stateless HELP action.
- */
- private static final byte HELP_BYTE = (byte) -4;
- /**
- * Internal representation of the stateless NOOP action.
- */
- private static final byte NOOP_BYTE = (byte) -5;
-
- /**
- * CONNECT action.
- */
- public static final SmtpActionType CONNECT = new SmtpActionType(CONNECT_BYTE);
- /**
- * EHLO action.
- */
- public static final SmtpActionType EHLO = new SmtpActionType(EHLO_BYTE);
- /**
- * MAIL action.
- */
- public static final SmtpActionType MAIL = new SmtpActionType(MAIL_BYTE);
- /**
- * RCPT action.
- */
- public static final SmtpActionType RCPT = new SmtpActionType(RCPT_BYTE);
- /**
- * DATA action.
- */
- public static final SmtpActionType DATA = new SmtpActionType(DATA_BYTE);
- /**
- * "." action.
- */
- public static final SmtpActionType DATA_END = new SmtpActionType(DATA_END_BYTE);
- /**
- * Body text action.
- */
- public static final SmtpActionType UNRECOG = new SmtpActionType(UNREC_BYTE);
- /**
- * QUIT action.
- */
- public static final SmtpActionType QUIT = new SmtpActionType(QUIT_BYTE);
- /**
- * Header/body separator action.
- */
- public static final SmtpActionType BLANK_LINE = new SmtpActionType(BLANK_LINE_BYTE);
-
- /**
- * Stateless RSET action.
- */
- public static final SmtpActionType RSET = new SmtpActionType(RSET_BYTE);
- /**
- * Stateless VRFY action.
- */
- public static final SmtpActionType VRFY = new SmtpActionType(VRFY_BYTE);
- /**
- * Stateless EXPN action.
- */
- public static final SmtpActionType EXPN = new SmtpActionType(EXPN_BYTE);
- /**
- * Stateless HELP action.
- */
- public static final SmtpActionType HELP = new SmtpActionType(HELP_BYTE);
- /**
- * Stateless NOOP action.
- */
- public static final SmtpActionType NOOP = new SmtpActionType(NOOP_BYTE);
-
- /**
- * Create a new SMTP action type. Private to ensure no invalid values.
- *
- * @param value one of the _BYTE values
- */
- private SmtpActionType(final byte value) {
- this.value = value;
- }
-
- /**
- * Indicates whether the action is stateless or not.
- *
- * @return true iff the action is stateless
- */
- public boolean isStateless() {
- return value < 0;
- }
-
- /**
- * String representation of this SMTP action type.
- *
- * @return a String
- */
- @Override
- public String toString() {
- switch (value) {
- case CONNECT_BYTE:
- return "Connect";
- case EHLO_BYTE:
- return "EHLO";
- case MAIL_BYTE:
- return "MAIL";
- case RCPT_BYTE:
- return "RCPT";
- case DATA_BYTE:
- return "DATA";
- case DATA_END_BYTE:
- return ".";
- case QUIT_BYTE:
- return "QUIT";
- case RSET_BYTE:
- return "RSET";
- case VRFY_BYTE:
- return "VRFY";
- case EXPN_BYTE:
- return "EXPN";
- case HELP_BYTE:
- return "HELP";
- case NOOP_BYTE:
- return "NOOP";
- case UNREC_BYTE:
- return "Unrecognized command / data";
- case BLANK_LINE_BYTE:
- return "Blank line";
- default:
- return "Unknown";
- }
- }
-}
+/*
+ * 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.dumbster.smtp;
+
+/**
+ * Represents an SMTP action or command.
+ */
+public class SmtpActionType {
+ /**
+ * Internal value for the action type.
+ */
+ private final byte value;
+
+ /**
+ * Internal representation of the CONNECT action.
+ */
+ private static final byte CONNECT_BYTE = (byte) 1;
+ /**
+ * Internal representation of the EHLO action.
+ */
+ private static final byte EHLO_BYTE = (byte) 2;
+ /**
+ * Internal representation of the MAIL FROM action.
+ */
+ private static final byte MAIL_BYTE = (byte) 3;
+ /**
+ * Internal representation of the RCPT action.
+ */
+ private static final byte RCPT_BYTE = (byte) 4;
+ /**
+ * Internal representation of the DATA action.
+ */
+ private static final byte DATA_BYTE = (byte) 5;
+ /**
+ * Internal representation of the DATA END (.) action.
+ */
+ private static final byte DATA_END_BYTE = (byte) 6;
+ /**
+ * Internal representation of the QUIT action.
+ */
+ private static final byte QUIT_BYTE = (byte) 7;
+ /**
+ * Internal representation of an unrecognized action: body text gets this action type.
+ */
+ private static final byte UNREC_BYTE = (byte) 8;
+ /**
+ * Internal representation of the blank line action: separates headers and body text.
+ */
+ private static final byte BLANK_LINE_BYTE = (byte) 9;
+
+ /**
+ * Internal representation of the stateless RSET action.
+ */
+ private static final byte RSET_BYTE = (byte) -1;
+ /**
+ * Internal representation of the stateless VRFY action.
+ */
+ private static final byte VRFY_BYTE = (byte) -2;
+ /**
+ * Internal representation of the stateless EXPN action.
+ */
+ private static final byte EXPN_BYTE = (byte) -3;
+ /**
+ * Internal representation of the stateless HELP action.
+ */
+ private static final byte HELP_BYTE = (byte) -4;
+ /**
+ * Internal representation of the stateless NOOP action.
+ */
+ private static final byte NOOP_BYTE = (byte) -5;
+
+ /**
+ * CONNECT action.
+ */
+ public static final SmtpActionType CONNECT = new SmtpActionType(CONNECT_BYTE);
+ /**
+ * EHLO action.
+ */
+ public static final SmtpActionType EHLO = new SmtpActionType(EHLO_BYTE);
+ /**
+ * MAIL action.
+ */
+ public static final SmtpActionType MAIL = new SmtpActionType(MAIL_BYTE);
+ /**
+ * RCPT action.
+ */
+ public static final SmtpActionType RCPT = new SmtpActionType(RCPT_BYTE);
+ /**
+ * DATA action.
+ */
+ public static final SmtpActionType DATA = new SmtpActionType(DATA_BYTE);
+ /**
+ * "." action.
+ */
+ public static final SmtpActionType DATA_END = new SmtpActionType(DATA_END_BYTE);
+ /**
+ * Body text action.
+ */
+ public static final SmtpActionType UNRECOG = new SmtpActionType(UNREC_BYTE);
+ /**
+ * QUIT action.
+ */
+ public static final SmtpActionType QUIT = new SmtpActionType(QUIT_BYTE);
+ /**
+ * Header/body separator action.
+ */
+ public static final SmtpActionType BLANK_LINE = new SmtpActionType(BLANK_LINE_BYTE);
+
+ /**
+ * Stateless RSET action.
+ */
+ public static final SmtpActionType RSET = new SmtpActionType(RSET_BYTE);
+ /**
+ * Stateless VRFY action.
+ */
+ public static final SmtpActionType VRFY = new SmtpActionType(VRFY_BYTE);
+ /**
+ * Stateless EXPN action.
+ */
+ public static final SmtpActionType EXPN = new SmtpActionType(EXPN_BYTE);
+ /**
+ * Stateless HELP action.
+ */
+ public static final SmtpActionType HELP = new SmtpActionType(HELP_BYTE);
+ /**
+ * Stateless NOOP action.
+ */
+ public static final SmtpActionType NOOP = new SmtpActionType(NOOP_BYTE);
+
+ /**
+ * Create a new SMTP action type. Private to ensure no invalid values.
+ *
+ * @param value one of the _BYTE values
+ */
+ private SmtpActionType(final byte value) {
+ this.value = value;
+ }
+
+ /**
+ * Indicates whether the action is stateless or not.
+ *
+ * @return true iff the action is stateless
+ */
+ public boolean isStateless() {
+ return value < 0;
+ }
+
+ /**
+ * String representation of this SMTP action type.
+ *
+ * @return a String
+ */
+ @Override
+ public String toString() {
+ switch (value) {
+ case CONNECT_BYTE:
+ return "Connect";
+ case EHLO_BYTE:
+ return "EHLO";
+ case MAIL_BYTE:
+ return "MAIL";
+ case RCPT_BYTE:
+ return "RCPT";
+ case DATA_BYTE:
+ return "DATA";
+ case DATA_END_BYTE:
+ return ".";
+ case QUIT_BYTE:
+ return "QUIT";
+ case RSET_BYTE:
+ return "RSET";
+ case VRFY_BYTE:
+ return "VRFY";
+ case EXPN_BYTE:
+ return "EXPN";
+ case HELP_BYTE:
+ return "HELP";
+ case NOOP_BYTE:
+ return "NOOP";
+ case UNREC_BYTE:
+ return "Unrecognized command / data";
+ case BLANK_LINE_BYTE:
+ return "Blank line";
+ default:
+ return "Unknown";
+ }
+ }
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/dumbster/smtp/SmtpMessage.java b/log4j-smtp/src/test/java/org/apache/logging/dumbster/smtp/SmtpMessage.java
similarity index 100%
rename from log4j-core/src/test/java/org/apache/logging/dumbster/smtp/SmtpMessage.java
rename to log4j-smtp/src/test/java/org/apache/logging/dumbster/smtp/SmtpMessage.java
diff --git a/log4j-core/src/test/java/org/apache/logging/dumbster/smtp/SmtpRequest.java b/log4j-smtp/src/test/java/org/apache/logging/dumbster/smtp/SmtpRequest.java
similarity index 97%
rename from log4j-core/src/test/java/org/apache/logging/dumbster/smtp/SmtpRequest.java
rename to log4j-smtp/src/test/java/org/apache/logging/dumbster/smtp/SmtpRequest.java
index d877292640b..7f4a9655dc3 100644
--- a/log4j-core/src/test/java/org/apache/logging/dumbster/smtp/SmtpRequest.java
+++ b/log4j-smtp/src/test/java/org/apache/logging/dumbster/smtp/SmtpRequest.java
@@ -1,232 +1,232 @@
-/*
- * 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.dumbster.smtp;
-
-import org.apache.logging.log4j.util.Strings;
-
-/**
- * Contains an SMTP client request. Handles state transitions using the following state transition table.
- *
+ */
+public class SmtpRequest {
+ /**
+ * SMTP action received from client.
+ */
+ private final SmtpActionType action;
+ /**
+ * Current state of the SMTP state table.
+ */
+ private final SmtpState state;
+ /**
+ * Additional information passed from the client with the SMTP action.
+ */
+ private final String params;
+
+ /**
+ * Create a new SMTP client request.
+ *
+ * @param actionType type of action/command
+ * @param params remainder of command line once command is removed
+ * @param state current SMTP server state
+ */
+ public SmtpRequest(final SmtpActionType actionType, final String params, final SmtpState state) {
+ this.action = actionType;
+ this.state = state;
+ this.params = params;
+ }
+
+ /**
+ * Execute the SMTP request returning a response. This method models the state transition table for the SMTP server.
+ *
+ * @return reponse to the request
+ */
+ public SmtpResponse execute() {
+ SmtpResponse response = null;
+ if (action.isStateless()) {
+ if (SmtpActionType.EXPN == action || SmtpActionType.VRFY == action) {
+ response = new SmtpResponse(252, "Not supported", this.state);
+ } else if (SmtpActionType.HELP == action) {
+ response = new SmtpResponse(211, "No help available", this.state);
+ } else if (SmtpActionType.NOOP == action) {
+ response = new SmtpResponse(250, "OK", this.state);
+ } else if (SmtpActionType.VRFY == action) {
+ response = new SmtpResponse(252, "Not supported", this.state);
+ } else if (SmtpActionType.RSET == action) {
+ response = new SmtpResponse(250, "OK", SmtpState.GREET);
+ } else {
+ response = new SmtpResponse(500, "Command not recognized", this.state);
+ }
+ } else { // Stateful commands
+ if (SmtpActionType.CONNECT == action) {
+ if (SmtpState.CONNECT == state) {
+ response = new SmtpResponse(220, "localhost Dumbster SMTP service ready", SmtpState.GREET);
+ } else {
+ response = new SmtpResponse(503, "Bad sequence of commands: " + action, this.state);
+ }
+ } else if (SmtpActionType.EHLO == action) {
+ if (SmtpState.GREET == state) {
+ response = new SmtpResponse(250, "OK", SmtpState.MAIL);
+ } else {
+ response = new SmtpResponse(503, "Bad sequence of commands: " + action, this.state);
+ }
+ } else if (SmtpActionType.MAIL == action) {
+ if (SmtpState.MAIL == state || SmtpState.QUIT == state) {
+ response = new SmtpResponse(250, "OK", SmtpState.RCPT);
+ } else {
+ response = new SmtpResponse(503, "Bad sequence of commands: " + action, this.state);
+ }
+ } else if (SmtpActionType.RCPT == action) {
+ if (SmtpState.RCPT == state) {
+ response = new SmtpResponse(250, "OK", this.state);
+ } else {
+ response = new SmtpResponse(503, "Bad sequence of commands: " + action, this.state);
+ }
+ } else if (SmtpActionType.DATA == action) {
+ if (SmtpState.RCPT == state) {
+ response = new SmtpResponse(354, "Start mail input; end with .", SmtpState.DATA_HDR);
+ } else {
+ response = new SmtpResponse(503, "Bad sequence of commands: " + action, this.state);
+ }
+ } else if (SmtpActionType.UNRECOG == action) {
+ if (SmtpState.DATA_HDR == state || SmtpState.DATA_BODY == state) {
+ response = new SmtpResponse(-1, Strings.EMPTY, this.state);
+ } else {
+ response = new SmtpResponse(500, "Command not recognized", this.state);
+ }
+ } else if (SmtpActionType.DATA_END == action) {
+ if (SmtpState.DATA_HDR == state || SmtpState.DATA_BODY == state) {
+ response = new SmtpResponse(250, "OK", SmtpState.QUIT);
+ } else {
+ response = new SmtpResponse(503, "Bad sequence of commands: " + action, this.state);
+ }
+ } else if (SmtpActionType.BLANK_LINE == action) {
+ if (SmtpState.DATA_HDR == state) {
+ response = new SmtpResponse(-1, Strings.EMPTY, SmtpState.DATA_BODY);
+ } else if (SmtpState.DATA_BODY == state) {
+ response = new SmtpResponse(-1, Strings.EMPTY, this.state);
+ } else {
+ response = new SmtpResponse(503, "Bad sequence of commands: " + action, this.state);
+ }
+ } else if (SmtpActionType.QUIT == action) {
+ if (SmtpState.QUIT == state) {
+ response = new SmtpResponse(221, "localhost Dumbster service closing transmission channel",
+ SmtpState.CONNECT);
+ } else {
+ response = new SmtpResponse(503, "Bad sequence of commands: " + action, this.state);
+ }
+ } else {
+ response = new SmtpResponse(500, "Command not recognized", this.state);
+ }
+ }
+ return response;
+ }
+
+ /**
+ * Create an SMTP request object given a line of the input stream from the client and the current internal state.
+ *
+ * @param s line of input
+ * @param state current state
+ * @return a populated SmtpRequest object
+ */
+ public static SmtpRequest createRequest(final String s, final SmtpState state) {
+ SmtpActionType action = null;
+ String params = null;
+
+ if (state == SmtpState.DATA_HDR) {
+ if (s.equals(".")) {
+ action = SmtpActionType.DATA_END;
+ } else if (s.length() < 1) {
+ action = SmtpActionType.BLANK_LINE;
+ } else {
+ action = SmtpActionType.UNRECOG;
+ params = s;
+ }
+ } else if (state == SmtpState.DATA_BODY) {
+ if (s.equals(".")) {
+ action = SmtpActionType.DATA_END;
+ } else {
+ action = SmtpActionType.UNRECOG;
+ if (s.length() < 1) {
+ params = "\n";
+ } else {
+ params = s;
+ }
+ }
+ } else {
+ final String su = s.toUpperCase();
+ if (su.startsWith("EHLO ") || su.startsWith("HELO")) {
+ action = SmtpActionType.EHLO;
+ params = s.substring(5);
+ } else if (su.startsWith("MAIL FROM:")) {
+ action = SmtpActionType.MAIL;
+ params = s.substring(10);
+ } else if (su.startsWith("RCPT TO:")) {
+ action = SmtpActionType.RCPT;
+ params = s.substring(8);
+ } else if (su.startsWith("DATA")) {
+ action = SmtpActionType.DATA;
+ } else if (su.startsWith("QUIT")) {
+ action = SmtpActionType.QUIT;
+ } else if (su.startsWith("RSET")) {
+ action = SmtpActionType.RSET;
+ } else if (su.startsWith("NOOP")) {
+ action = SmtpActionType.NOOP;
+ } else if (su.startsWith("EXPN")) {
+ action = SmtpActionType.EXPN;
+ } else if (su.startsWith("VRFY")) {
+ action = SmtpActionType.VRFY;
+ } else if (su.startsWith("HELP")) {
+ action = SmtpActionType.HELP;
+ } else {
+ action = SmtpActionType.UNRECOG;
+ }
+ }
+
+ final SmtpRequest req = new SmtpRequest(action, params, state);
+ return req;
+ }
+
+ /**
+ * Get the parameters of this request (remainder of command line once the command is removed.
+ *
+ * @return parameters
+ */
+ public String getParams() {
+ return params;
+ }
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/dumbster/smtp/SmtpResponse.java b/log4j-smtp/src/test/java/org/apache/logging/dumbster/smtp/SmtpResponse.java
similarity index 96%
rename from log4j-core/src/test/java/org/apache/logging/dumbster/smtp/SmtpResponse.java
rename to log4j-smtp/src/test/java/org/apache/logging/dumbster/smtp/SmtpResponse.java
index 7023f1c39f2..8b72ba78ba5 100644
--- a/log4j-core/src/test/java/org/apache/logging/dumbster/smtp/SmtpResponse.java
+++ b/log4j-smtp/src/test/java/org/apache/logging/dumbster/smtp/SmtpResponse.java
@@ -1,75 +1,75 @@
-/*
- * 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.dumbster.smtp;
-
-/**
- * SMTP response container.
- */
-public class SmtpResponse {
- /**
- * Response code - see RFC-2821.
- */
- private final int code;
- /**
- * Response message.
- */
- private final String message;
- /**
- * New state of the SMTP server once the request has been executed.
- */
- private final SmtpState nextState;
-
- /**
- * Constructor.
- *
- * @param code response code
- * @param message response message
- * @param next next state of the SMTP server
- */
- public SmtpResponse(final int code, final String message, final SmtpState next) {
- this.code = code;
- this.message = message;
- this.nextState = next;
- }
-
- /**
- * Get the response code.
- *
- * @return response code
- */
- public int getCode() {
- return code;
- }
-
- /**
- * Get the response message.
- *
- * @return response message
- */
- public String getMessage() {
- return message;
- }
-
- /**
- * Get the next SMTP server state.
- *
- * @return state
- */
- public SmtpState getNextState() {
- return nextState;
- }
-}
+/*
+ * 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.dumbster.smtp;
+
+/**
+ * SMTP response container.
+ */
+public class SmtpResponse {
+ /**
+ * Response code - see RFC-2821.
+ */
+ private final int code;
+ /**
+ * Response message.
+ */
+ private final String message;
+ /**
+ * New state of the SMTP server once the request has been executed.
+ */
+ private final SmtpState nextState;
+
+ /**
+ * Constructor.
+ *
+ * @param code response code
+ * @param message response message
+ * @param next next state of the SMTP server
+ */
+ public SmtpResponse(final int code, final String message, final SmtpState next) {
+ this.code = code;
+ this.message = message;
+ this.nextState = next;
+ }
+
+ /**
+ * Get the response code.
+ *
+ * @return response code
+ */
+ public int getCode() {
+ return code;
+ }
+
+ /**
+ * Get the response message.
+ *
+ * @return response message
+ */
+ public String getMessage() {
+ return message;
+ }
+
+ /**
+ * Get the next SMTP server state.
+ *
+ * @return state
+ */
+ public SmtpState getNextState() {
+ return nextState;
+ }
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/dumbster/smtp/SmtpState.java b/log4j-smtp/src/test/java/org/apache/logging/dumbster/smtp/SmtpState.java
similarity index 96%
rename from log4j-core/src/test/java/org/apache/logging/dumbster/smtp/SmtpState.java
rename to log4j-smtp/src/test/java/org/apache/logging/dumbster/smtp/SmtpState.java
index bd94b4d1431..3c8354541ea 100644
--- a/log4j-core/src/test/java/org/apache/logging/dumbster/smtp/SmtpState.java
+++ b/log4j-smtp/src/test/java/org/apache/logging/dumbster/smtp/SmtpState.java
@@ -1,121 +1,121 @@
-/*
- * 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.dumbster.smtp;
-
-/**
- * SMTP server state.
- */
-public class SmtpState {
- /**
- * Internal representation of the state.
- */
- private final byte value;
-
- /**
- * Internal representation of the CONNECT state.
- */
- private static final byte CONNECT_BYTE = (byte) 1;
- /**
- * Internal representation of the GREET state.
- */
- private static final byte GREET_BYTE = (byte) 2;
- /**
- * Internal representation of the MAIL state.
- */
- private static final byte MAIL_BYTE = (byte) 3;
- /**
- * Internal representation of the RCPT state.
- */
- private static final byte RCPT_BYTE = (byte) 4;
- /**
- * Internal representation of the DATA_HEADER state.
- */
- private static final byte DATA_HEADER_BYTE = (byte) 5;
- /**
- * Internal representation of the DATA_BODY state.
- */
- private static final byte DATA_BODY_BYTE = (byte) 6;
- /**
- * Internal representation of the QUIT state.
- */
- private static final byte QUIT_BYTE = (byte) 7;
-
- /**
- * CONNECT state: waiting for a client connection.
- */
- public static final SmtpState CONNECT = new SmtpState(CONNECT_BYTE);
- /**
- * GREET state: wating for a ELHO message.
- */
- public static final SmtpState GREET = new SmtpState(GREET_BYTE);
- /**
- * MAIL state: waiting for the MAIL FROM: command.
- */
- public static final SmtpState MAIL = new SmtpState(MAIL_BYTE);
- /**
- * RCPT state: waiting for a RCPT <email address> command.
- */
- public static final SmtpState RCPT = new SmtpState(RCPT_BYTE);
- /**
- * Waiting for headers.
- */
- public static final SmtpState DATA_HDR = new SmtpState(DATA_HEADER_BYTE);
- /**
- * Processing body text.
- */
- public static final SmtpState DATA_BODY = new SmtpState(DATA_BODY_BYTE);
- /**
- * End of client transmission.
- */
- public static final SmtpState QUIT = new SmtpState(QUIT_BYTE);
-
- /**
- * Create a new SmtpState object. Private to ensure that only valid states can be created.
- *
- * @param value one of the _BYTE values.
- */
- private SmtpState(final byte value) {
- this.value = value;
- }
-
- /**
- * String representation of this SmtpState.
- *
- * @return a String
- */
- @Override
- public String toString() {
- switch (value) {
- case CONNECT_BYTE:
- return "CONNECT";
- case GREET_BYTE:
- return "GREET";
- case MAIL_BYTE:
- return "MAIL";
- case RCPT_BYTE:
- return "RCPT";
- case DATA_HEADER_BYTE:
- return "DATA_HDR";
- case DATA_BODY_BYTE:
- return "DATA_BODY";
- case QUIT_BYTE:
- return "QUIT";
- default:
- return "Unknown";
- }
- }
-}
+/*
+ * 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.dumbster.smtp;
+
+/**
+ * SMTP server state.
+ */
+public class SmtpState {
+ /**
+ * Internal representation of the state.
+ */
+ private final byte value;
+
+ /**
+ * Internal representation of the CONNECT state.
+ */
+ private static final byte CONNECT_BYTE = (byte) 1;
+ /**
+ * Internal representation of the GREET state.
+ */
+ private static final byte GREET_BYTE = (byte) 2;
+ /**
+ * Internal representation of the MAIL state.
+ */
+ private static final byte MAIL_BYTE = (byte) 3;
+ /**
+ * Internal representation of the RCPT state.
+ */
+ private static final byte RCPT_BYTE = (byte) 4;
+ /**
+ * Internal representation of the DATA_HEADER state.
+ */
+ private static final byte DATA_HEADER_BYTE = (byte) 5;
+ /**
+ * Internal representation of the DATA_BODY state.
+ */
+ private static final byte DATA_BODY_BYTE = (byte) 6;
+ /**
+ * Internal representation of the QUIT state.
+ */
+ private static final byte QUIT_BYTE = (byte) 7;
+
+ /**
+ * CONNECT state: waiting for a client connection.
+ */
+ public static final SmtpState CONNECT = new SmtpState(CONNECT_BYTE);
+ /**
+ * GREET state: wating for a ELHO message.
+ */
+ public static final SmtpState GREET = new SmtpState(GREET_BYTE);
+ /**
+ * MAIL state: waiting for the MAIL FROM: command.
+ */
+ public static final SmtpState MAIL = new SmtpState(MAIL_BYTE);
+ /**
+ * RCPT state: waiting for a RCPT <email address> command.
+ */
+ public static final SmtpState RCPT = new SmtpState(RCPT_BYTE);
+ /**
+ * Waiting for headers.
+ */
+ public static final SmtpState DATA_HDR = new SmtpState(DATA_HEADER_BYTE);
+ /**
+ * Processing body text.
+ */
+ public static final SmtpState DATA_BODY = new SmtpState(DATA_BODY_BYTE);
+ /**
+ * End of client transmission.
+ */
+ public static final SmtpState QUIT = new SmtpState(QUIT_BYTE);
+
+ /**
+ * Create a new SmtpState object. Private to ensure that only valid states can be created.
+ *
+ * @param value one of the _BYTE values.
+ */
+ private SmtpState(final byte value) {
+ this.value = value;
+ }
+
+ /**
+ * String representation of this SmtpState.
+ *
+ * @return a String
+ */
+ @Override
+ public String toString() {
+ switch (value) {
+ case CONNECT_BYTE:
+ return "CONNECT";
+ case GREET_BYTE:
+ return "GREET";
+ case MAIL_BYTE:
+ return "MAIL";
+ case RCPT_BYTE:
+ return "RCPT";
+ case DATA_HEADER_BYTE:
+ return "DATA_HDR";
+ case DATA_BODY_BYTE:
+ return "DATA_BODY";
+ case QUIT_BYTE:
+ return "QUIT";
+ default:
+ return "Unknown";
+ }
+ }
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/dumbster/smtp/readme.txt b/log4j-smtp/src/test/java/org/apache/logging/dumbster/smtp/readme.txt
similarity index 100%
rename from log4j-core/src/test/java/org/apache/logging/dumbster/smtp/readme.txt
rename to log4j-smtp/src/test/java/org/apache/logging/dumbster/smtp/readme.txt
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SmtpAppenderAsyncTest.java b/log4j-smtp/src/test/java/org/apache/logging/log4j/core/appender/SmtpAppenderAsyncTest.java
similarity index 100%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SmtpAppenderAsyncTest.java
rename to log4j-smtp/src/test/java/org/apache/logging/log4j/core/appender/SmtpAppenderAsyncTest.java
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SmtpAppenderTest.java b/log4j-smtp/src/test/java/org/apache/logging/log4j/core/appender/SmtpAppenderTest.java
similarity index 100%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SmtpAppenderTest.java
rename to log4j-smtp/src/test/java/org/apache/logging/log4j/core/appender/SmtpAppenderTest.java
diff --git a/log4j-smtp/src/test/resources/SmtpAppenderAsyncTest.xml b/log4j-smtp/src/test/resources/SmtpAppenderAsyncTest.xml
new file mode 100644
index 00000000000..1939ddd2e96
--- /dev/null
+++ b/log4j-smtp/src/test/resources/SmtpAppenderAsyncTest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pom.xml b/pom.xml
index 86fa736dcc2..1d21f404c25 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1348,6 +1348,7 @@
log4j-jullog4j-liquibaselog4j-appserver
+ log4j-smtplog4j-osgi
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index fd8dbaf2cd8..cf7307a1d54 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -170,6 +170,9 @@
Split off Kafka support into a new module log4j-kafka.
+
+ Split off SMTP support into a new module log4j-smtp.
+
diff --git a/src/site/xdoc/manual/appenders.xml b/src/site/xdoc/manual/appenders.xml
index 9ca133d33cd..f4bba1a3fd9 100644
--- a/src/site/xdoc/manual/appenders.xml
+++ b/src/site/xdoc/manual/appenders.xml
@@ -4538,6 +4538,10 @@ public class JpaLogEntity extends AbstractLogEventWrapperEntity {
+
+ As of Log4j 2.11.0, Simple Mail Transfer Protocol (SMTP) support has moved from the existing module
+ logj-core to the new module log4j-smtp.
+
Sends an e-mail when a specific logging event occurs, typically on errors or fatal errors.
+ As of Log4j 2.11.0, CSV support has moved from the existing module logj-core to the new module log4j-csv.
+
This layout creates Comma Separated Value (CSV)
records and requires Apache Commons CSV 1.4.
From 2b5ec72851e2ab55bacd7e63cfe50f0488d343c1 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Mon, 29 Jan 2018 06:53:43 -0700
Subject: [PATCH 0013/2347] Rename Java packages to fit the Java 9 naming
module rules. List changes in release notes.
---
RELEASE-NOTES.md | 70 +++++++++++++++++++
...AbstractDriverManagerConnectionSource.java | 2 +-
.../appender/db/jdbc/JdbcH2TestHelper.java | 6 +-
.../builder/CustomConfigurationFactory.java | 2 +-
.../layout/AbstractCsvLayout.java | 4 +-
.../layout/CsvLogEventLayout.java | 2 +-
.../layout/CsvParameterLayout.java | 2 +-
...svJsonParameterLayoutFileAppenderTest.java | 2 +-
.../layout/CsvLogEventLayoutTest.java | 4 +-
.../CsvParameterLayoutAllAsyncTest.java | 4 +-
.../layout/CsvParameterLayoutTest.java | 4 +-
log4j-jdbc-dbcp2/pom.xml | 2 +-
.../PoolingDriverConnectionSource.java | 4 +-
.../PoolingDriverConnectionSourceTest.java | 4 +-
.../appender}/JeroMqAppender.java | 2 +-
.../appender}/JeroMqManager.java | 2 +-
.../appender}/JeroMqAppenderTest.java | 4 +-
.../appender}/JeroMqTestClient.java | 2 +-
.../appender/db/jpa/log4j2-h2-jpa-basic.xml | 38 ----------
.../db/jpa/log4j2-hsqldb-jpa-basic.xml | 38 ----------
.../AbstractLogEventWrapperEntity.java | 8 +--
.../appender}/BasicLogEventEntity.java | 12 ++--
.../db/jpa => jpa/appender}/JpaAppender.java | 2 +-
.../appender}/JpaDatabaseManager.java | 2 +-
.../db/jpa => jpa/appender}/package-info.java | 2 +-
.../ContextDataAttributeConverter.java | 2 +-
.../ContextDataJsonAttributeConverter.java | 2 +-
.../ContextMapAttributeConverter.java | 2 +-
.../ContextMapJsonAttributeConverter.java | 2 +-
.../ContextStackAttributeConverter.java | 2 +-
.../ContextStackJsonAttributeConverter.java | 2 +-
.../converter/InstantAttributeConverter.java | 10 ++-
.../converter/LevelAttributeConverter.java | 2 +-
.../converter/MarkerAttributeConverter.java | 2 +-
.../converter/MessageAttributeConverter.java | 2 +-
.../StackTraceElementAttributeConverter.java | 2 +-
.../ThrowableAttributeConverter.java | 2 +-
.../db => }/jpa/converter/package-info.java | 10 +--
.../appender}/AbstractJpaAppenderTest.java | 7 +-
.../appender}/JpaH2AppenderTest.java | 2 +-
.../appender}/JpaHsqldbAppenderTest.java | 3 +-
.../appender}/LogEventEntityTest.java | 5 +-
.../jpa => jpa/appender}/TestBaseEntity.java | 13 ++--
.../jpa => jpa/appender}/TestBasicEntity.java | 7 +-
.../ContextDataAttributeConverterTest.java | 3 +-
...ContextDataJsonAttributeConverterTest.java | 3 +-
.../ContextMapAttributeConverterTest.java | 3 +-
.../ContextMapJsonAttributeConverterTest.java | 3 +-
.../ContextStackAttributeConverterTest.java | 3 +-
...ontextStackJsonAttributeConverterTest.java | 3 +-
.../InstantAttributeConverterTest.java | 10 +--
.../MarkerAttributeConverterTest.java | 3 +-
.../MessageAttributeConverterTest.java | 3 +-
...ackTraceElementAttributeConverterTest.java | 3 +-
.../ThrowableAttributeConverterTest.java | 3 +-
.../test/resources/META-INF/persistence.xml | 40 +++++------
.../appender/db/jpa/log4j2-h2-jpa-basic.xml | 38 ----------
.../db/jpa/log4j2-hsqldb-jpa-basic.xml | 38 ----------
.../jpa/appender}/log4j2-h2-jpa-base.xml | 4 +-
.../appender/log4j2-h2-jpa-basic.xml} | 4 +-
.../appender}/log4j2-hsqldb-jpa-base.xml | 4 +-
.../jpa/appender/log4j2-hsqldb-jpa-basic.xml | 4 +-
.../DefaultKafkaProducerFactory.java | 2 +-
.../appender}/KafkaAppender.java | 2 +-
.../appender}/KafkaManager.java | 2 +-
.../appender}/KafkaProducerFactory.java | 2 +-
.../KafkaAppenderCloseTimeoutTest.java | 4 +-
.../appender}/KafkaAppenderTest.java | 4 +-
.../builder/ConfigurationAssemblerTest.java | 13 ++--
.../builder/ConfigurationBuilderTest.java | 11 ++-
.../builder/CustomConfigurationFactory.java | 2 +-
.../log4j/perf/jmh/JpaAppenderBenchmark.java | 2 +-
.../log4j/perf/jmh/jpa/TestBasicEntity.java | 4 +-
.../net => smtp}/MimeMessageBuilder.java | 2 +-
.../{core => smtp}/appender/SmtpAppender.java | 4 +-
.../net => smtp/appender}/SmtpManager.java | 3 +-
.../appender/SmtpAppenderAsyncTest.java | 2 +-
.../appender/SmtpAppenderTest.java | 5 +-
78 files changed, 246 insertions(+), 293 deletions(-)
rename log4j-csv/src/main/java/org/apache/logging/log4j/{core => csv}/layout/AbstractCsvLayout.java (94%)
rename log4j-csv/src/main/java/org/apache/logging/log4j/{core => csv}/layout/CsvLogEventLayout.java (99%)
rename log4j-csv/src/main/java/org/apache/logging/log4j/{core => csv}/layout/CsvParameterLayout.java (98%)
rename log4j-csv/src/test/java/org/apache/logging/log4j/{core => csv}/appender/CsvJsonParameterLayoutFileAppenderTest.java (98%)
rename log4j-csv/src/test/java/org/apache/logging/log4j/{core => csv}/layout/CsvLogEventLayoutTest.java (97%)
rename log4j-csv/src/test/java/org/apache/logging/log4j/{core => csv}/layout/CsvParameterLayoutAllAsyncTest.java (94%)
rename log4j-csv/src/test/java/org/apache/logging/log4j/{core => csv}/layout/CsvParameterLayoutTest.java (97%)
rename log4j-jdbc-dbcp2/src/main/java/org/apache/logging/log4j/{core/appender/db/jdbc => dbcp2/appender}/PoolingDriverConnectionSource.java (96%)
rename log4j-jdbc-dbcp2/src/test/java/org/apache/logging/log4j/{core/appender/db/jdbc => db/jdbc/appender}/PoolingDriverConnectionSourceTest.java (95%)
rename log4j-jeromq/src/main/java/org/apache/logging/log4j/{core/appender/mom/jeromq => jeromq/appender}/JeroMqAppender.java (99%)
rename log4j-jeromq/src/main/java/org/apache/logging/log4j/{core/appender/mom/jeromq => jeromq/appender}/JeroMqManager.java (99%)
rename log4j-jeromq/src/test/java/org/apache/logging/log4j/{core/appender/mom/jeromq => jeromq/appender}/JeroMqAppenderTest.java (97%)
rename log4j-jeromq/src/test/java/org/apache/logging/log4j/{core/appender/mom/jeromq => jeromq/appender}/JeroMqTestClient.java (97%)
delete mode 100644 log4j-jeromq/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-h2-jpa-basic.xml
delete mode 100644 log4j-jeromq/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-hsqldb-jpa-basic.xml
rename log4j-jpa/src/main/java/org/apache/logging/log4j/{core/appender/db/jpa => jpa/appender}/AbstractLogEventWrapperEntity.java (96%)
rename log4j-jpa/src/main/java/org/apache/logging/log4j/{core/appender/db/jpa => jpa/appender}/BasicLogEventEntity.java (94%)
rename log4j-jpa/src/main/java/org/apache/logging/log4j/{core/appender/db/jpa => jpa/appender}/JpaAppender.java (99%)
rename log4j-jpa/src/main/java/org/apache/logging/log4j/{core/appender/db/jpa => jpa/appender}/JpaDatabaseManager.java (99%)
rename log4j-jpa/src/main/java/org/apache/logging/log4j/{core/appender/db/jpa => jpa/appender}/package-info.java (95%)
rename log4j-jpa/src/main/java/org/apache/logging/log4j/{core/appender/db => }/jpa/converter/ContextDataAttributeConverter.java (96%)
rename log4j-jpa/src/main/java/org/apache/logging/log4j/{core/appender/db => }/jpa/converter/ContextDataJsonAttributeConverter.java (98%)
rename log4j-jpa/src/main/java/org/apache/logging/log4j/{core/appender/db => }/jpa/converter/ContextMapAttributeConverter.java (96%)
rename log4j-jpa/src/main/java/org/apache/logging/log4j/{core/appender/db => }/jpa/converter/ContextMapJsonAttributeConverter.java (97%)
rename log4j-jpa/src/main/java/org/apache/logging/log4j/{core/appender/db => }/jpa/converter/ContextStackAttributeConverter.java (97%)
rename log4j-jpa/src/main/java/org/apache/logging/log4j/{core/appender/db => }/jpa/converter/ContextStackJsonAttributeConverter.java (97%)
rename log4j-jpa/src/main/java/org/apache/logging/log4j/{core/appender/db => }/jpa/converter/InstantAttributeConverter.java (91%)
rename log4j-jpa/src/main/java/org/apache/logging/log4j/{core/appender/db => }/jpa/converter/LevelAttributeConverter.java (96%)
rename log4j-jpa/src/main/java/org/apache/logging/log4j/{core/appender/db => }/jpa/converter/MarkerAttributeConverter.java (96%)
rename log4j-jpa/src/main/java/org/apache/logging/log4j/{core/appender/db => }/jpa/converter/MessageAttributeConverter.java (96%)
rename log4j-jpa/src/main/java/org/apache/logging/log4j/{core/appender/db => }/jpa/converter/StackTraceElementAttributeConverter.java (97%)
rename log4j-jpa/src/main/java/org/apache/logging/log4j/{core/appender/db => }/jpa/converter/ThrowableAttributeConverter.java (99%)
rename log4j-jpa/src/main/java/org/apache/logging/log4j/{core/appender/db => }/jpa/converter/package-info.java (68%)
rename log4j-jpa/src/test/java/org/apache/logging/log4j/{core/appender/db/jpa => jpa/appender}/AbstractJpaAppenderTest.java (97%)
rename log4j-jpa/src/test/java/org/apache/logging/log4j/{core/appender/db/jpa => jpa/appender}/JpaH2AppenderTest.java (97%)
rename log4j-jpa/src/test/java/org/apache/logging/log4j/{core/appender/db/jpa => jpa/appender}/JpaHsqldbAppenderTest.java (97%)
rename log4j-jpa/src/test/java/org/apache/logging/log4j/{core/appender/db/jpa => jpa/appender}/LogEventEntityTest.java (95%)
rename log4j-jpa/src/test/java/org/apache/logging/log4j/{core/appender/db/jpa => jpa/appender}/TestBaseEntity.java (91%)
rename log4j-jpa/src/test/java/org/apache/logging/log4j/{core/appender/db/jpa => jpa/appender}/TestBasicEntity.java (88%)
rename log4j-jpa/src/test/java/org/apache/logging/log4j/{core/appender/db => }/jpa/converter/ContextDataAttributeConverterTest.java (95%)
rename log4j-jpa/src/test/java/org/apache/logging/log4j/{core/appender/db => }/jpa/converter/ContextDataJsonAttributeConverterTest.java (96%)
rename log4j-jpa/src/test/java/org/apache/logging/log4j/{core/appender/db => }/jpa/converter/ContextMapAttributeConverterTest.java (94%)
rename log4j-jpa/src/test/java/org/apache/logging/log4j/{core/appender/db => }/jpa/converter/ContextMapJsonAttributeConverterTest.java (95%)
rename log4j-jpa/src/test/java/org/apache/logging/log4j/{core/appender/db => }/jpa/converter/ContextStackAttributeConverterTest.java (95%)
rename log4j-jpa/src/test/java/org/apache/logging/log4j/{core/appender/db => }/jpa/converter/ContextStackJsonAttributeConverterTest.java (96%)
rename log4j-jpa/src/test/java/org/apache/logging/log4j/{core/appender/db => }/jpa/converter/InstantAttributeConverterTest.java (91%)
rename log4j-jpa/src/test/java/org/apache/logging/log4j/{core/appender/db => }/jpa/converter/MarkerAttributeConverterTest.java (96%)
rename log4j-jpa/src/test/java/org/apache/logging/log4j/{core/appender/db => }/jpa/converter/MessageAttributeConverterTest.java (95%)
rename log4j-jpa/src/test/java/org/apache/logging/log4j/{core/appender/db => }/jpa/converter/StackTraceElementAttributeConverterTest.java (98%)
rename log4j-jpa/src/test/java/org/apache/logging/log4j/{core/appender/db => }/jpa/converter/ThrowableAttributeConverterTest.java (96%)
delete mode 100644 log4j-jpa/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-h2-jpa-basic.xml
delete mode 100644 log4j-jpa/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-hsqldb-jpa-basic.xml
rename {log4j-jeromq/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa => log4j-jpa/src/test/resources/org/apache/logging/log4j/jpa/appender}/log4j2-h2-jpa-base.xml (85%)
rename log4j-jpa/src/test/resources/org/apache/logging/log4j/{core/appender/db/jpa/log4j2-h2-jpa-base.xml => jpa/appender/log4j2-h2-jpa-basic.xml} (85%)
rename log4j-jpa/src/test/resources/org/apache/logging/log4j/{core/appender/db/jpa => jpa/appender}/log4j2-hsqldb-jpa-base.xml (85%)
rename log4j-jeromq/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-hsqldb-jpa-base.xml => log4j-jpa/src/test/resources/org/apache/logging/log4j/jpa/appender/log4j2-hsqldb-jpa-basic.xml (85%)
rename log4j-kafka/src/main/java/org/apache/logging/log4j/{core/appender/mom/kafka => kafka/appender}/DefaultKafkaProducerFactory.java (96%)
rename log4j-kafka/src/main/java/org/apache/logging/log4j/{core/appender/mom/kafka => kafka/appender}/KafkaAppender.java (99%)
rename log4j-kafka/src/main/java/org/apache/logging/log4j/{core/appender/mom/kafka => kafka/appender}/KafkaManager.java (98%)
rename log4j-kafka/src/main/java/org/apache/logging/log4j/{core/appender/mom/kafka => kafka/appender}/KafkaProducerFactory.java (96%)
rename log4j-kafka/src/test/java/org/apache/logging/log4j/{core/appender/mom/kafka => kafka/appender}/KafkaAppenderCloseTimeoutTest.java (93%)
rename log4j-kafka/src/test/java/org/apache/logging/log4j/{core/appender/mom/kafka => kafka/appender}/KafkaAppenderTest.java (97%)
rename log4j-kafka/src/test/java/org/apache/logging/log4j/{core/config => kafka}/builder/ConfigurationAssemblerTest.java (92%)
rename log4j-kafka/src/test/java/org/apache/logging/log4j/{core/config => kafka}/builder/ConfigurationBuilderTest.java (95%)
rename log4j-kafka/src/test/java/org/apache/logging/log4j/{core/config => kafka}/builder/CustomConfigurationFactory.java (98%)
rename log4j-smtp/src/main/java/org/apache/logging/log4j/{core/net => smtp}/MimeMessageBuilder.java (98%)
rename log4j-smtp/src/main/java/org/apache/logging/log4j/{core => smtp}/appender/SmtpAppender.java (98%)
rename log4j-smtp/src/main/java/org/apache/logging/log4j/{core/net => smtp/appender}/SmtpManager.java (99%)
rename log4j-smtp/src/test/java/org/apache/logging/log4j/{core => smtp}/appender/SmtpAppenderAsyncTest.java (98%)
rename log4j-smtp/src/test/java/org/apache/logging/log4j/{core => smtp}/appender/SmtpAppenderTest.java (97%)
diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index fe5f8001863..4908ebb6f46 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -1,3 +1,73 @@
+# Apache Log4j 2.11.0 Release Notes
+
+## List of Binary Compatibility Breaking Changes in log4j-core
+
+Log4j 2.11.0 moves code from `log4j-core` to several new Maven modules. Dependencies to other jars that used to be
+optional in `log4j-core` are now required in the new modules. The code in these modules have been repackaged.
+
+These changes do not affect your configuration files.
+
+The new modules are:
+
+### log4j-cvs
+
+* Group ID: `org.apache.logging.log4j`
+* Artifact ID: `log4j-cvs`
+
+* Old package: `org.apache.logging.log4j.core.layout`
+* New package: `org.apache.logging.log4j.csv.layout`
+
+### log4j-jeromq
+
+* Group ID: `org.apache.logging.log4j`
+* Artifact ID: `log4j-jeromq`
+
+* Old package: `org.apache.logging.log4j.core.appender.mom.jeromq`
+* New package: `org.apache.logging.log4j.jeromq.appender`
+
+### log4j-jpa
+
+* Group ID: `org.apache.logging.log4j`
+* Artifact ID: `log4j-jpa`
+
+* Old package 1: `org.apache.logging.log4j.core.appender.db.jpa`
+* New package 1: `org.apache.logging.log4j.jpa.appender`
+
+* Old package 2: `org.apache.logging.log4j.core.appender.db.jpa.converter`
+* New package 2: `org.apache.logging.log4j.jpa.converter`
+
+### log4j-kafka
+
+* Group ID: `org.apache.logging.log4j`
+* Artifact ID: `log4j-kafka`
+
+* Old package: `org.apache.logging.log4j.core.appender.mom.kafka`
+* New package: `org.apache.logging.log4j.kafka.appender`
+
+### log4j-mongodb2
+
+* Group ID: `org.apache.logging.log4j`
+* Artifact ID: `log4j-mongodb2`
+
+* Old package: `org.apache.logging.log4j.mongodb`
+* New package: `org.apache.logging.log4j.mongodb2`
+
+### log4j-mongodb3
+
+* Group ID: `org.apache.logging.log4j`
+* Artifact ID: `log4j-mongodb3`
+
+* Old package: `org.apache.logging.log4j.mongodb`
+* New package: `org.apache.logging.log4j.mongodb3`
+
+### log4j-smtp
+
+* Group ID: `org.apache.logging.log4j`
+* Artifact ID: `log4j-smtp`
+
+* Old package: `org.apache.logging.log4j.core.appender`
+* New package: `org.apache.logging.log4j.smtp.appender`
+
# Apache Log4j 2.10.0 Release Notes
The Apache Log4j 2 team is pleased to announce the Log4j 2.10.0 release!
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/AbstractDriverManagerConnectionSource.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/AbstractDriverManagerConnectionSource.java
index 77c4391b4e4..4f25442c3c2 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/AbstractDriverManagerConnectionSource.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/AbstractDriverManagerConnectionSource.java
@@ -63,7 +63,7 @@ public static class Builder> {
private char[] userName;
@SuppressWarnings("unchecked")
- protected B asBuilder() {
+ public B asBuilder() {
return (B) this;
}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcH2TestHelper.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcH2TestHelper.java
index 1bb1f37217e..7152f1141fc 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcH2TestHelper.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcH2TestHelper.java
@@ -22,9 +22,9 @@
public class JdbcH2TestHelper {
- static final String CONNECTION_STRING = "jdbc:h2:mem:Log4j";
- static final String USER_NAME = "sa";
- static final String PASSWORD = "";
+ public static final String CONNECTION_STRING = "jdbc:h2:mem:Log4j";
+ public static final String USER_NAME = "sa";
+ public static final String PASSWORD = "";
public static ConnectionSource TEST_CONFIGURATION_SOURCE = new AbstractConnectionSource() {
@Override
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/CustomConfigurationFactory.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/CustomConfigurationFactory.java
index c8ba5aed73e..c9a3a331e2b 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/CustomConfigurationFactory.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/CustomConfigurationFactory.java
@@ -37,7 +37,7 @@
//@Order(50)
public class CustomConfigurationFactory extends ConfigurationFactory {
- static Configuration addTestFixtures(final String name, final ConfigurationBuilder builder) {
+ public static Configuration addTestFixtures(final String name, final ConfigurationBuilder builder) {
builder.setConfigurationName(name);
builder.setStatusLevel(Level.ERROR);
builder.add(builder.newScriptFile("target/test-classes/scripts/filter.groovy").addIsWatched(true));
diff --git a/log4j-csv/src/main/java/org/apache/logging/log4j/core/layout/AbstractCsvLayout.java b/log4j-csv/src/main/java/org/apache/logging/log4j/csv/layout/AbstractCsvLayout.java
similarity index 94%
rename from log4j-csv/src/main/java/org/apache/logging/log4j/core/layout/AbstractCsvLayout.java
rename to log4j-csv/src/main/java/org/apache/logging/log4j/csv/layout/AbstractCsvLayout.java
index e47b5e6f00c..f10191ded39 100644
--- a/log4j-csv/src/main/java/org/apache/logging/log4j/core/layout/AbstractCsvLayout.java
+++ b/log4j-csv/src/main/java/org/apache/logging/log4j/csv/layout/AbstractCsvLayout.java
@@ -14,13 +14,15 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.layout;
+package org.apache.logging.log4j.csv.layout;
import java.nio.charset.Charset;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.QuoteMode;
import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.layout.AbstractStringLayout;
+import org.apache.logging.log4j.core.layout.PatternLayout;
/**
* A superclass for Comma-Separated Value (CSV) layouts.
diff --git a/log4j-csv/src/main/java/org/apache/logging/log4j/core/layout/CsvLogEventLayout.java b/log4j-csv/src/main/java/org/apache/logging/log4j/csv/layout/CsvLogEventLayout.java
similarity index 99%
rename from log4j-csv/src/main/java/org/apache/logging/log4j/core/layout/CsvLogEventLayout.java
rename to log4j-csv/src/main/java/org/apache/logging/log4j/csv/layout/CsvLogEventLayout.java
index 499a3d96d1f..123e5a68f56 100644
--- a/log4j-csv/src/main/java/org/apache/logging/log4j/core/layout/CsvLogEventLayout.java
+++ b/log4j-csv/src/main/java/org/apache/logging/log4j/csv/layout/CsvLogEventLayout.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.layout;
+package org.apache.logging.log4j.csv.layout;
import java.io.IOException;
import java.nio.charset.Charset;
diff --git a/log4j-csv/src/main/java/org/apache/logging/log4j/core/layout/CsvParameterLayout.java b/log4j-csv/src/main/java/org/apache/logging/log4j/csv/layout/CsvParameterLayout.java
similarity index 98%
rename from log4j-csv/src/main/java/org/apache/logging/log4j/core/layout/CsvParameterLayout.java
rename to log4j-csv/src/main/java/org/apache/logging/log4j/csv/layout/CsvParameterLayout.java
index fe079fb590f..075c65a436c 100644
--- a/log4j-csv/src/main/java/org/apache/logging/log4j/core/layout/CsvParameterLayout.java
+++ b/log4j-csv/src/main/java/org/apache/logging/log4j/csv/layout/CsvParameterLayout.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.layout;
+package org.apache.logging.log4j.csv.layout;
import java.io.IOException;
import java.nio.charset.Charset;
diff --git a/log4j-csv/src/test/java/org/apache/logging/log4j/core/appender/CsvJsonParameterLayoutFileAppenderTest.java b/log4j-csv/src/test/java/org/apache/logging/log4j/csv/appender/CsvJsonParameterLayoutFileAppenderTest.java
similarity index 98%
rename from log4j-csv/src/test/java/org/apache/logging/log4j/core/appender/CsvJsonParameterLayoutFileAppenderTest.java
rename to log4j-csv/src/test/java/org/apache/logging/log4j/csv/appender/CsvJsonParameterLayoutFileAppenderTest.java
index 1dd7da76f3b..8f87162987b 100644
--- a/log4j-csv/src/test/java/org/apache/logging/log4j/core/appender/CsvJsonParameterLayoutFileAppenderTest.java
+++ b/log4j-csv/src/test/java/org/apache/logging/log4j/csv/appender/CsvJsonParameterLayoutFileAppenderTest.java
@@ -15,7 +15,7 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender;
+package org.apache.logging.log4j.csv.appender;
import java.io.File;
import java.io.IOException;
diff --git a/log4j-csv/src/test/java/org/apache/logging/log4j/core/layout/CsvLogEventLayoutTest.java b/log4j-csv/src/test/java/org/apache/logging/log4j/csv/layout/CsvLogEventLayoutTest.java
similarity index 97%
rename from log4j-csv/src/test/java/org/apache/logging/log4j/core/layout/CsvLogEventLayoutTest.java
rename to log4j-csv/src/test/java/org/apache/logging/log4j/csv/layout/CsvLogEventLayoutTest.java
index 0ee8861d4d5..2776b7b8acc 100644
--- a/log4j-csv/src/test/java/org/apache/logging/log4j/core/layout/CsvLogEventLayoutTest.java
+++ b/log4j-csv/src/test/java/org/apache/logging/log4j/csv/layout/CsvLogEventLayoutTest.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.layout;
+package org.apache.logging.log4j.csv.layout;
import static org.junit.Assert.assertEquals;
@@ -30,6 +30,8 @@
import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
+import org.apache.logging.log4j.csv.layout.AbstractCsvLayout;
+import org.apache.logging.log4j.csv.layout.CsvLogEventLayout;
import org.apache.logging.log4j.junit.ThreadContextRule;
import org.apache.logging.log4j.test.appender.ListAppender;
import org.junit.AfterClass;
diff --git a/log4j-csv/src/test/java/org/apache/logging/log4j/core/layout/CsvParameterLayoutAllAsyncTest.java b/log4j-csv/src/test/java/org/apache/logging/log4j/csv/layout/CsvParameterLayoutAllAsyncTest.java
similarity index 94%
rename from log4j-csv/src/test/java/org/apache/logging/log4j/core/layout/CsvParameterLayoutAllAsyncTest.java
rename to log4j-csv/src/test/java/org/apache/logging/log4j/csv/layout/CsvParameterLayoutAllAsyncTest.java
index 1e9d3ddda03..4b3d8aefcef 100644
--- a/log4j-csv/src/test/java/org/apache/logging/log4j/core/layout/CsvParameterLayoutAllAsyncTest.java
+++ b/log4j-csv/src/test/java/org/apache/logging/log4j/csv/layout/CsvParameterLayoutAllAsyncTest.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.layout;
+package org.apache.logging.log4j.csv.layout;
import org.apache.commons.csv.CSVFormat;
import org.apache.logging.log4j.LogManager;
@@ -23,6 +23,8 @@
import org.apache.logging.log4j.core.async.AsyncLoggerContextSelector;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.util.Constants;
+import org.apache.logging.log4j.csv.layout.AbstractCsvLayout;
+import org.apache.logging.log4j.csv.layout.CsvParameterLayout;
import org.apache.logging.log4j.util.Strings;
import org.junit.AfterClass;
import org.junit.BeforeClass;
diff --git a/log4j-csv/src/test/java/org/apache/logging/log4j/core/layout/CsvParameterLayoutTest.java b/log4j-csv/src/test/java/org/apache/logging/log4j/csv/layout/CsvParameterLayoutTest.java
similarity index 97%
rename from log4j-csv/src/test/java/org/apache/logging/log4j/core/layout/CsvParameterLayoutTest.java
rename to log4j-csv/src/test/java/org/apache/logging/log4j/csv/layout/CsvParameterLayoutTest.java
index e7d1074efdb..568a8332ffd 100644
--- a/log4j-csv/src/test/java/org/apache/logging/log4j/core/layout/CsvParameterLayoutTest.java
+++ b/log4j-csv/src/test/java/org/apache/logging/log4j/csv/layout/CsvParameterLayoutTest.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.layout;
+package org.apache.logging.log4j.csv.layout;
import static org.junit.Assert.assertEquals;
@@ -32,6 +32,8 @@
import org.apache.logging.log4j.categories.Layouts;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.Logger;
+import org.apache.logging.log4j.csv.layout.AbstractCsvLayout;
+import org.apache.logging.log4j.csv.layout.CsvParameterLayout;
import org.apache.logging.log4j.junit.LoggerContextRule;
import org.apache.logging.log4j.junit.ThreadContextRule;
import org.apache.logging.log4j.message.ObjectArrayMessage;
diff --git a/log4j-jdbc-dbcp2/pom.xml b/log4j-jdbc-dbcp2/pom.xml
index 18e0e863bc7..3155019a842 100644
--- a/log4j-jdbc-dbcp2/pom.xml
+++ b/log4j-jdbc-dbcp2/pom.xml
@@ -25,7 +25,7 @@
${basedir}/..Log4j JDBC DBCP 2 Documentation/log4j-jdbc-dbcp2
- org.apache.logging.log4j.jdbc.dbcp2
+ org.apache.logging.log4j.dbcp2
diff --git a/log4j-jdbc-dbcp2/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/PoolingDriverConnectionSource.java b/log4j-jdbc-dbcp2/src/main/java/org/apache/logging/log4j/dbcp2/appender/PoolingDriverConnectionSource.java
similarity index 96%
rename from log4j-jdbc-dbcp2/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/PoolingDriverConnectionSource.java
rename to log4j-jdbc-dbcp2/src/main/java/org/apache/logging/log4j/dbcp2/appender/PoolingDriverConnectionSource.java
index f408d26a7ff..6734e178034 100644
--- a/log4j-jdbc-dbcp2/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/PoolingDriverConnectionSource.java
+++ b/log4j-jdbc-dbcp2/src/main/java/org/apache/logging/log4j/dbcp2/appender/PoolingDriverConnectionSource.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jdbc;
+package org.apache.logging.log4j.dbcp2.appender;
import java.sql.DriverManager;
import java.sql.SQLException;
@@ -28,6 +28,8 @@
import org.apache.commons.pool2.ObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.logging.log4j.core.Core;
+import org.apache.logging.log4j.core.appender.db.jdbc.AbstractDriverManagerConnectionSource;
+import org.apache.logging.log4j.core.appender.db.jdbc.ConnectionSource;
import org.apache.logging.log4j.core.config.Property;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
diff --git a/log4j-jdbc-dbcp2/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/PoolingDriverConnectionSourceTest.java b/log4j-jdbc-dbcp2/src/test/java/org/apache/logging/log4j/db/jdbc/appender/PoolingDriverConnectionSourceTest.java
similarity index 95%
rename from log4j-jdbc-dbcp2/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/PoolingDriverConnectionSourceTest.java
rename to log4j-jdbc-dbcp2/src/test/java/org/apache/logging/log4j/db/jdbc/appender/PoolingDriverConnectionSourceTest.java
index 72dc3d49a43..56740f628bc 100644
--- a/log4j-jdbc-dbcp2/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/PoolingDriverConnectionSourceTest.java
+++ b/log4j-jdbc-dbcp2/src/test/java/org/apache/logging/log4j/db/jdbc/appender/PoolingDriverConnectionSourceTest.java
@@ -15,12 +15,14 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jdbc;
+package org.apache.logging.log4j.db.jdbc.appender;
import java.sql.Connection;
import java.sql.SQLException;
+import org.apache.logging.log4j.core.appender.db.jdbc.JdbcH2TestHelper;
import org.apache.logging.log4j.core.config.Property;
+import org.apache.logging.log4j.dbcp2.appender.PoolingDriverConnectionSource;
import org.junit.Assert;
import org.junit.Test;
diff --git a/log4j-jeromq/src/main/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqAppender.java b/log4j-jeromq/src/main/java/org/apache/logging/log4j/jeromq/appender/JeroMqAppender.java
similarity index 99%
rename from log4j-jeromq/src/main/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqAppender.java
rename to log4j-jeromq/src/main/java/org/apache/logging/log4j/jeromq/appender/JeroMqAppender.java
index aa78fad87d8..3e20288e420 100644
--- a/log4j-jeromq/src/main/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqAppender.java
+++ b/log4j-jeromq/src/main/java/org/apache/logging/log4j/jeromq/appender/JeroMqAppender.java
@@ -15,7 +15,7 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.mom.jeromq;
+package org.apache.logging.log4j.jeromq.appender;
import java.io.Serializable;
import java.util.ArrayList;
diff --git a/log4j-jeromq/src/main/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqManager.java b/log4j-jeromq/src/main/java/org/apache/logging/log4j/jeromq/appender/JeroMqManager.java
similarity index 99%
rename from log4j-jeromq/src/main/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqManager.java
rename to log4j-jeromq/src/main/java/org/apache/logging/log4j/jeromq/appender/JeroMqManager.java
index 0326ebe8ca2..494f13d7cf5 100644
--- a/log4j-jeromq/src/main/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqManager.java
+++ b/log4j-jeromq/src/main/java/org/apache/logging/log4j/jeromq/appender/JeroMqManager.java
@@ -15,7 +15,7 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.mom.jeromq;
+package org.apache.logging.log4j.jeromq.appender;
import java.util.Arrays;
import java.util.List;
diff --git a/log4j-jeromq/src/test/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqAppenderTest.java b/log4j-jeromq/src/test/java/org/apache/logging/log4j/jeromq/appender/JeroMqAppenderTest.java
similarity index 97%
rename from log4j-jeromq/src/test/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqAppenderTest.java
rename to log4j-jeromq/src/test/java/org/apache/logging/log4j/jeromq/appender/JeroMqAppenderTest.java
index 24b8d25dab6..fa8be866246 100644
--- a/log4j-jeromq/src/test/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqAppenderTest.java
+++ b/log4j-jeromq/src/test/java/org/apache/logging/log4j/jeromq/appender/JeroMqAppenderTest.java
@@ -15,7 +15,7 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.mom.jeromq;
+package org.apache.logging.log4j.jeromq.appender;
import java.util.List;
import java.util.concurrent.ExecutorService;
@@ -27,6 +27,8 @@
import org.apache.logging.log4j.categories.Appenders;
import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.core.util.ExecutorServices;
+import org.apache.logging.log4j.jeromq.appender.JeroMqAppender;
+import org.apache.logging.log4j.jeromq.appender.JeroMqManager;
import org.apache.logging.log4j.junit.LoggerContextRule;
import org.junit.Assert;
import org.junit.ClassRule;
diff --git a/log4j-jeromq/src/test/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqTestClient.java b/log4j-jeromq/src/test/java/org/apache/logging/log4j/jeromq/appender/JeroMqTestClient.java
similarity index 97%
rename from log4j-jeromq/src/test/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqTestClient.java
rename to log4j-jeromq/src/test/java/org/apache/logging/log4j/jeromq/appender/JeroMqTestClient.java
index b84cc729f72..494be9d91fe 100644
--- a/log4j-jeromq/src/test/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqTestClient.java
+++ b/log4j-jeromq/src/test/java/org/apache/logging/log4j/jeromq/appender/JeroMqTestClient.java
@@ -15,7 +15,7 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.mom.jeromq;
+package org.apache.logging.log4j.jeromq.appender;
import java.util.ArrayList;
import java.util.List;
diff --git a/log4j-jeromq/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-h2-jpa-basic.xml b/log4j-jeromq/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-h2-jpa-basic.xml
deleted file mode 100644
index af3a0b74620..00000000000
--- a/log4j-jeromq/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-h2-jpa-basic.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/log4j-jeromq/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-hsqldb-jpa-basic.xml b/log4j-jeromq/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-hsqldb-jpa-basic.xml
deleted file mode 100644
index 8215ea3a2b9..00000000000
--- a/log4j-jeromq/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-hsqldb-jpa-basic.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/AbstractLogEventWrapperEntity.java b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/appender/AbstractLogEventWrapperEntity.java
similarity index 96%
rename from log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/AbstractLogEventWrapperEntity.java
rename to log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/appender/AbstractLogEventWrapperEntity.java
index 8504f7a5007..91d1394056b 100644
--- a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/AbstractLogEventWrapperEntity.java
+++ b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/appender/AbstractLogEventWrapperEntity.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa;
+package org.apache.logging.log4j.jpa.appender;
import java.util.Map;
import javax.persistence.Inheritance;
@@ -27,9 +27,9 @@
import org.apache.logging.log4j.ThreadContext;
import org.apache.logging.log4j.core.AbstractLogEvent;
import org.apache.logging.log4j.core.time.Instant;
+import org.apache.logging.log4j.jpa.converter.ContextDataAttributeConverter;
import org.apache.logging.log4j.util.ReadOnlyStringMap;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.appender.db.jpa.converter.ContextDataAttributeConverter;
import org.apache.logging.log4j.core.impl.Log4jLogEvent;
import org.apache.logging.log4j.message.Message;
@@ -56,7 +56,7 @@
* {@link org.apache.logging.log4j.ThreadContext.ContextStack ThreadContext.ContextStack}, and
* {@link Map Map<String, String>}) will not be recognized by the JPA provider. In conjunction with
* {@link javax.persistence.Convert @Convert}, you can use the converters in the
- * {@link org.apache.logging.log4j.core.appender.db.jpa.converter} package to convert these types to database columns.
+ * {@link org.apache.logging.log4j.jpa.converter} package to convert these types to database columns.
* If you want to retrieve log events from the database, you can create a true POJO entity and also use these
* converters for extracting persisted values.
*
@@ -323,7 +323,7 @@ public final void setEndOfBatch(final boolean endOfBatch) {
*
* @return the context data.
* @see ContextDataAttributeConverter
- * @see org.apache.logging.log4j.core.appender.db.jpa.converter.ContextDataAttributeConverter
+ * @see org.apache.logging.log4j.jpa.converter.ContextDataAttributeConverter
*/
@Override
@Transient
diff --git a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/BasicLogEventEntity.java b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/appender/BasicLogEventEntity.java
similarity index 94%
rename from log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/BasicLogEventEntity.java
rename to log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/appender/BasicLogEventEntity.java
index fa52501c2b0..f48fd46b57c 100644
--- a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/BasicLogEventEntity.java
+++ b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/appender/BasicLogEventEntity.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa;
+package org.apache.logging.log4j.jpa.appender;
import java.util.Map;
import javax.persistence.Basic;
@@ -26,9 +26,9 @@
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.ThreadContext;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.appender.db.jpa.converter.*;
import org.apache.logging.log4j.core.impl.ThrowableProxy;
import org.apache.logging.log4j.core.time.Instant;
+import org.apache.logging.log4j.jpa.converter.*;
import org.apache.logging.log4j.message.Message;
/**
@@ -49,8 +49,8 @@
* {@link ContextMapAttributeConverter} and {@link ContextStackAttributeConverter}, respectively. These convert the
* properties to simple strings that cannot be converted back to the properties. If you wish to instead convert these to
* a reversible JSON string, override these attributes with the same annotations but use the
- * {@link org.apache.logging.log4j.core.appender.db.jpa.converter.ContextMapJsonAttributeConverter} and
- * {@link org.apache.logging.log4j.core.appender.db.jpa.converter.ContextStackJsonAttributeConverter} instead.
+ * {@link org.apache.logging.log4j.jpa.converter.ContextMapJsonAttributeConverter} and
+ * {@link org.apache.logging.log4j.jpa.converter.ContextStackJsonAttributeConverter} instead.
*
* All other attributes in this entity use reversible converters that can be used for both persistence and retrieval. If
* there are any attributes you do not want persistent, you should override their accessor methods and annotate with
@@ -231,7 +231,7 @@ public ThrowableProxy getThrownProxy() {
*
* @return the context map.
* @see ContextMapAttributeConverter
- * @see org.apache.logging.log4j.core.appender.db.jpa.converter.ContextMapJsonAttributeConverter
+ * @see org.apache.logging.log4j.jpa.converter.ContextMapJsonAttributeConverter
*/
@SuppressWarnings("deprecation")
@Override
@@ -245,7 +245,7 @@ public Map getContextMap() {
*
* @return the context stack.
* @see ContextStackAttributeConverter
- * @see org.apache.logging.log4j.core.appender.db.jpa.converter.ContextStackJsonAttributeConverter
+ * @see org.apache.logging.log4j.jpa.converter.ContextStackJsonAttributeConverter
*/
@Override
@Convert(converter = ContextStackAttributeConverter.class)
diff --git a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/JpaAppender.java b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/appender/JpaAppender.java
similarity index 99%
rename from log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/JpaAppender.java
rename to log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/appender/JpaAppender.java
index aee94e8ea1e..46fc66c3bb2 100644
--- a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/JpaAppender.java
+++ b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/appender/JpaAppender.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa;
+package org.apache.logging.log4j.jpa.appender;
import java.lang.reflect.Constructor;
diff --git a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/JpaDatabaseManager.java b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/appender/JpaDatabaseManager.java
similarity index 99%
rename from log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/JpaDatabaseManager.java
rename to log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/appender/JpaDatabaseManager.java
index b2d36a8b253..fda26af7c9c 100644
--- a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/JpaDatabaseManager.java
+++ b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/appender/JpaDatabaseManager.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa;
+package org.apache.logging.log4j.jpa.appender;
import java.io.Serializable;
import java.lang.reflect.Constructor;
diff --git a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/package-info.java b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/appender/package-info.java
similarity index 95%
rename from log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/package-info.java
rename to log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/appender/package-info.java
index 3434faa1639..13f40c953d4 100644
--- a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/package-info.java
+++ b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/appender/package-info.java
@@ -20,4 +20,4 @@
* and your JPA provider of choice on the class path; these Maven dependencies are optional and will not automatically
* be added to your classpath.
*/
-package org.apache.logging.log4j.core.appender.db.jpa;
+package org.apache.logging.log4j.jpa.appender;
diff --git a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextDataAttributeConverter.java b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ContextDataAttributeConverter.java
similarity index 96%
rename from log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextDataAttributeConverter.java
rename to log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ContextDataAttributeConverter.java
index ede6706b601..d3b1db2f431 100644
--- a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextDataAttributeConverter.java
+++ b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ContextDataAttributeConverter.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa.converter;
+package org.apache.logging.log4j.jpa.converter;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
diff --git a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextDataJsonAttributeConverter.java b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ContextDataJsonAttributeConverter.java
similarity index 98%
rename from log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextDataJsonAttributeConverter.java
rename to log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ContextDataJsonAttributeConverter.java
index b6c57edd9ad..b2981729c4a 100644
--- a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextDataJsonAttributeConverter.java
+++ b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ContextDataJsonAttributeConverter.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa.converter;
+package org.apache.logging.log4j.jpa.converter;
import java.io.IOException;
import java.util.Iterator;
diff --git a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextMapAttributeConverter.java b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ContextMapAttributeConverter.java
similarity index 96%
rename from log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextMapAttributeConverter.java
rename to log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ContextMapAttributeConverter.java
index 0561c952ed8..374a6cebab1 100644
--- a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextMapAttributeConverter.java
+++ b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ContextMapAttributeConverter.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa.converter;
+package org.apache.logging.log4j.jpa.converter;
import java.util.Map;
diff --git a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextMapJsonAttributeConverter.java b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ContextMapJsonAttributeConverter.java
similarity index 97%
rename from log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextMapJsonAttributeConverter.java
rename to log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ContextMapJsonAttributeConverter.java
index 385cc647638..94d039fecfb 100644
--- a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextMapJsonAttributeConverter.java
+++ b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ContextMapJsonAttributeConverter.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa.converter;
+package org.apache.logging.log4j.jpa.converter;
import java.io.IOException;
import java.util.Map;
diff --git a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextStackAttributeConverter.java b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ContextStackAttributeConverter.java
similarity index 97%
rename from log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextStackAttributeConverter.java
rename to log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ContextStackAttributeConverter.java
index 18e1dbf4711..d9090ca9caf 100644
--- a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextStackAttributeConverter.java
+++ b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ContextStackAttributeConverter.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa.converter;
+package org.apache.logging.log4j.jpa.converter;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
diff --git a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextStackJsonAttributeConverter.java b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ContextStackJsonAttributeConverter.java
similarity index 97%
rename from log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextStackJsonAttributeConverter.java
rename to log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ContextStackJsonAttributeConverter.java
index 49dec9e2ea0..ab66679d1c8 100644
--- a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextStackJsonAttributeConverter.java
+++ b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ContextStackJsonAttributeConverter.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa.converter;
+package org.apache.logging.log4j.jpa.converter;
import java.io.IOException;
import java.util.List;
diff --git a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/InstantAttributeConverter.java b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/InstantAttributeConverter.java
similarity index 91%
rename from log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/InstantAttributeConverter.java
rename to log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/InstantAttributeConverter.java
index 9e0120eb2be..1f41e6cd112 100644
--- a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/InstantAttributeConverter.java
+++ b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/InstantAttributeConverter.java
@@ -14,23 +14,21 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa.converter;
+package org.apache.logging.log4j.jpa.converter;
+
+import javax.persistence.AttributeConverter;
+import javax.persistence.Converter;
import org.apache.logging.log4j.core.time.Instant;
import org.apache.logging.log4j.core.time.MutableInstant;
-import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.Strings;
-import javax.persistence.AttributeConverter;
-import javax.persistence.Converter;
-
/**
* A JPA 2.1 attribute converter for {@link Instant}s in {@link org.apache.logging.log4j.core.LogEvent}s. This
* converter is capable of converting both to and from {@link String}s.
*/
@Converter(autoApply = false)
public class InstantAttributeConverter implements AttributeConverter {
- private static final StatusLogger LOGGER = StatusLogger.getLogger();
@Override
public String convertToDatabaseColumn(final Instant instant) {
diff --git a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/LevelAttributeConverter.java b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/LevelAttributeConverter.java
similarity index 96%
rename from log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/LevelAttributeConverter.java
rename to log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/LevelAttributeConverter.java
index c418a648cdf..4a543b9287a 100644
--- a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/LevelAttributeConverter.java
+++ b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/LevelAttributeConverter.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa.converter;
+package org.apache.logging.log4j.jpa.converter;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
diff --git a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/MarkerAttributeConverter.java b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/MarkerAttributeConverter.java
similarity index 96%
rename from log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/MarkerAttributeConverter.java
rename to log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/MarkerAttributeConverter.java
index a8bb072215e..c133473ba50 100644
--- a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/MarkerAttributeConverter.java
+++ b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/MarkerAttributeConverter.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa.converter;
+package org.apache.logging.log4j.jpa.converter;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
diff --git a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/MessageAttributeConverter.java b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/MessageAttributeConverter.java
similarity index 96%
rename from log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/MessageAttributeConverter.java
rename to log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/MessageAttributeConverter.java
index e369c29ba00..5046fb8d5cf 100644
--- a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/MessageAttributeConverter.java
+++ b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/MessageAttributeConverter.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa.converter;
+package org.apache.logging.log4j.jpa.converter;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
diff --git a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/StackTraceElementAttributeConverter.java b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/StackTraceElementAttributeConverter.java
similarity index 97%
rename from log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/StackTraceElementAttributeConverter.java
rename to log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/StackTraceElementAttributeConverter.java
index b34822d79e3..a6ffe31d71c 100644
--- a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/StackTraceElementAttributeConverter.java
+++ b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/StackTraceElementAttributeConverter.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa.converter;
+package org.apache.logging.log4j.jpa.converter;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
diff --git a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ThrowableAttributeConverter.java b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ThrowableAttributeConverter.java
similarity index 99%
rename from log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ThrowableAttributeConverter.java
rename to log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ThrowableAttributeConverter.java
index bbec3197527..0a3b876836f 100644
--- a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ThrowableAttributeConverter.java
+++ b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ThrowableAttributeConverter.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa.converter;
+package org.apache.logging.log4j.jpa.converter;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
diff --git a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/package-info.java b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/package-info.java
similarity index 68%
rename from log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/package-info.java
rename to log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/package-info.java
index 2245fa7713c..51d9afb368a 100644
--- a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/package-info.java
+++ b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/package-info.java
@@ -20,13 +20,13 @@
* The converters in this package implement the JPA 2.1 mechanism for converting non-standard types to and from
* database fields. Most of these types are capable of two-way conversion and can be used to both persist and retrieve
* entities. The
- * {@link org.apache.logging.log4j.core.appender.db.jpa.converter.ContextMapAttributeConverter ContextMapAttributeConverter}
- * and {@link org.apache.logging.log4j.core.appender.db.jpa.converter.ContextStackAttributeConverter ContextStackAttributeConverter}
+ * {@link org.apache.logging.log4j.jpa.converter.ContextMapAttributeConverter ContextMapAttributeConverter}
+ * and {@link org.apache.logging.log4j.jpa.converter.ContextStackAttributeConverter ContextStackAttributeConverter}
* only support persistence and not retrieval, persisting the type as a simple string. You can use the
- * {@link org.apache.logging.log4j.core.appender.db.jpa.converter.ContextMapJsonAttributeConverter ContextMapJsonAttributeConverter}
- * and {@link org.apache.logging.log4j.core.appender.db.jpa.converter.ContextStackJsonAttributeConverter ContextStackJsonAttributeConverter}
+ * {@link org.apache.logging.log4j.jpa.converter.ContextMapJsonAttributeConverter ContextMapJsonAttributeConverter}
+ * and {@link org.apache.logging.log4j.jpa.converter.ContextStackJsonAttributeConverter ContextStackJsonAttributeConverter}
* instead, which require the Jackson Data Processor dependency to also be on your class path.
*/
//CHECKSTYLE:ON
-package org.apache.logging.log4j.core.appender.db.jpa.converter;
+package org.apache.logging.log4j.jpa.converter;
diff --git a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/AbstractJpaAppenderTest.java b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/appender/AbstractJpaAppenderTest.java
similarity index 97%
rename from log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/AbstractJpaAppenderTest.java
rename to log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/appender/AbstractJpaAppenderTest.java
index 6ff3c14a866..1d451e09512 100644
--- a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/AbstractJpaAppenderTest.java
+++ b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/appender/AbstractJpaAppenderTest.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa;
+package org.apache.logging.log4j.jpa.appender;
import java.io.ByteArrayOutputStream;
import java.io.PrintWriter;
@@ -30,6 +30,7 @@
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.config.DefaultConfiguration;
+import org.apache.logging.log4j.jpa.appender.JpaAppender;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.PropertiesUtil;
import org.junit.Test;
@@ -51,8 +52,10 @@ public AbstractJpaAppenderTest(final String databaseType) {
public void setUp(final String configFileName) throws SQLException {
this.connection = this.setUpConnection();
+ final String resource = "org/apache/logging/log4j/jpa/appender/" + configFileName;
+ assertNotNull(getClass().getClassLoader().getResource(resource));
System.setProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY,
- "org/apache/logging/log4j/core/appender/db/jpa/" + configFileName);
+ resource);
PropertiesUtil.getProperties().reload();
final LoggerContext context = LoggerContext.getContext(false);
if (context.getConfiguration() instanceof DefaultConfiguration) {
diff --git a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/JpaH2AppenderTest.java b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/appender/JpaH2AppenderTest.java
similarity index 97%
rename from log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/JpaH2AppenderTest.java
rename to log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/appender/JpaH2AppenderTest.java
index 9b299b92cf8..f6bf26baefc 100644
--- a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/JpaH2AppenderTest.java
+++ b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/appender/JpaH2AppenderTest.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa;
+package org.apache.logging.log4j.jpa.appender;
import java.sql.Connection;
import java.sql.DriverManager;
diff --git a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/JpaHsqldbAppenderTest.java b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/appender/JpaHsqldbAppenderTest.java
similarity index 97%
rename from log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/JpaHsqldbAppenderTest.java
rename to log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/appender/JpaHsqldbAppenderTest.java
index b91734d0b22..24b5862743a 100644
--- a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/JpaHsqldbAppenderTest.java
+++ b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/appender/JpaHsqldbAppenderTest.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa;
+package org.apache.logging.log4j.jpa.appender;
import java.sql.Connection;
import java.sql.DriverManager;
@@ -23,6 +23,7 @@
import org.apache.logging.log4j.categories.Appenders;
import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.jpa.appender.JpaAppender;
import org.apache.logging.log4j.util.Strings;
import org.junit.Test;
import org.junit.experimental.categories.Category;
diff --git a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/LogEventEntityTest.java b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/appender/LogEventEntityTest.java
similarity index 95%
rename from log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/LogEventEntityTest.java
rename to log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/appender/LogEventEntityTest.java
index b70c754f76c..502b4fa860d 100644
--- a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/LogEventEntityTest.java
+++ b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/appender/LogEventEntityTest.java
@@ -15,7 +15,7 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa;
+package org.apache.logging.log4j.jpa.appender;
import java.util.Map;
@@ -26,6 +26,7 @@
import org.apache.logging.log4j.core.impl.ThrowableProxy;
import org.apache.logging.log4j.core.time.Instant;
import org.apache.logging.log4j.core.time.MutableInstant;
+import org.apache.logging.log4j.jpa.appender.AbstractLogEventWrapperEntity;
import org.apache.logging.log4j.message.Message;
import org.junit.Assert;
import org.junit.Test;
@@ -36,7 +37,7 @@ public class LogEventEntityTest {
public void testToImmutable_AbstractLogEventWrapperEntity() {
final LogEvent logEvent = new AbstractLogEventWrapperEntity() {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 2L;
@Override
public Map getContextMap() {
diff --git a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/TestBaseEntity.java b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/appender/TestBaseEntity.java
similarity index 91%
rename from log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/TestBaseEntity.java
rename to log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/appender/TestBaseEntity.java
index 2171de47c27..522372a499c 100644
--- a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/TestBaseEntity.java
+++ b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/appender/TestBaseEntity.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa;
+package org.apache.logging.log4j.jpa.appender;
import java.util.Date;
import java.util.Map;
@@ -34,20 +34,21 @@
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.ThreadContext;
-import org.apache.logging.log4j.core.appender.db.jpa.converter.InstantAttributeConverter;
import org.apache.logging.log4j.core.time.Instant;
+import org.apache.logging.log4j.jpa.appender.AbstractLogEventWrapperEntity;
+import org.apache.logging.log4j.jpa.converter.InstantAttributeConverter;
+import org.apache.logging.log4j.jpa.converter.LevelAttributeConverter;
+import org.apache.logging.log4j.jpa.converter.MessageAttributeConverter;
+import org.apache.logging.log4j.jpa.converter.ThrowableAttributeConverter;
import org.apache.logging.log4j.util.ReadOnlyStringMap;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.appender.db.jpa.converter.LevelAttributeConverter;
-import org.apache.logging.log4j.core.appender.db.jpa.converter.MessageAttributeConverter;
-import org.apache.logging.log4j.core.appender.db.jpa.converter.ThrowableAttributeConverter;
import org.apache.logging.log4j.core.impl.ThrowableProxy;
import org.apache.logging.log4j.message.Message;
@Entity
@Table(name = "jpaBaseLogEntry")
public class TestBaseEntity extends AbstractLogEventWrapperEntity {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 2L;
private long id = 0L;
diff --git a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/TestBasicEntity.java b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/appender/TestBasicEntity.java
similarity index 88%
rename from log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/TestBasicEntity.java
rename to log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/appender/TestBasicEntity.java
index b804078aa37..b98d525e7c8 100644
--- a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/TestBasicEntity.java
+++ b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/appender/TestBasicEntity.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa;
+package org.apache.logging.log4j.jpa.appender;
import java.util.Map;
@@ -27,13 +27,14 @@
import javax.persistence.Table;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.appender.db.jpa.converter.ContextMapJsonAttributeConverter;
+import org.apache.logging.log4j.jpa.appender.BasicLogEventEntity;
+import org.apache.logging.log4j.jpa.converter.ContextMapJsonAttributeConverter;
@Entity
@Table(name = "jpaBasicLogEntry")
@SuppressWarnings("unused")
public class TestBasicEntity extends BasicLogEventEntity {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 2L;
private long id = 0L;
diff --git a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextDataAttributeConverterTest.java b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/ContextDataAttributeConverterTest.java
similarity index 95%
rename from log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextDataAttributeConverterTest.java
rename to log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/ContextDataAttributeConverterTest.java
index 41306a1b516..5c8a12b30e3 100644
--- a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextDataAttributeConverterTest.java
+++ b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/ContextDataAttributeConverterTest.java
@@ -14,9 +14,10 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa.converter;
+package org.apache.logging.log4j.jpa.converter;
import org.apache.logging.log4j.categories.Appenders;
+import org.apache.logging.log4j.jpa.converter.ContextDataAttributeConverter;
import org.apache.logging.log4j.util.SortedArrayStringMap;
import org.apache.logging.log4j.util.StringMap;
import org.junit.Before;
diff --git a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextDataJsonAttributeConverterTest.java b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/ContextDataJsonAttributeConverterTest.java
similarity index 96%
rename from log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextDataJsonAttributeConverterTest.java
rename to log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/ContextDataJsonAttributeConverterTest.java
index 161a23e4c29..fc0a588b874 100644
--- a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextDataJsonAttributeConverterTest.java
+++ b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/ContextDataJsonAttributeConverterTest.java
@@ -14,9 +14,10 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa.converter;
+package org.apache.logging.log4j.jpa.converter;
import org.apache.logging.log4j.categories.Appenders;
+import org.apache.logging.log4j.jpa.converter.ContextDataJsonAttributeConverter;
import org.apache.logging.log4j.util.ReadOnlyStringMap;
import org.apache.logging.log4j.util.SortedArrayStringMap;
import org.apache.logging.log4j.util.StringMap;
diff --git a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextMapAttributeConverterTest.java b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/ContextMapAttributeConverterTest.java
similarity index 94%
rename from log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextMapAttributeConverterTest.java
rename to log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/ContextMapAttributeConverterTest.java
index e755d7f0889..2f2d6ea3d8a 100644
--- a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextMapAttributeConverterTest.java
+++ b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/ContextMapAttributeConverterTest.java
@@ -14,12 +14,13 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa.converter;
+package org.apache.logging.log4j.jpa.converter;
import java.util.HashMap;
import java.util.Map;
import org.apache.logging.log4j.categories.Appenders;
+import org.apache.logging.log4j.jpa.converter.ContextMapAttributeConverter;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
diff --git a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextMapJsonAttributeConverterTest.java b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/ContextMapJsonAttributeConverterTest.java
similarity index 95%
rename from log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextMapJsonAttributeConverterTest.java
rename to log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/ContextMapJsonAttributeConverterTest.java
index 07af863ea65..8b9571e1ffd 100644
--- a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextMapJsonAttributeConverterTest.java
+++ b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/ContextMapJsonAttributeConverterTest.java
@@ -14,12 +14,13 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa.converter;
+package org.apache.logging.log4j.jpa.converter;
import java.util.HashMap;
import java.util.Map;
import org.apache.logging.log4j.categories.Appenders;
+import org.apache.logging.log4j.jpa.converter.ContextMapJsonAttributeConverter;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
diff --git a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextStackAttributeConverterTest.java b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/ContextStackAttributeConverterTest.java
similarity index 95%
rename from log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextStackAttributeConverterTest.java
rename to log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/ContextStackAttributeConverterTest.java
index 57ae0a7e999..452eaf28b80 100644
--- a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextStackAttributeConverterTest.java
+++ b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/ContextStackAttributeConverterTest.java
@@ -14,12 +14,13 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa.converter;
+package org.apache.logging.log4j.jpa.converter;
import java.util.Arrays;
import org.apache.logging.log4j.ThreadContext;
import org.apache.logging.log4j.categories.Appenders;
+import org.apache.logging.log4j.jpa.converter.ContextStackAttributeConverter;
import org.apache.logging.log4j.spi.MutableThreadContextStack;
import org.junit.Before;
import org.junit.Test;
diff --git a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextStackJsonAttributeConverterTest.java b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/ContextStackJsonAttributeConverterTest.java
similarity index 96%
rename from log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextStackJsonAttributeConverterTest.java
rename to log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/ContextStackJsonAttributeConverterTest.java
index 0fae006fbfa..de8700eed62 100644
--- a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ContextStackJsonAttributeConverterTest.java
+++ b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/ContextStackJsonAttributeConverterTest.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa.converter;
+package org.apache.logging.log4j.jpa.converter;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@@ -24,6 +24,7 @@
import org.apache.logging.log4j.ThreadContext;
import org.apache.logging.log4j.categories.Appenders;
+import org.apache.logging.log4j.jpa.converter.ContextStackJsonAttributeConverter;
import org.apache.logging.log4j.junit.ThreadContextStackRule;
import org.apache.logging.log4j.spi.MutableThreadContextStack;
import org.junit.Before;
diff --git a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/InstantAttributeConverterTest.java b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/InstantAttributeConverterTest.java
similarity index 91%
rename from log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/InstantAttributeConverterTest.java
rename to log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/InstantAttributeConverterTest.java
index f4970a99b5a..e7a495ed256 100644
--- a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/InstantAttributeConverterTest.java
+++ b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/InstantAttributeConverterTest.java
@@ -14,21 +14,21 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa.converter;
+package org.apache.logging.log4j.jpa.converter;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
import org.apache.logging.log4j.categories.Appenders;
import org.apache.logging.log4j.core.time.Instant;
import org.apache.logging.log4j.core.time.MutableInstant;
-import org.apache.logging.log4j.status.StatusLogger;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
-import static org.junit.Assert.*;
-
@Category(Appenders.Jpa.class)
public class InstantAttributeConverterTest {
- private static final StatusLogger LOGGER = StatusLogger.getLogger();
private InstantAttributeConverter converter;
diff --git a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/MarkerAttributeConverterTest.java b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/MarkerAttributeConverterTest.java
similarity index 96%
rename from log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/MarkerAttributeConverterTest.java
rename to log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/MarkerAttributeConverterTest.java
index 334bf1eac39..cacf59cdbc4 100644
--- a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/MarkerAttributeConverterTest.java
+++ b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/MarkerAttributeConverterTest.java
@@ -14,11 +14,12 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa.converter;
+package org.apache.logging.log4j.jpa.converter;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;
import org.apache.logging.log4j.categories.Appenders;
+import org.apache.logging.log4j.jpa.converter.MarkerAttributeConverter;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
diff --git a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/MessageAttributeConverterTest.java b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/MessageAttributeConverterTest.java
similarity index 95%
rename from log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/MessageAttributeConverterTest.java
rename to log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/MessageAttributeConverterTest.java
index e665dd66fa9..9b16dbd78cf 100644
--- a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/MessageAttributeConverterTest.java
+++ b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/MessageAttributeConverterTest.java
@@ -14,9 +14,10 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa.converter;
+package org.apache.logging.log4j.jpa.converter;
import org.apache.logging.log4j.categories.Appenders;
+import org.apache.logging.log4j.jpa.converter.MessageAttributeConverter;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.status.StatusLogger;
import org.junit.Before;
diff --git a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/StackTraceElementAttributeConverterTest.java b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/StackTraceElementAttributeConverterTest.java
similarity index 98%
rename from log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/StackTraceElementAttributeConverterTest.java
rename to log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/StackTraceElementAttributeConverterTest.java
index 6da0d93e9d6..d0e6d094049 100644
--- a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/StackTraceElementAttributeConverterTest.java
+++ b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/StackTraceElementAttributeConverterTest.java
@@ -14,9 +14,10 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa.converter;
+package org.apache.logging.log4j.jpa.converter;
import org.apache.logging.log4j.categories.Appenders;
+import org.apache.logging.log4j.jpa.converter.StackTraceElementAttributeConverter;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
diff --git a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ThrowableAttributeConverterTest.java b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/ThrowableAttributeConverterTest.java
similarity index 96%
rename from log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ThrowableAttributeConverterTest.java
rename to log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/ThrowableAttributeConverterTest.java
index 95deb6fb8eb..f06eee97139 100644
--- a/log4j-jpa/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/converter/ThrowableAttributeConverterTest.java
+++ b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/converter/ThrowableAttributeConverterTest.java
@@ -14,11 +14,12 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jpa.converter;
+package org.apache.logging.log4j.jpa.converter;
import java.sql.SQLException;
import org.apache.logging.log4j.categories.Appenders;
+import org.apache.logging.log4j.jpa.converter.ThrowableAttributeConverter;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
diff --git a/log4j-jpa/src/test/resources/META-INF/persistence.xml b/log4j-jpa/src/test/resources/META-INF/persistence.xml
index d80073902c5..209ae2176ec 100644
--- a/log4j-jpa/src/test/resources/META-INF/persistence.xml
+++ b/log4j-jpa/src/test/resources/META-INF/persistence.xml
@@ -24,16 +24,16 @@
org.eclipse.persistence.jpa.PersistenceProvider
- org.apache.logging.log4j.core.appender.db.jpa.converter.ContextMapAttributeConverter
- org.apache.logging.log4j.core.appender.db.jpa.converter.ContextMapJsonAttributeConverter
- org.apache.logging.log4j.core.appender.db.jpa.converter.ContextStackAttributeConverter
- org.apache.logging.log4j.core.appender.db.jpa.converter.ContextStackJsonAttributeConverter
- org.apache.logging.log4j.core.appender.db.jpa.converter.InstantAttributeConverter
- org.apache.logging.log4j.core.appender.db.jpa.converter.LevelAttributeConverter
- org.apache.logging.log4j.core.appender.db.jpa.converter.MarkerAttributeConverter
- org.apache.logging.log4j.core.appender.db.jpa.converter.MessageAttributeConverter
- org.apache.logging.log4j.core.appender.db.jpa.converter.StackTraceElementAttributeConverter
- org.apache.logging.log4j.core.appender.db.jpa.converter.ThrowableAttributeConverter
+ org.apache.logging.log4j.jpa.converter.ContextMapAttributeConverter
+ org.apache.logging.log4j.jpa.converter.ContextMapJsonAttributeConverter
+ org.apache.logging.log4j.jpa.converter.ContextStackAttributeConverter
+ org.apache.logging.log4j.jpa.converter.ContextStackJsonAttributeConverter
+ org.apache.logging.log4j.jpa.converter.InstantAttributeConverter
+ org.apache.logging.log4j.jpa.converter.LevelAttributeConverter
+ org.apache.logging.log4j.jpa.converter.MarkerAttributeConverter
+ org.apache.logging.log4j.jpa.converter.MessageAttributeConverter
+ org.apache.logging.log4j.jpa.converter.StackTraceElementAttributeConverter
+ org.apache.logging.log4j.jpa.converter.ThrowableAttributeConverterfalseNONE
@@ -49,16 +49,16 @@
org.eclipse.persistence.jpa.PersistenceProvider
- org.apache.logging.log4j.core.appender.db.jpa.converter.ContextMapAttributeConverter
- org.apache.logging.log4j.core.appender.db.jpa.converter.ContextMapJsonAttributeConverter
- org.apache.logging.log4j.core.appender.db.jpa.converter.ContextStackAttributeConverter
- org.apache.logging.log4j.core.appender.db.jpa.converter.ContextStackJsonAttributeConverter
- org.apache.logging.log4j.core.appender.db.jpa.converter.InstantAttributeConverter
- org.apache.logging.log4j.core.appender.db.jpa.converter.LevelAttributeConverter
- org.apache.logging.log4j.core.appender.db.jpa.converter.MarkerAttributeConverter
- org.apache.logging.log4j.core.appender.db.jpa.converter.MessageAttributeConverter
- org.apache.logging.log4j.core.appender.db.jpa.converter.StackTraceElementAttributeConverter
- org.apache.logging.log4j.core.appender.db.jpa.converter.ThrowableAttributeConverter
+ org.apache.logging.log4j.jpa.converter.ContextMapAttributeConverter
+ org.apache.logging.log4j.jpa.converter.ContextMapJsonAttributeConverter
+ org.apache.logging.log4j.jpa.converter.ContextStackAttributeConverter
+ org.apache.logging.log4j.jpa.converter.ContextStackJsonAttributeConverter
+ org.apache.logging.log4j.jpa.converter.InstantAttributeConverter
+ org.apache.logging.log4j.jpa.converter.LevelAttributeConverter
+ org.apache.logging.log4j.jpa.converter.MarkerAttributeConverter
+ org.apache.logging.log4j.jpa.converter.MessageAttributeConverter
+ org.apache.logging.log4j.jpa.converter.StackTraceElementAttributeConverter
+ org.apache.logging.log4j.jpa.converter.ThrowableAttributeConverterfalseNONE
diff --git a/log4j-jpa/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-h2-jpa-basic.xml b/log4j-jpa/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-h2-jpa-basic.xml
deleted file mode 100644
index af3a0b74620..00000000000
--- a/log4j-jpa/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-h2-jpa-basic.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/log4j-jpa/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-hsqldb-jpa-basic.xml b/log4j-jpa/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-hsqldb-jpa-basic.xml
deleted file mode 100644
index 8215ea3a2b9..00000000000
--- a/log4j-jpa/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-hsqldb-jpa-basic.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/log4j-jeromq/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-h2-jpa-base.xml b/log4j-jpa/src/test/resources/org/apache/logging/log4j/jpa/appender/log4j2-h2-jpa-base.xml
similarity index 85%
rename from log4j-jeromq/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-h2-jpa-base.xml
rename to log4j-jpa/src/test/resources/org/apache/logging/log4j/jpa/appender/log4j2-h2-jpa-base.xml
index ad22f659779..75471eee5a8 100644
--- a/log4j-jeromq/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-h2-jpa-base.xml
+++ b/log4j-jpa/src/test/resources/org/apache/logging/log4j/jpa/appender/log4j2-h2-jpa-base.xml
@@ -22,11 +22,11 @@
+ entityClassName="org.apache.logging.log4j.jpa.appender.TestBaseEntity" ignoreExceptions="false" />
-
+
diff --git a/log4j-jpa/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-h2-jpa-base.xml b/log4j-jpa/src/test/resources/org/apache/logging/log4j/jpa/appender/log4j2-h2-jpa-basic.xml
similarity index 85%
rename from log4j-jpa/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-h2-jpa-base.xml
rename to log4j-jpa/src/test/resources/org/apache/logging/log4j/jpa/appender/log4j2-h2-jpa-basic.xml
index ad22f659779..3b04abf9dad 100644
--- a/log4j-jpa/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-h2-jpa-base.xml
+++ b/log4j-jpa/src/test/resources/org/apache/logging/log4j/jpa/appender/log4j2-h2-jpa-basic.xml
@@ -22,11 +22,11 @@
+ entityClassName="org.apache.logging.log4j.jpa.appender.TestBasicEntity" ignoreExceptions="false" />
-
+
diff --git a/log4j-jpa/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-hsqldb-jpa-base.xml b/log4j-jpa/src/test/resources/org/apache/logging/log4j/jpa/appender/log4j2-hsqldb-jpa-base.xml
similarity index 85%
rename from log4j-jpa/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-hsqldb-jpa-base.xml
rename to log4j-jpa/src/test/resources/org/apache/logging/log4j/jpa/appender/log4j2-hsqldb-jpa-base.xml
index 3f6e50a0367..a03f3907511 100644
--- a/log4j-jpa/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-hsqldb-jpa-base.xml
+++ b/log4j-jpa/src/test/resources/org/apache/logging/log4j/jpa/appender/log4j2-hsqldb-jpa-base.xml
@@ -22,11 +22,11 @@
+ entityClassName="org.apache.logging.log4j.jpa.appender.TestBaseEntity" ignoreExceptions="false" />
-
+
diff --git a/log4j-jeromq/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-hsqldb-jpa-base.xml b/log4j-jpa/src/test/resources/org/apache/logging/log4j/jpa/appender/log4j2-hsqldb-jpa-basic.xml
similarity index 85%
rename from log4j-jeromq/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-hsqldb-jpa-base.xml
rename to log4j-jpa/src/test/resources/org/apache/logging/log4j/jpa/appender/log4j2-hsqldb-jpa-basic.xml
index 3f6e50a0367..7d369394d91 100644
--- a/log4j-jeromq/src/test/resources/org/apache/logging/log4j/core/appender/db/jpa/log4j2-hsqldb-jpa-base.xml
+++ b/log4j-jpa/src/test/resources/org/apache/logging/log4j/jpa/appender/log4j2-hsqldb-jpa-basic.xml
@@ -22,11 +22,11 @@
+ entityClassName="org.apache.logging.log4j.jpa.appender.TestBasicEntity" ignoreExceptions="false" />
-
+
diff --git a/log4j-kafka/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/DefaultKafkaProducerFactory.java b/log4j-kafka/src/main/java/org/apache/logging/log4j/kafka/appender/DefaultKafkaProducerFactory.java
similarity index 96%
rename from log4j-kafka/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/DefaultKafkaProducerFactory.java
rename to log4j-kafka/src/main/java/org/apache/logging/log4j/kafka/appender/DefaultKafkaProducerFactory.java
index e0b39219dbc..da9ab921bf5 100644
--- a/log4j-kafka/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/DefaultKafkaProducerFactory.java
+++ b/log4j-kafka/src/main/java/org/apache/logging/log4j/kafka/appender/DefaultKafkaProducerFactory.java
@@ -15,7 +15,7 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.mom.kafka;
+package org.apache.logging.log4j.kafka.appender;
import java.util.Properties;
diff --git a/log4j-kafka/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaAppender.java b/log4j-kafka/src/main/java/org/apache/logging/log4j/kafka/appender/KafkaAppender.java
similarity index 99%
rename from log4j-kafka/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaAppender.java
rename to log4j-kafka/src/main/java/org/apache/logging/log4j/kafka/appender/KafkaAppender.java
index f7d50af4b8a..687a9e7a83e 100644
--- a/log4j-kafka/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaAppender.java
+++ b/log4j-kafka/src/main/java/org/apache/logging/log4j/kafka/appender/KafkaAppender.java
@@ -15,7 +15,7 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.mom.kafka;
+package org.apache.logging.log4j.kafka.appender;
import java.io.Serializable;
import java.util.Objects;
diff --git a/log4j-kafka/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaManager.java b/log4j-kafka/src/main/java/org/apache/logging/log4j/kafka/appender/KafkaManager.java
similarity index 98%
rename from log4j-kafka/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaManager.java
rename to log4j-kafka/src/main/java/org/apache/logging/log4j/kafka/appender/KafkaManager.java
index 9af11cd6931..dfb1d135a15 100644
--- a/log4j-kafka/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaManager.java
+++ b/log4j-kafka/src/main/java/org/apache/logging/log4j/kafka/appender/KafkaManager.java
@@ -15,7 +15,7 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.mom.kafka;
+package org.apache.logging.log4j.kafka.appender;
import java.nio.charset.StandardCharsets;
import java.util.Objects;
diff --git a/log4j-kafka/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaProducerFactory.java b/log4j-kafka/src/main/java/org/apache/logging/log4j/kafka/appender/KafkaProducerFactory.java
similarity index 96%
rename from log4j-kafka/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaProducerFactory.java
rename to log4j-kafka/src/main/java/org/apache/logging/log4j/kafka/appender/KafkaProducerFactory.java
index 7532bb84afb..21944923bfd 100644
--- a/log4j-kafka/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaProducerFactory.java
+++ b/log4j-kafka/src/main/java/org/apache/logging/log4j/kafka/appender/KafkaProducerFactory.java
@@ -15,7 +15,7 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.mom.kafka;
+package org.apache.logging.log4j.kafka.appender;
import java.util.Properties;
diff --git a/log4j-kafka/src/test/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaAppenderCloseTimeoutTest.java b/log4j-kafka/src/test/java/org/apache/logging/log4j/kafka/appender/KafkaAppenderCloseTimeoutTest.java
similarity index 93%
rename from log4j-kafka/src/test/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaAppenderCloseTimeoutTest.java
rename to log4j-kafka/src/test/java/org/apache/logging/log4j/kafka/appender/KafkaAppenderCloseTimeoutTest.java
index a8d3566b97f..25cdd608f5a 100644
--- a/log4j-kafka/src/test/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaAppenderCloseTimeoutTest.java
+++ b/log4j-kafka/src/test/java/org/apache/logging/log4j/kafka/appender/KafkaAppenderCloseTimeoutTest.java
@@ -15,7 +15,7 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.mom.kafka;
+package org.apache.logging.log4j.kafka.appender;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
@@ -25,6 +25,8 @@
import org.apache.logging.log4j.categories.Appenders;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.junit.LoggerContextRule;
+import org.apache.logging.log4j.kafka.appender.KafkaManager;
+import org.apache.logging.log4j.kafka.appender.KafkaProducerFactory;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Rule;
diff --git a/log4j-kafka/src/test/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaAppenderTest.java b/log4j-kafka/src/test/java/org/apache/logging/log4j/kafka/appender/KafkaAppenderTest.java
similarity index 97%
rename from log4j-kafka/src/test/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaAppenderTest.java
rename to log4j-kafka/src/test/java/org/apache/logging/log4j/kafka/appender/KafkaAppenderTest.java
index 613bd7455ce..c1a38cbeab6 100644
--- a/log4j-kafka/src/test/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaAppenderTest.java
+++ b/log4j-kafka/src/test/java/org/apache/logging/log4j/kafka/appender/KafkaAppenderTest.java
@@ -15,7 +15,7 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.mom.kafka;
+package org.apache.logging.log4j.kafka.appender;
import java.io.ByteArrayInputStream;
import java.io.IOException;
@@ -36,6 +36,8 @@
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.impl.Log4jLogEvent;
import org.apache.logging.log4j.junit.LoggerContextRule;
+import org.apache.logging.log4j.kafka.appender.KafkaManager;
+import org.apache.logging.log4j.kafka.appender.KafkaProducerFactory;
import org.apache.logging.log4j.message.SimpleMessage;
import org.apache.logging.log4j.util.FilteredObjectInputStream;
import org.junit.Before;
diff --git a/log4j-kafka/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationAssemblerTest.java b/log4j-kafka/src/test/java/org/apache/logging/log4j/kafka/builder/ConfigurationAssemblerTest.java
similarity index 92%
rename from log4j-kafka/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationAssemblerTest.java
rename to log4j-kafka/src/test/java/org/apache/logging/log4j/kafka/builder/ConfigurationAssemblerTest.java
index ec4f541bd34..4e60fb6d2c4 100644
--- a/log4j-kafka/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationAssemblerTest.java
+++ b/log4j-kafka/src/test/java/org/apache/logging/log4j/kafka/builder/ConfigurationAssemblerTest.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.builder;
+package org.apache.logging.log4j.kafka.builder;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -31,7 +31,6 @@
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.LifeCycle;
import org.apache.logging.log4j.core.LoggerContext;
-import org.apache.logging.log4j.core.appender.mom.kafka.KafkaAppender;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.config.Configurator;
@@ -43,6 +42,7 @@
import org.apache.logging.log4j.core.filter.ThresholdFilter;
import org.apache.logging.log4j.core.layout.GelfLayout;
import org.apache.logging.log4j.core.util.Constants;
+import org.apache.logging.log4j.kafka.appender.KafkaAppender;
import org.junit.Test;
/**
@@ -55,7 +55,8 @@ public void testBuildConfiguration() throws Exception {
try {
System.setProperty(Constants.LOG4J_CONTEXT_SELECTOR,
"org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");
- final ConfigurationBuilder builder = ConfigurationBuilderFactory.newConfigurationBuilder();
+ final ConfigurationBuilder builder = ConfigurationBuilderFactory
+ .newConfigurationBuilder();
CustomConfigurationFactory.addTestFixtures("config name", builder);
final Configuration configuration = builder.build();
try (LoggerContext ctx = Configurator.initialize(configuration)) {
@@ -70,7 +71,7 @@ public void testBuildConfiguration() throws Exception {
public void testCustomConfigurationFactory() throws Exception {
try {
System.setProperty(ConfigurationFactory.CONFIGURATION_FACTORY_PROPERTY,
- "org.apache.logging.log4j.core.config.builder.CustomConfigurationFactory");
+ "org.apache.logging.log4j.kafka.builder.CustomConfigurationFactory");
System.setProperty(Constants.LOG4J_CONTEXT_SELECTOR,
"org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");
final Configuration config = ((LoggerContext) LogManager.getContext(false)).getConfiguration();
@@ -90,8 +91,8 @@ private void validate(final Configuration config) {
final Map appenders = config.getAppenders();
assertNotNull(appenders);
assertTrue("Incorrect number of Appenders: " + appenders.size(), appenders.size() == 2);
- final KafkaAppender kafkaAppender = (KafkaAppender)appenders.get("Kafka");
- final GelfLayout gelfLayout = (GelfLayout)kafkaAppender.getLayout();
+ final KafkaAppender kafkaAppender = (KafkaAppender) appenders.get("Kafka");
+ final GelfLayout gelfLayout = (GelfLayout) kafkaAppender.getLayout();
final Map loggers = config.getLoggers();
assertNotNull(loggers);
assertTrue("Incorrect number of LoggerConfigs: " + loggers.size(), loggers.size() == 2);
diff --git a/log4j-kafka/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationBuilderTest.java b/log4j-kafka/src/test/java/org/apache/logging/log4j/kafka/builder/ConfigurationBuilderTest.java
similarity index 95%
rename from log4j-kafka/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationBuilderTest.java
rename to log4j-kafka/src/test/java/org/apache/logging/log4j/kafka/builder/ConfigurationBuilderTest.java
index bbb7f104141..0d263fe8795 100644
--- a/log4j-kafka/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationBuilderTest.java
+++ b/log4j-kafka/src/test/java/org/apache/logging/log4j/kafka/builder/ConfigurationBuilderTest.java
@@ -14,7 +14,9 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.builder;
+package org.apache.logging.log4j.kafka.builder;
+
+import static org.junit.Assert.assertEquals;
import java.util.concurrent.TimeUnit;
@@ -27,9 +29,6 @@
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
import org.junit.Test;
-import static org.junit.Assert.*;
-import static org.junit.Assume.assumeTrue;
-
public class ConfigurationBuilderTest {
private static final String INDENT = " ";
@@ -70,7 +69,7 @@ private void addTestFixtures(final String name, final ConfigurationBuilder" + EOL +
+ "" + EOL +
"" + EOL +
INDENT + "" + EOL +
INDENT + INDENT + "MyValue" + EOL +
@@ -110,7 +109,7 @@ private void addTestFixtures(final String name, final ConfigurationBuilder builder = ConfigurationBuilderFactory.newConfigurationBuilder();
addTestFixtures("config name", builder);
final String xmlConfiguration = builder.toXmlConfiguration();
diff --git a/log4j-kafka/src/test/java/org/apache/logging/log4j/core/config/builder/CustomConfigurationFactory.java b/log4j-kafka/src/test/java/org/apache/logging/log4j/kafka/builder/CustomConfigurationFactory.java
similarity index 98%
rename from log4j-kafka/src/test/java/org/apache/logging/log4j/core/config/builder/CustomConfigurationFactory.java
rename to log4j-kafka/src/test/java/org/apache/logging/log4j/kafka/builder/CustomConfigurationFactory.java
index 847f79e75e0..4c8a3421c6d 100644
--- a/log4j-kafka/src/test/java/org/apache/logging/log4j/core/config/builder/CustomConfigurationFactory.java
+++ b/log4j-kafka/src/test/java/org/apache/logging/log4j/kafka/builder/CustomConfigurationFactory.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.builder;
+package org.apache.logging.log4j.kafka.builder;
import java.net.URI;
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/JpaAppenderBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/JpaAppenderBenchmark.java
index 462b74aed56..2d9f9aad536 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/JpaAppenderBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/JpaAppenderBenchmark.java
@@ -26,10 +26,10 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.LoggerContext;
-import org.apache.logging.log4j.core.appender.db.jpa.JpaAppender;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.config.DefaultConfiguration;
import org.apache.logging.log4j.core.util.Closer;
+import org.apache.logging.log4j.jpa.appender.JpaAppender;
import org.apache.logging.log4j.status.StatusLogger;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/jpa/TestBasicEntity.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/jpa/TestBasicEntity.java
index b1e43d4d773..eb559250899 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/jpa/TestBasicEntity.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/jpa/TestBasicEntity.java
@@ -27,8 +27,8 @@
import javax.persistence.Table;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.appender.db.jpa.BasicLogEventEntity;
-import org.apache.logging.log4j.core.appender.db.jpa.converter.ContextMapJsonAttributeConverter;
+import org.apache.logging.log4j.jpa.appender.BasicLogEventEntity;
+import org.apache.logging.log4j.jpa.converter.ContextMapJsonAttributeConverter;
@Entity
@Table(name = "jpaBasicLogEntry")
diff --git a/log4j-smtp/src/main/java/org/apache/logging/log4j/core/net/MimeMessageBuilder.java b/log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/MimeMessageBuilder.java
similarity index 98%
rename from log4j-smtp/src/main/java/org/apache/logging/log4j/core/net/MimeMessageBuilder.java
rename to log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/MimeMessageBuilder.java
index b4d2549b995..9c57d919eec 100644
--- a/log4j-smtp/src/main/java/org/apache/logging/log4j/core/net/MimeMessageBuilder.java
+++ b/log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/MimeMessageBuilder.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.net;
+package org.apache.logging.log4j.smtp;
import java.nio.charset.StandardCharsets;
diff --git a/log4j-smtp/src/main/java/org/apache/logging/log4j/core/appender/SmtpAppender.java b/log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/appender/SmtpAppender.java
similarity index 98%
rename from log4j-smtp/src/main/java/org/apache/logging/log4j/core/appender/SmtpAppender.java
rename to log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/appender/SmtpAppender.java
index e3aac4dbdd4..4d5b73b6fbe 100644
--- a/log4j-smtp/src/main/java/org/apache/logging/log4j/core/appender/SmtpAppender.java
+++ b/log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/appender/SmtpAppender.java
@@ -15,7 +15,7 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender;
+package org.apache.logging.log4j.smtp.appender;
import java.io.Serializable;
@@ -24,6 +24,7 @@
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.DefaultConfiguration;
import org.apache.logging.log4j.core.config.plugins.Plugin;
@@ -35,7 +36,6 @@
import org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidPort;
import org.apache.logging.log4j.core.filter.ThresholdFilter;
import org.apache.logging.log4j.core.layout.HtmlLayout;
-import org.apache.logging.log4j.core.net.SmtpManager;
import org.apache.logging.log4j.core.util.Booleans;
/**
diff --git a/log4j-smtp/src/main/java/org/apache/logging/log4j/core/net/SmtpManager.java b/log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/appender/SmtpManager.java
similarity index 99%
rename from log4j-smtp/src/main/java/org/apache/logging/log4j/core/net/SmtpManager.java
rename to log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/appender/SmtpManager.java
index 84b07fe44cf..4f1c4a14331 100644
--- a/log4j-smtp/src/main/java/org/apache/logging/log4j/core/net/SmtpManager.java
+++ b/log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/appender/SmtpManager.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.net;
+package org.apache.logging.log4j.smtp.appender;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@@ -50,6 +50,7 @@
import org.apache.logging.log4j.core.util.NameUtil;
import org.apache.logging.log4j.core.util.NetUtils;
import org.apache.logging.log4j.message.ReusableMessage;
+import org.apache.logging.log4j.smtp.MimeMessageBuilder;
import org.apache.logging.log4j.util.PropertiesUtil;
import org.apache.logging.log4j.util.Strings;
diff --git a/log4j-smtp/src/test/java/org/apache/logging/log4j/core/appender/SmtpAppenderAsyncTest.java b/log4j-smtp/src/test/java/org/apache/logging/log4j/smtp/appender/SmtpAppenderAsyncTest.java
similarity index 98%
rename from log4j-smtp/src/test/java/org/apache/logging/log4j/core/appender/SmtpAppenderAsyncTest.java
rename to log4j-smtp/src/test/java/org/apache/logging/log4j/smtp/appender/SmtpAppenderAsyncTest.java
index 91503d3b0a4..e0225cbd2df 100644
--- a/log4j-smtp/src/test/java/org/apache/logging/log4j/core/appender/SmtpAppenderAsyncTest.java
+++ b/log4j-smtp/src/test/java/org/apache/logging/log4j/smtp/appender/SmtpAppenderAsyncTest.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender;
+package org.apache.logging.log4j.smtp.appender;
import org.apache.logging.dumbster.smtp.SimpleSmtpServer;
import org.apache.logging.dumbster.smtp.SmtpMessage;
diff --git a/log4j-smtp/src/test/java/org/apache/logging/log4j/core/appender/SmtpAppenderTest.java b/log4j-smtp/src/test/java/org/apache/logging/log4j/smtp/appender/SmtpAppenderTest.java
similarity index 97%
rename from log4j-smtp/src/test/java/org/apache/logging/log4j/core/appender/SmtpAppenderTest.java
rename to log4j-smtp/src/test/java/org/apache/logging/log4j/smtp/appender/SmtpAppenderTest.java
index 61b9b92797d..599093c1c58 100644
--- a/log4j-smtp/src/test/java/org/apache/logging/log4j/core/appender/SmtpAppenderTest.java
+++ b/log4j-smtp/src/test/java/org/apache/logging/log4j/smtp/appender/SmtpAppenderTest.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender;
+package org.apache.logging.log4j.smtp.appender;
import java.util.Iterator;
import javax.mail.Address;
@@ -29,7 +29,8 @@
import org.apache.logging.log4j.categories.Appenders;
import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.core.LoggerContext;
-import org.apache.logging.log4j.core.net.MimeMessageBuilder;
+import org.apache.logging.log4j.smtp.MimeMessageBuilder;
+import org.apache.logging.log4j.smtp.appender.SmtpAppender;
import org.apache.logging.log4j.test.AvailablePortFinder;
import org.junit.Test;
import org.junit.experimental.categories.Category;
From 10ba5a1396cd3221f4063454d1e40c22c86e3317 Mon Sep 17 00:00:00 2001
From: rpopma
Date: Tue, 30 Jan 2018 00:26:08 +0900
Subject: [PATCH 0014/2347] LOG4J2-2225 partial revert to preserve binary
compatibility for common use cases (ClockFactory and SystemNanoClock)
---
.../cassandra/ClockTimestampGenerator.java | 2 +-
.../rolling/action/IfLastModified.java | 2 +-
.../logging/log4j/core/async/AsyncLogger.java | 2 +-
.../logging/log4j/core/filter/TimeFilter.java | 2 +-
.../log4j/core/impl/Log4jLogEvent.java | 2 +-
.../core/impl/ReusableLogEventFactory.java | 2 +-
.../log4j/core/pattern/PatternParser.java | 2 +-
.../time/{internal => }/ClockFactory.java | 8 +++-
.../time/{internal => }/SystemNanoClock.java | 3 +-
.../logging/log4j/core/util/ClockFactory.java | 37 +++++++++++++++++++
.../log4j/core/util/SystemNanoClock.java | 35 ++++++++++++++++++
.../log4j/core/TimestampMessageTest.java | 4 +-
.../JsonCompleteFileAppenderTest.java | 2 +-
.../core/async/AsyncLoggerTestNanoTime.java | 2 +-
.../AsyncLoggerTimestampMessageTest.java | 4 +-
.../log4j/core/filter/TimeFilterTest.java | 4 +-
.../core/impl/Log4jLogEventNanoTimeTest.java | 2 +-
.../log4j/core/impl/Log4jLogEventTest.java | 4 +-
.../log4j/core/pattern/PatternParserTest.java | 2 +-
.../time/{internal => }/ClockFactoryTest.java | 9 ++---
.../{internal => }/SystemNanoClockTest.java | 9 ++---
21 files changed, 107 insertions(+), 32 deletions(-)
rename log4j-core/src/main/java/org/apache/logging/log4j/core/time/{internal => }/ClockFactory.java (93%)
rename log4j-core/src/main/java/org/apache/logging/log4j/core/time/{internal => }/SystemNanoClock.java (95%)
create mode 100644 log4j-core/src/main/java/org/apache/logging/log4j/core/util/ClockFactory.java
create mode 100644 log4j-core/src/main/java/org/apache/logging/log4j/core/util/SystemNanoClock.java
rename log4j-core/src/test/java/org/apache/logging/log4j/core/time/{internal => }/ClockFactoryTest.java (96%)
rename log4j-core/src/test/java/org/apache/logging/log4j/core/time/{internal => }/SystemNanoClockTest.java (89%)
diff --git a/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/ClockTimestampGenerator.java b/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/ClockTimestampGenerator.java
index 50d7bc4ae85..be9611ddbc9 100644
--- a/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/ClockTimestampGenerator.java
+++ b/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/ClockTimestampGenerator.java
@@ -18,7 +18,7 @@
import com.datastax.driver.core.TimestampGenerator;
import org.apache.logging.log4j.core.util.Clock;
-import org.apache.logging.log4j.core.time.internal.ClockFactory;
+import org.apache.logging.log4j.core.time.ClockFactory;
/**
* A {@link TimestampGenerator} implementation using the configured {@link Clock}.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfLastModified.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfLastModified.java
index 66902d7d501..5aba668c941 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfLastModified.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfLastModified.java
@@ -31,7 +31,7 @@
import org.apache.logging.log4j.core.config.plugins.PluginElement;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
import org.apache.logging.log4j.core.util.Clock;
-import org.apache.logging.log4j.core.time.internal.ClockFactory;
+import org.apache.logging.log4j.core.time.ClockFactory;
import org.apache.logging.log4j.status.StatusLogger;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java
index fd7c6f6acb8..e32f2101dd0 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java
@@ -31,7 +31,7 @@
import org.apache.logging.log4j.core.impl.ContextDataFactory;
import org.apache.logging.log4j.core.impl.ContextDataInjectorFactory;
import org.apache.logging.log4j.core.util.Clock;
-import org.apache.logging.log4j.core.time.internal.ClockFactory;
+import org.apache.logging.log4j.core.time.ClockFactory;
import org.apache.logging.log4j.core.util.NanoClock;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.message.MessageFactory;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/TimeFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/TimeFilter.java
index 8cab11fc9ec..ba7ec99f5b0 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/TimeFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/TimeFilter.java
@@ -31,7 +31,7 @@
import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
import org.apache.logging.log4j.core.util.Clock;
-import org.apache.logging.log4j.core.time.internal.ClockFactory;
+import org.apache.logging.log4j.core.time.ClockFactory;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.util.PerformanceSensitive;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
index d7da56ca4b9..248202c0c4e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
@@ -29,7 +29,7 @@
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.ThreadContext;
import org.apache.logging.log4j.core.ContextDataInjector;
-import org.apache.logging.log4j.core.time.internal.ClockFactory;
+import org.apache.logging.log4j.core.time.ClockFactory;
import org.apache.logging.log4j.core.time.internal.DummyNanoClock;
import org.apache.logging.log4j.core.util.*;
import org.apache.logging.log4j.core.time.Instant;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ReusableLogEventFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ReusableLogEventFactory.java
index 44a2572952e..2a96007eeca 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ReusableLogEventFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ReusableLogEventFactory.java
@@ -26,7 +26,7 @@
import org.apache.logging.log4j.core.async.ThreadNameCachingStrategy;
import org.apache.logging.log4j.core.config.Property;
import org.apache.logging.log4j.core.util.Clock;
-import org.apache.logging.log4j.core.time.internal.ClockFactory;
+import org.apache.logging.log4j.core.time.ClockFactory;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.util.StringMap;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
index ac6940a3128..21747e0b9d0 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
@@ -29,7 +29,7 @@
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
import org.apache.logging.log4j.core.config.plugins.util.PluginType;
-import org.apache.logging.log4j.core.time.internal.SystemNanoClock;
+import org.apache.logging.log4j.core.time.SystemNanoClock;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.Strings;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/ClockFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/ClockFactory.java
similarity index 93%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/ClockFactory.java
rename to log4j-core/src/main/java/org/apache/logging/log4j/core/time/ClockFactory.java
index 415e903cbfd..ef6febf859e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/ClockFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/ClockFactory.java
@@ -14,9 +14,12 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.time.internal;
+package org.apache.logging.log4j.core.time;
-import org.apache.logging.log4j.core.time.PreciseClock;
+import org.apache.logging.log4j.core.time.internal.CachedClock;
+import org.apache.logging.log4j.core.time.internal.CoarseCachedClock;
+import org.apache.logging.log4j.core.time.internal.SystemClock;
+import org.apache.logging.log4j.core.time.internal.SystemMillisClock;
import org.apache.logging.log4j.core.util.Clock;
import org.apache.logging.log4j.core.util.Loader;
import org.apache.logging.log4j.status.StatusLogger;
@@ -28,6 +31,7 @@
/**
* Factory for {@code Clock} objects.
+ * @since 2.11
*/
public final class ClockFactory {
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/SystemNanoClock.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/SystemNanoClock.java
similarity index 95%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/SystemNanoClock.java
rename to log4j-core/src/main/java/org/apache/logging/log4j/core/time/SystemNanoClock.java
index 1cd1a6ffb2e..13019e5f48d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/SystemNanoClock.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/SystemNanoClock.java
@@ -14,12 +14,13 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.time.internal;
+package org.apache.logging.log4j.core.time;
import org.apache.logging.log4j.core.util.NanoClock;
/**
* Implementation of the {@code NanoClock} interface that returns the system nano time.
+ * @since 2.11
*/
public final class SystemNanoClock implements NanoClock {
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/ClockFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/ClockFactory.java
new file mode 100644
index 00000000000..abe26fb0d13
--- /dev/null
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/ClockFactory.java
@@ -0,0 +1,37 @@
+/*
+ * 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.util;
+
+/**
+ * @deprecated Use {@link org.apache.logging.log4j.core.time.ClockFactory} instead.
+ */
+@Deprecated
+public final class ClockFactory {
+
+ /** @see org.apache.logging.log4j.core.time.ClockFactory#PROPERTY_NAME */
+ @Deprecated
+ public static final String PROPERTY_NAME = org.apache.logging.log4j.core.time.ClockFactory.PROPERTY_NAME;
+
+ private ClockFactory() {}
+
+ /** @see org.apache.logging.log4j.core.time.ClockFactory#getClock() */
+ @Deprecated
+ public static Clock getClock() {
+ return org.apache.logging.log4j.core.time.ClockFactory.getClock();
+ }
+
+}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/SystemNanoClock.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/SystemNanoClock.java
new file mode 100644
index 00000000000..367b2aac448
--- /dev/null
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/SystemNanoClock.java
@@ -0,0 +1,35 @@
+/*
+ * 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.util;
+
+/**
+ * @deprecated Use {@link org.apache.logging.log4j.core.time.SystemNanoClock} instead.
+ */
+@Deprecated
+public final class SystemNanoClock implements NanoClock {
+
+ /**
+ * @see org.apache.logging.log4j.core.time.SystemNanoClock#nanoTime()
+ * @deprecated use {@link org.apache.logging.log4j.core.time.SystemNanoClock} instead.
+ */
+ @Deprecated
+ @Override
+ public long nanoTime() {
+ return System.nanoTime();
+ }
+
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/TimestampMessageTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/TimestampMessageTest.java
index a2c02fbc8f2..abea8b02dad 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/TimestampMessageTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/TimestampMessageTest.java
@@ -20,8 +20,8 @@
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.util.Clock;
-import org.apache.logging.log4j.core.time.internal.ClockFactory;
-import org.apache.logging.log4j.core.time.internal.ClockFactoryTest;
+import org.apache.logging.log4j.core.time.ClockFactory;
+import org.apache.logging.log4j.core.time.ClockFactoryTest;
import org.apache.logging.log4j.core.util.Constants;
import org.apache.logging.log4j.junit.LoggerContextRule;
import org.apache.logging.log4j.message.Message;
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/JsonCompleteFileAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/JsonCompleteFileAppenderTest.java
index fcbd40c7c4f..853f7e3f7c2 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/JsonCompleteFileAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/JsonCompleteFileAppenderTest.java
@@ -26,7 +26,7 @@
import org.apache.logging.log4j.core.impl.Log4jLogEventTest;
import org.apache.logging.log4j.core.selector.ContextSelector;
import org.apache.logging.log4j.core.selector.CoreContextSelectors;
-import org.apache.logging.log4j.core.time.internal.ClockFactory;
+import org.apache.logging.log4j.core.time.ClockFactory;
import org.apache.logging.log4j.junit.CleanFiles;
import org.apache.logging.log4j.junit.LoggerContextRule;
import org.junit.AfterClass;
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTestNanoTime.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTestNanoTime.java
index 628e68598af..7995f11fcd6 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTestNanoTime.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTestNanoTime.java
@@ -27,7 +27,7 @@
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.util.Constants;
import org.apache.logging.log4j.core.time.internal.DummyNanoClock;
-import org.apache.logging.log4j.core.time.internal.SystemNanoClock;
+import org.apache.logging.log4j.core.time.SystemNanoClock;
import org.apache.logging.log4j.util.Strings;
import org.junit.AfterClass;
import org.junit.BeforeClass;
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTimestampMessageTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTimestampMessageTest.java
index 4c9a00f48cc..35515536b76 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTimestampMessageTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTimestampMessageTest.java
@@ -26,8 +26,8 @@
import org.apache.logging.log4j.core.CoreLoggerContexts;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.util.Clock;
-import org.apache.logging.log4j.core.time.internal.ClockFactory;
-import org.apache.logging.log4j.core.time.internal.ClockFactoryTest;
+import org.apache.logging.log4j.core.time.ClockFactory;
+import org.apache.logging.log4j.core.time.ClockFactoryTest;
import org.apache.logging.log4j.core.util.Constants;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.message.SimpleMessage;
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/TimeFilterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/TimeFilterTest.java
index 9b026acbb2b..117de29a704 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/TimeFilterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/TimeFilterTest.java
@@ -24,8 +24,8 @@
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.impl.Log4jLogEvent;
import org.apache.logging.log4j.core.util.Clock;
-import org.apache.logging.log4j.core.time.internal.ClockFactory;
-import org.apache.logging.log4j.core.time.internal.ClockFactoryTest;
+import org.apache.logging.log4j.core.time.ClockFactory;
+import org.apache.logging.log4j.core.time.ClockFactoryTest;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventNanoTimeTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventNanoTimeTest.java
index 5355774739b..86383b59519 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventNanoTimeTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventNanoTimeTest.java
@@ -27,7 +27,7 @@
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.util.Constants;
import org.apache.logging.log4j.core.time.internal.DummyNanoClock;
-import org.apache.logging.log4j.core.time.internal.SystemNanoClock;
+import org.apache.logging.log4j.core.time.SystemNanoClock;
import org.apache.logging.log4j.util.Strings;
import org.junit.AfterClass;
import org.junit.BeforeClass;
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java
index eab49491e4f..1a9a66d1415 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java
@@ -39,8 +39,8 @@
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.convert.Base64Converter;
import org.apache.logging.log4j.core.util.Clock;
-import org.apache.logging.log4j.core.time.internal.ClockFactory;
-import org.apache.logging.log4j.core.time.internal.ClockFactoryTest;
+import org.apache.logging.log4j.core.time.ClockFactory;
+import org.apache.logging.log4j.core.time.ClockFactoryTest;
import org.apache.logging.log4j.core.time.internal.DummyNanoClock;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.message.ObjectMessage;
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest.java
index 5b61b69fc95..7fd7254b90a 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest.java
@@ -34,7 +34,7 @@
import org.apache.logging.log4j.core.impl.Log4jLogEvent;
import org.apache.logging.log4j.core.impl.ThrowableFormatOptions;
import org.apache.logging.log4j.core.time.internal.DummyNanoClock;
-import org.apache.logging.log4j.core.time.internal.SystemNanoClock;
+import org.apache.logging.log4j.core.time.SystemNanoClock;
import org.apache.logging.log4j.message.SimpleMessage;
import org.apache.logging.log4j.util.StringMap;
import org.apache.logging.log4j.util.Strings;
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/time/internal/ClockFactoryTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/time/ClockFactoryTest.java
similarity index 96%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/time/internal/ClockFactoryTest.java
rename to log4j-core/src/test/java/org/apache/logging/log4j/core/time/ClockFactoryTest.java
index 2db66f21629..203c70b4d48 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/time/internal/ClockFactoryTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/time/ClockFactoryTest.java
@@ -14,22 +14,21 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.time.internal;
-
-import java.lang.reflect.Field;
+package org.apache.logging.log4j.core.time;
import org.apache.commons.lang3.reflect.FieldUtils;
import org.apache.logging.log4j.core.async.AsyncLogger;
import org.apache.logging.log4j.core.impl.Log4jLogEvent;
import org.apache.logging.log4j.core.time.internal.CachedClock;
-import org.apache.logging.log4j.core.time.internal.ClockFactory;
import org.apache.logging.log4j.core.time.internal.CoarseCachedClock;
import org.apache.logging.log4j.core.time.internal.SystemClock;
import org.apache.logging.log4j.core.util.Clock;
import org.junit.Before;
import org.junit.Test;
-import static org.junit.Assert.*;
+import java.lang.reflect.Field;
+
+import static org.junit.Assert.assertSame;
public class ClockFactoryTest {
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/time/internal/SystemNanoClockTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/time/SystemNanoClockTest.java
similarity index 89%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/time/internal/SystemNanoClockTest.java
rename to log4j-core/src/test/java/org/apache/logging/log4j/core/time/SystemNanoClockTest.java
index 7b729522015..00b01eec563 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/time/internal/SystemNanoClockTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/time/SystemNanoClockTest.java
@@ -15,15 +15,14 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.time.internal;
+package org.apache.logging.log4j.core.time;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.logging.log4j.core.time.internal.SystemNanoClock;
import org.apache.logging.log4j.core.util.NanoClock;
import org.junit.Test;
-import static org.junit.Assert.*;
+import java.util.concurrent.TimeUnit;
+
+import static org.junit.Assert.assertTrue;
/**
* Tests the SystemNanoClock.
From 47604fafbf3c456e2d39727cb9679b1c6415c1c2 Mon Sep 17 00:00:00 2001
From: rpopma
Date: Tue, 30 Jan 2018 00:41:57 +0900
Subject: [PATCH 0015/2347] LOG4J2-2225 move Clock and NanoClock interfaces
from util to time; provide deprecated sub-interfaces to preserve binary
compatibility
---
.../log4j/cassandra/CassandraAppender.java | 2 +-
.../cassandra/ClockTimestampGenerator.java | 2 +-
.../rolling/action/IfLastModified.java | 2 +-
.../logging/log4j/core/async/AsyncLogger.java | 4 +--
.../log4j/core/async/RingBufferLogEvent.java | 2 ++
.../async/RingBufferLogEventTranslator.java | 4 +--
.../core/config/AbstractConfiguration.java | 2 +-
.../log4j/core/config/Configuration.java | 2 +-
.../logging/log4j/core/filter/TimeFilter.java | 2 +-
.../log4j/core/impl/Log4jLogEvent.java | 4 +--
.../log4j/core/impl/MutableLogEvent.java | 2 ++
.../core/impl/ReusableLogEventFactory.java | 2 +-
.../apache/logging/log4j/core/time/Clock.java | 33 +++++++++++++++++
.../logging/log4j/core/time/ClockFactory.java | 4 ++-
.../logging/log4j/core/time/Instant.java | 1 -
.../log4j/core/time/MutableInstant.java | 1 -
.../logging/log4j/core/time/NanoClock.java | 36 +++++++++++++++++++
.../logging/log4j/core/time/PreciseClock.java | 2 --
.../log4j/core/time/SystemNanoClock.java | 5 +--
.../log4j/core/time/internal/CachedClock.java | 2 +-
.../core/time/internal/CoarseCachedClock.java | 2 +-
.../core/time/internal/DummyNanoClock.java | 2 +-
.../log4j/core/time/internal/SystemClock.java | 2 +-
.../core/time/internal/SystemMillisClock.java | 2 +-
.../apache/logging/log4j/core/util/Clock.java | 12 +++----
.../logging/log4j/core/util/ClockFactory.java | 2 ++
.../logging/log4j/core/util/NanoClock.java | 12 +++----
.../log4j/core/util/SystemNanoClock.java | 2 ++
.../log4j/core/TimestampMessageTest.java | 2 +-
.../AsyncLoggerTimestampMessageTest.java | 2 +-
.../log4j/core/filter/TimeFilterTest.java | 2 +-
.../log4j/core/impl/Log4jLogEventTest.java | 2 +-
.../log4j/core/time/ClockFactoryTest.java | 1 -
.../log4j/core/time/SystemNanoClockTest.java | 1 -
.../log4j/perf/jmh/ClocksBenchmark.java | 2 +-
src/site/xdoc/manual/appenders.xml | 2 +-
src/site/xdoc/manual/async.xml | 2 +-
src/site/xdoc/manual/configuration.xml.vm | 2 +-
38 files changed, 116 insertions(+), 52 deletions(-)
create mode 100644 log4j-core/src/main/java/org/apache/logging/log4j/core/time/Clock.java
create mode 100644 log4j-core/src/main/java/org/apache/logging/log4j/core/time/NanoClock.java
diff --git a/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/CassandraAppender.java b/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/CassandraAppender.java
index 7a9ade9744b..5f87d7eeaa7 100644
--- a/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/CassandraAppender.java
+++ b/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/CassandraAppender.java
@@ -28,7 +28,7 @@
import org.apache.logging.log4j.core.config.plugins.PluginElement;
import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
import org.apache.logging.log4j.core.net.SocketAddress;
-import org.apache.logging.log4j.core.util.Clock;
+import org.apache.logging.log4j.core.time.Clock;
/**
* Appender plugin that uses a Cassandra database.
diff --git a/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/ClockTimestampGenerator.java b/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/ClockTimestampGenerator.java
index be9611ddbc9..cbc5c1fe888 100644
--- a/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/ClockTimestampGenerator.java
+++ b/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/ClockTimestampGenerator.java
@@ -17,7 +17,7 @@
package org.apache.logging.log4j.cassandra;
import com.datastax.driver.core.TimestampGenerator;
-import org.apache.logging.log4j.core.util.Clock;
+import org.apache.logging.log4j.core.time.Clock;
import org.apache.logging.log4j.core.time.ClockFactory;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfLastModified.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfLastModified.java
index 5aba668c941..ffd740e2d46 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfLastModified.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfLastModified.java
@@ -30,7 +30,7 @@
import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginElement;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
-import org.apache.logging.log4j.core.util.Clock;
+import org.apache.logging.log4j.core.time.Clock;
import org.apache.logging.log4j.core.time.ClockFactory;
import org.apache.logging.log4j.status.StatusLogger;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java
index e32f2101dd0..8f86588a109 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java
@@ -30,9 +30,9 @@
import org.apache.logging.log4j.core.config.ReliabilityStrategy;
import org.apache.logging.log4j.core.impl.ContextDataFactory;
import org.apache.logging.log4j.core.impl.ContextDataInjectorFactory;
-import org.apache.logging.log4j.core.util.Clock;
+import org.apache.logging.log4j.core.time.Clock;
import org.apache.logging.log4j.core.time.ClockFactory;
-import org.apache.logging.log4j.core.util.NanoClock;
+import org.apache.logging.log4j.core.time.NanoClock;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.message.MessageFactory;
import org.apache.logging.log4j.message.ReusableMessage;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEvent.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEvent.java
index 9e5181538af..0a2964df412 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEvent.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEvent.java
@@ -27,6 +27,8 @@
import org.apache.logging.log4j.core.impl.ContextDataFactory;
import org.apache.logging.log4j.core.impl.Log4jLogEvent;
import org.apache.logging.log4j.core.impl.ThrowableProxy;
+import org.apache.logging.log4j.core.time.Clock;
+import org.apache.logging.log4j.core.time.NanoClock;
import org.apache.logging.log4j.core.util.*;
import org.apache.logging.log4j.core.time.Instant;
import org.apache.logging.log4j.core.time.MutableInstant;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEventTranslator.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEventTranslator.java
index ec2ff1c897e..cac5d39b8aa 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEventTranslator.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEventTranslator.java
@@ -21,8 +21,8 @@
import org.apache.logging.log4j.ThreadContext.ContextStack;
import org.apache.logging.log4j.core.ContextDataInjector;
import org.apache.logging.log4j.core.impl.ContextDataInjectorFactory;
-import org.apache.logging.log4j.core.util.Clock;
-import org.apache.logging.log4j.core.util.NanoClock;
+import org.apache.logging.log4j.core.time.Clock;
+import org.apache.logging.log4j.core.time.NanoClock;
import org.apache.logging.log4j.util.StringMap;
import org.apache.logging.log4j.message.Message;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
index 98f072ab645..a22468dc7bf 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
@@ -65,7 +65,7 @@
import org.apache.logging.log4j.core.time.internal.DummyNanoClock;
import org.apache.logging.log4j.core.util.Loader;
import org.apache.logging.log4j.core.util.NameUtil;
-import org.apache.logging.log4j.core.util.NanoClock;
+import org.apache.logging.log4j.core.time.NanoClock;
import org.apache.logging.log4j.core.util.WatchManager;
import org.apache.logging.log4j.util.PropertiesUtil;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java
index 95e6edcc17b..b2e5cb7f06a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java
@@ -30,7 +30,7 @@
import org.apache.logging.log4j.core.lookup.StrSubstitutor;
import org.apache.logging.log4j.core.net.Advertiser;
import org.apache.logging.log4j.core.script.ScriptManager;
-import org.apache.logging.log4j.core.util.NanoClock;
+import org.apache.logging.log4j.core.time.NanoClock;
import org.apache.logging.log4j.core.util.WatchManager;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/TimeFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/TimeFilter.java
index ba7ec99f5b0..491960b9072 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/TimeFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/TimeFilter.java
@@ -30,7 +30,7 @@
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
-import org.apache.logging.log4j.core.util.Clock;
+import org.apache.logging.log4j.core.time.Clock;
import org.apache.logging.log4j.core.time.ClockFactory;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.util.PerformanceSensitive;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
index 248202c0c4e..455de65d9f2 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
@@ -29,11 +29,9 @@
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.ThreadContext;
import org.apache.logging.log4j.core.ContextDataInjector;
+import org.apache.logging.log4j.core.time.*;
import org.apache.logging.log4j.core.time.ClockFactory;
import org.apache.logging.log4j.core.time.internal.DummyNanoClock;
-import org.apache.logging.log4j.core.util.*;
-import org.apache.logging.log4j.core.time.Instant;
-import org.apache.logging.log4j.core.time.MutableInstant;
import org.apache.logging.log4j.util.ReadOnlyStringMap;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.async.RingBufferLogEvent;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/MutableLogEvent.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/MutableLogEvent.java
index d03223f5f9e..b427c4a272d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/MutableLogEvent.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/MutableLogEvent.java
@@ -26,6 +26,8 @@
import org.apache.logging.log4j.ThreadContext;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.async.InternalAsyncUtil;
+import org.apache.logging.log4j.core.time.Clock;
+import org.apache.logging.log4j.core.time.NanoClock;
import org.apache.logging.log4j.core.util.*;
import org.apache.logging.log4j.core.time.Instant;
import org.apache.logging.log4j.core.time.MutableInstant;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ReusableLogEventFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ReusableLogEventFactory.java
index 2a96007eeca..54041447b10 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ReusableLogEventFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ReusableLogEventFactory.java
@@ -25,7 +25,7 @@
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.async.ThreadNameCachingStrategy;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.util.Clock;
+import org.apache.logging.log4j.core.time.Clock;
import org.apache.logging.log4j.core.time.ClockFactory;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.util.StringMap;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/Clock.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/Clock.java
new file mode 100644
index 00000000000..a7a52a5a62e
--- /dev/null
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/Clock.java
@@ -0,0 +1,33 @@
+/*
+ * 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.time;
+
+/**
+ * Provides the time stamp used in log events.
+ *
+ * This interface replaces {@link org.apache.logging.log4j.core.util.Clock}.
+ *
+ * @since 2.11
+ */
+public interface Clock {
+ /**
+ * Returns the time in milliseconds since the epoch.
+ *
+ * @return the time in milliseconds since the epoch
+ */
+ long currentTimeMillis();
+}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/ClockFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/ClockFactory.java
index ef6febf859e..d5721c4d84d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/ClockFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/ClockFactory.java
@@ -20,7 +20,6 @@
import org.apache.logging.log4j.core.time.internal.CoarseCachedClock;
import org.apache.logging.log4j.core.time.internal.SystemClock;
import org.apache.logging.log4j.core.time.internal.SystemMillisClock;
-import org.apache.logging.log4j.core.util.Clock;
import org.apache.logging.log4j.core.util.Loader;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.PropertiesUtil;
@@ -31,6 +30,9 @@
/**
* Factory for {@code Clock} objects.
+ *
+ * This class replaces {@link org.apache.logging.log4j.core.util.ClockFactory}.
+ *
* @since 2.11
*/
public final class ClockFactory {
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/Instant.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/Instant.java
index c9609cd02a5..f41b6c1fe2b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/Instant.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/Instant.java
@@ -16,7 +16,6 @@
*/
package org.apache.logging.log4j.core.time;
-import org.apache.logging.log4j.core.util.Clock;
import org.apache.logging.log4j.util.StringBuilderFormattable;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/MutableInstant.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/MutableInstant.java
index 6e27dd80cc4..303f75d8aef 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/MutableInstant.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/MutableInstant.java
@@ -16,7 +16,6 @@
*/
package org.apache.logging.log4j.core.time;
-import org.apache.logging.log4j.core.util.Clock;
import org.apache.logging.log4j.util.PerformanceSensitive;
import java.io.Serializable;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/NanoClock.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/NanoClock.java
new file mode 100644
index 00000000000..3c1ed960cfb
--- /dev/null
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/NanoClock.java
@@ -0,0 +1,36 @@
+/*
+ * 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.time;
+
+import org.apache.logging.log4j.core.LogEvent;
+
+/**
+ * Provides the {@link LogEvent#getNanoTime() high-resolution time stamp} used in log events.
+ *
+ * This interface replaces {@link org.apache.logging.log4j.core.util.NanoClock}.
+ *
+ * @since 2.11
+ */
+public interface NanoClock {
+ /**
+ * Returns the current value of the running Java Virtual Machine's high-resolution time source, in nanoseconds.
+ *
+ * @return the current value of the running Java Virtual Machine's high-resolution time source, in nanoseconds
+ */
+ long nanoTime();
+}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/PreciseClock.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/PreciseClock.java
index a0ae3f6f51d..c81ffc7a069 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/PreciseClock.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/PreciseClock.java
@@ -16,8 +16,6 @@
*/
package org.apache.logging.log4j.core.time;
-import org.apache.logging.log4j.core.util.Clock;
-
/**
* Extension of the {@link Clock} interface that is able to provide more accurate time information than milliseconds
* since the epoch. {@code PreciseClock} implementations are free to return millisecond-precision time
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/SystemNanoClock.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/SystemNanoClock.java
index 13019e5f48d..75775348c6b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/SystemNanoClock.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/SystemNanoClock.java
@@ -16,10 +16,11 @@
*/
package org.apache.logging.log4j.core.time;
-import org.apache.logging.log4j.core.util.NanoClock;
-
/**
* Implementation of the {@code NanoClock} interface that returns the system nano time.
+ *
+ * This class replaces {@link org.apache.logging.log4j.core.util.SystemNanoClock}.
+ *
* @since 2.11
*/
public final class SystemNanoClock implements NanoClock {
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/CachedClock.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/CachedClock.java
index 9ff7ebdba64..bfca6547645 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/CachedClock.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/CachedClock.java
@@ -16,7 +16,7 @@
*/
package org.apache.logging.log4j.core.time.internal;
-import org.apache.logging.log4j.core.util.Clock;
+import org.apache.logging.log4j.core.time.Clock;
import org.apache.logging.log4j.core.util.Log4jThread;
import java.util.concurrent.locks.LockSupport;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/CoarseCachedClock.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/CoarseCachedClock.java
index bbbc1bd1f2f..44793b1f2ab 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/CoarseCachedClock.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/CoarseCachedClock.java
@@ -16,7 +16,7 @@
*/
package org.apache.logging.log4j.core.time.internal;
-import org.apache.logging.log4j.core.util.Clock;
+import org.apache.logging.log4j.core.time.Clock;
import org.apache.logging.log4j.core.util.Log4jThread;
import java.util.concurrent.locks.LockSupport;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/DummyNanoClock.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/DummyNanoClock.java
index f89f6d8d228..445286ebd0f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/DummyNanoClock.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/DummyNanoClock.java
@@ -16,7 +16,7 @@
*/
package org.apache.logging.log4j.core.time.internal;
-import org.apache.logging.log4j.core.util.NanoClock;
+import org.apache.logging.log4j.core.time.NanoClock;
/**
* Implementation of the {@code NanoClock} interface that always returns a fixed value.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/SystemClock.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/SystemClock.java
index 0626149d0cf..473b0e877db 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/SystemClock.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/SystemClock.java
@@ -16,7 +16,7 @@
*/
package org.apache.logging.log4j.core.time.internal;
-import org.apache.logging.log4j.core.util.Clock;
+import org.apache.logging.log4j.core.time.Clock;
/**
* Implementation of the {@code Clock} interface that returns the system time.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/SystemMillisClock.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/SystemMillisClock.java
index af266330670..82daab37215 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/SystemMillisClock.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/SystemMillisClock.java
@@ -16,7 +16,7 @@
*/
package org.apache.logging.log4j.core.time.internal;
-import org.apache.logging.log4j.core.util.Clock;
+import org.apache.logging.log4j.core.time.Clock;
/**
* Implementation of the {@code Clock} interface that returns the system time in millisecond granularity.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Clock.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Clock.java
index 87457dc357d..15d6f65e84f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Clock.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Clock.java
@@ -17,13 +17,9 @@
package org.apache.logging.log4j.core.util;
/**
- * Provides the time stamp used in log events.
+ * @deprecated Use {@link org.apache.logging.log4j.core.time.Clock} instead
+ * @see org.apache.logging.log4j.core.time.Clock
*/
-public interface Clock {
- /**
- * Returns the time in milliseconds since the epoch.
- *
- * @return the time in milliseconds since the epoch
- */
- long currentTimeMillis();
+@Deprecated
+public interface Clock extends org.apache.logging.log4j.core.time.Clock {
}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/ClockFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/ClockFactory.java
index abe26fb0d13..9ef4dbdcb2f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/ClockFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/ClockFactory.java
@@ -16,6 +16,8 @@
*/
package org.apache.logging.log4j.core.util;
+import org.apache.logging.log4j.core.time.Clock;
+
/**
* @deprecated Use {@link org.apache.logging.log4j.core.time.ClockFactory} instead.
*/
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/NanoClock.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/NanoClock.java
index 8fe8bf871e6..b1f3c35fc0c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/NanoClock.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/NanoClock.java
@@ -18,13 +18,9 @@
package org.apache.logging.log4j.core.util;
/**
- * Provides the high-resolution time stamp used in log events.
+ * @deprecated Use {@link org.apache.logging.log4j.core.time.NanoClock} instead
+ * @see org.apache.logging.log4j.core.time.NanoClock
*/
-public interface NanoClock {
- /**
- * Returns the current value of the running Java Virtual Machine's high-resolution time source, in nanoseconds.
- *
- * @return the current value of the running Java Virtual Machine's high-resolution time source, in nanoseconds
- */
- long nanoTime();
+@Deprecated
+public interface NanoClock extends org.apache.logging.log4j.core.time.NanoClock {
}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/SystemNanoClock.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/SystemNanoClock.java
index 367b2aac448..d4ce19b98b7 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/SystemNanoClock.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/SystemNanoClock.java
@@ -16,6 +16,8 @@
*/
package org.apache.logging.log4j.core.util;
+import org.apache.logging.log4j.core.time.NanoClock;
+
/**
* @deprecated Use {@link org.apache.logging.log4j.core.time.SystemNanoClock} instead.
*/
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/TimestampMessageTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/TimestampMessageTest.java
index abea8b02dad..188c6f890f3 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/TimestampMessageTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/TimestampMessageTest.java
@@ -19,7 +19,7 @@
import java.util.List;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.util.Clock;
+import org.apache.logging.log4j.core.time.Clock;
import org.apache.logging.log4j.core.time.ClockFactory;
import org.apache.logging.log4j.core.time.ClockFactoryTest;
import org.apache.logging.log4j.core.util.Constants;
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTimestampMessageTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTimestampMessageTest.java
index 35515536b76..fccb4f4f15d 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTimestampMessageTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTimestampMessageTest.java
@@ -25,7 +25,7 @@
import org.apache.logging.log4j.categories.AsyncLoggers;
import org.apache.logging.log4j.core.CoreLoggerContexts;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
-import org.apache.logging.log4j.core.util.Clock;
+import org.apache.logging.log4j.core.time.Clock;
import org.apache.logging.log4j.core.time.ClockFactory;
import org.apache.logging.log4j.core.time.ClockFactoryTest;
import org.apache.logging.log4j.core.util.Constants;
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/TimeFilterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/TimeFilterTest.java
index 117de29a704..c6da0e8bda2 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/TimeFilterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/TimeFilterTest.java
@@ -23,7 +23,7 @@
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.impl.Log4jLogEvent;
-import org.apache.logging.log4j.core.util.Clock;
+import org.apache.logging.log4j.core.time.Clock;
import org.apache.logging.log4j.core.time.ClockFactory;
import org.apache.logging.log4j.core.time.ClockFactoryTest;
import org.junit.AfterClass;
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java
index 1a9a66d1415..4489564c6bd 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java
@@ -38,7 +38,7 @@
import org.apache.logging.log4j.ThreadContext.ContextStack;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.convert.Base64Converter;
-import org.apache.logging.log4j.core.util.Clock;
+import org.apache.logging.log4j.core.time.Clock;
import org.apache.logging.log4j.core.time.ClockFactory;
import org.apache.logging.log4j.core.time.ClockFactoryTest;
import org.apache.logging.log4j.core.time.internal.DummyNanoClock;
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/time/ClockFactoryTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/time/ClockFactoryTest.java
index 203c70b4d48..17e184d7476 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/time/ClockFactoryTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/time/ClockFactoryTest.java
@@ -22,7 +22,6 @@
import org.apache.logging.log4j.core.time.internal.CachedClock;
import org.apache.logging.log4j.core.time.internal.CoarseCachedClock;
import org.apache.logging.log4j.core.time.internal.SystemClock;
-import org.apache.logging.log4j.core.util.Clock;
import org.junit.Before;
import org.junit.Test;
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/time/SystemNanoClockTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/time/SystemNanoClockTest.java
index 00b01eec563..5ab94049a91 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/time/SystemNanoClockTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/time/SystemNanoClockTest.java
@@ -17,7 +17,6 @@
package org.apache.logging.log4j.core.time;
-import org.apache.logging.log4j.core.util.NanoClock;
import org.junit.Test;
import java.util.concurrent.TimeUnit;
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ClocksBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ClocksBenchmark.java
index 5872c5afaa7..ff778d250f1 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ClocksBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ClocksBenchmark.java
@@ -21,7 +21,7 @@
import java.util.concurrent.locks.LockSupport;
import org.apache.logging.log4j.core.time.internal.CachedClock;
-import org.apache.logging.log4j.core.util.Clock;
+import org.apache.logging.log4j.core.time.Clock;
import org.apache.logging.log4j.core.time.internal.CoarseCachedClock;
import org.apache.logging.log4j.core.time.internal.SystemClock;
import org.openjdk.jmh.annotations.Benchmark;
diff --git a/src/site/xdoc/manual/appenders.xml b/src/site/xdoc/manual/appenders.xml
index f4bba1a3fd9..038fc2ca614 100644
--- a/src/site/xdoc/manual/appenders.xml
+++ b/src/site/xdoc/manual/appenders.xml
@@ -345,7 +345,7 @@
useClockForTimestampGenerator
boolean
-
Whether or not to use the configured org.apache.logging.log4j.core.util.Clock as a
+
Whether or not to use the configured org.apache.logging.log4j.core.time.Clock as a
TimestampGenerator.
By default, this is false.
- Implementation of the org.apache.logging.log4j.core.util.Clock
+ Implementation of the org.apache.logging.log4j.core.time.Clock
interface that is used for timestamping the log events when all loggers are asynchronous.
By default, System.currentTimeMillis is called on every log event.
diff --git a/src/site/xdoc/manual/configuration.xml.vm b/src/site/xdoc/manual/configuration.xml.vm
index 77c5f827275..525baa108fd 100644
--- a/src/site/xdoc/manual/configuration.xml.vm
+++ b/src/site/xdoc/manual/configuration.xml.vm
@@ -1742,7 +1742,7 @@ public class AwesomeTest {
]]>
+
+ false
+ true
+
+
+
+ non-aggregate
+
+ javadoc
+
+
+
+
+
+ org.codehaus.mojo
+ findbugs-maven-plugin
+ ${findbugs.plugin.version}
+
+ true
+ -Duser.language=en
+ Normal
+ Default
+ ${log4jParentDir}/findbugs-exclude-filter.xml
+
+
+
+ org.apache.maven.plugins
+ maven-jxr-plugin
+ ${jxr.plugin.version}
+
+
+ non-aggregate
+
+ jxr
+
+
+
+ aggregate
+
+ aggregate
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-pmd-plugin
+ ${pmd.plugin.version}
+
+ ${maven.compiler.target}
+
+
+
+
+
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/AbstractConnectionSource.java b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/AbstractConnectionSource.java
similarity index 94%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/AbstractConnectionSource.java
rename to log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/AbstractConnectionSource.java
index bd04eac95cc..0ddeba0fec6 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/AbstractConnectionSource.java
+++ b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/AbstractConnectionSource.java
@@ -15,7 +15,7 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jdbc;
+package org.apache.logging.log4j.jdbc.appender;
import org.apache.logging.log4j.core.AbstractLifeCycle;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/AbstractDriverManagerConnectionSource.java b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/AbstractDriverManagerConnectionSource.java
similarity index 99%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/AbstractDriverManagerConnectionSource.java
rename to log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/AbstractDriverManagerConnectionSource.java
index 4f25442c3c2..0248fce4ff2 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/AbstractDriverManagerConnectionSource.java
+++ b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/AbstractDriverManagerConnectionSource.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jdbc;
+package org.apache.logging.log4j.jdbc.appender;
import java.sql.Connection;
import java.sql.DriverManager;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/ColumnConfig.java b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/ColumnConfig.java
similarity index 99%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/ColumnConfig.java
rename to log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/ColumnConfig.java
index 1377b2a49f3..6d1e2ca9dc9 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/ColumnConfig.java
+++ b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/ColumnConfig.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jdbc;
+package org.apache.logging.log4j.jdbc.appender;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Core;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/ConnectionSource.java b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/ConnectionSource.java
similarity index 96%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/ConnectionSource.java
rename to log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/ConnectionSource.java
index 2a25b251826..6c058967e5b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/ConnectionSource.java
+++ b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/ConnectionSource.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jdbc;
+package org.apache.logging.log4j.jdbc.appender;
import java.sql.Connection;
import java.sql.SQLException;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/DataSourceConnectionSource.java b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/DataSourceConnectionSource.java
similarity index 98%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/DataSourceConnectionSource.java
rename to log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/DataSourceConnectionSource.java
index a791df98978..eaf5750b0f9 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/DataSourceConnectionSource.java
+++ b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/DataSourceConnectionSource.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jdbc;
+package org.apache.logging.log4j.jdbc.appender;
import java.sql.Connection;
import java.sql.SQLException;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/DriverManagerConnectionSource.java b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/DriverManagerConnectionSource.java
similarity index 98%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/DriverManagerConnectionSource.java
rename to log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/DriverManagerConnectionSource.java
index e390c5e85e7..93760d131f3 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/DriverManagerConnectionSource.java
+++ b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/DriverManagerConnectionSource.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jdbc;
+package org.apache.logging.log4j.jdbc.appender;
import java.sql.DriverManager;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/FactoryMethodConnectionSource.java b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/FactoryMethodConnectionSource.java
similarity index 99%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/FactoryMethodConnectionSource.java
rename to log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/FactoryMethodConnectionSource.java
index 20bf2f39540..a082e6192d7 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/FactoryMethodConnectionSource.java
+++ b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/FactoryMethodConnectionSource.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jdbc;
+package org.apache.logging.log4j.jdbc.appender;
import java.io.PrintWriter;
import java.lang.reflect.Method;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppender.java b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/JdbcAppender.java
similarity index 99%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppender.java
rename to log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/JdbcAppender.java
index 974d87ed16c..d68556c6008 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppender.java
+++ b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/JdbcAppender.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jdbc;
+package org.apache.logging.log4j.jdbc.appender;
import java.io.Serializable;
import java.sql.PreparedStatement;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcDatabaseManager.java b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/JdbcDatabaseManager.java
similarity index 99%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcDatabaseManager.java
rename to log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/JdbcDatabaseManager.java
index 2952288d347..2afcaf7ee16 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcDatabaseManager.java
+++ b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/JdbcDatabaseManager.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jdbc;
+package org.apache.logging.log4j.jdbc.appender;
import java.io.Serializable;
import java.io.StringReader;
@@ -38,9 +38,9 @@
import org.apache.logging.log4j.core.appender.ManagerFactory;
import org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager;
import org.apache.logging.log4j.core.appender.db.ColumnMapping;
-import org.apache.logging.log4j.core.config.plugins.convert.DateTypeConverter;
import org.apache.logging.log4j.core.config.plugins.convert.TypeConverters;
import org.apache.logging.log4j.core.util.Closer;
+import org.apache.logging.log4j.jdbc.convert.DateTypeConverter;
import org.apache.logging.log4j.message.MapMessage;
import org.apache.logging.log4j.spi.ThreadContextMap;
import org.apache.logging.log4j.spi.ThreadContextStack;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/package-info.java b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/package-info.java
similarity index 94%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/package-info.java
rename to log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/package-info.java
index 1dbd663c4e3..ab1e6a67a7f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/package-info.java
+++ b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/package-info.java
@@ -18,4 +18,4 @@
* The JDBC Appender supports writing log events to a relational database using standard JDBC connections. You will need
* a JDBC driver on your classpath for the database you wish to log to.
*/
-package org.apache.logging.log4j.core.appender.db.jdbc;
+package org.apache.logging.log4j.jdbc.appender;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/DateTypeConverter.java b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/convert/DateTypeConverter.java
similarity index 97%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/DateTypeConverter.java
rename to log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/convert/DateTypeConverter.java
index 6fbc7aac8cf..ffb6cf22942 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/DateTypeConverter.java
+++ b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/convert/DateTypeConverter.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.convert;
+package org.apache.logging.log4j.jdbc.convert;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
diff --git a/log4j-jdbc/src/site/manual/index.md b/log4j-jdbc/src/site/manual/index.md
new file mode 100644
index 00000000000..66fe24fe304
--- /dev/null
+++ b/log4j-jdbc/src/site/manual/index.md
@@ -0,0 +1,33 @@
+
+
+
+# Apache Log4j ZeroMQ using JeroMQ module
+
+As of Log4j 2.11.0, ZeroMQ using JeroMQ support has moved from the existing module logj-core to the new module log4j-jeromq.
+
+## Requirements
+
+This module was introduced in Log4j 2.11.0 and requires the jeromq JAR.
+
+Some features may require optional
+[dependencies](../runtime-dependencies.html). These dependencies are specified in the
+documentation for those features.
+
+Some Log4j features require external dependencies.
+See the [Dependency Tree](dependencies.html#Dependency_Tree)
+for the exact list of JAR files needed for these features.
diff --git a/log4j-jdbc/src/site/site.xml b/log4j-jdbc/src/site/site.xml
new file mode 100644
index 00000000000..6d4cddc0b14
--- /dev/null
+++ b/log4j-jdbc/src/site/site.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/AbstractJdbcAppenderDataSourceTest.java b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/AbstractJdbcAppenderDataSourceTest.java
similarity index 96%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/AbstractJdbcAppenderDataSourceTest.java
rename to log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/AbstractJdbcAppenderDataSourceTest.java
index 732c2f7c717..4773a3d2370 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/AbstractJdbcAppenderDataSourceTest.java
+++ b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/AbstractJdbcAppenderDataSourceTest.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jdbc;
+package org.apache.logging.log4j.jdbc.appender;
import java.io.ByteArrayOutputStream;
import java.io.PrintWriter;
@@ -27,7 +27,6 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.util.Throwables;
-import org.apache.logging.log4j.junit.JdbcRule;
import org.apache.logging.log4j.junit.JndiRule;
import org.apache.logging.log4j.junit.LoggerContextRule;
import org.h2.util.IOUtils;
@@ -55,7 +54,7 @@ protected AbstractJdbcAppenderDataSourceTest(final JdbcRule jdbcRule) {
.around(new JndiRule("java:/comp/env/jdbc/TestDataSourceAppender", createMockDataSource()))
.around(jdbcRule)
.around(new LoggerContextRule(
- "org/apache/logging/log4j/core/appender/db/jdbc/log4j2-data-source.xml"));
+ "org/apache/logging/log4j/jdbc/appender/log4j2-data-source.xml"));
this.jdbcRule = jdbcRule;
}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/AbstractJdbcAppenderFactoryMethodTest.java b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/AbstractJdbcAppenderFactoryMethodTest.java
similarity index 96%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/AbstractJdbcAppenderFactoryMethodTest.java
rename to log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/AbstractJdbcAppenderFactoryMethodTest.java
index 72f7f3935a6..39be14fba94 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/AbstractJdbcAppenderFactoryMethodTest.java
+++ b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/AbstractJdbcAppenderFactoryMethodTest.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jdbc;
+package org.apache.logging.log4j.jdbc.appender;
import java.io.ByteArrayOutputStream;
import java.io.PrintWriter;
@@ -26,7 +26,7 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;
-import org.apache.logging.log4j.junit.JdbcRule;
+import org.apache.logging.log4j.jdbc.appender.FactoryMethodConnectionSource;
import org.apache.logging.log4j.junit.LoggerContextRule;
import org.apache.logging.log4j.util.Strings;
import org.h2.util.IOUtils;
@@ -49,7 +49,7 @@ public abstract class AbstractJdbcAppenderFactoryMethodTest {
protected AbstractJdbcAppenderFactoryMethodTest(final JdbcRule jdbcRule, final String databaseType) {
this.rules = RuleChain.emptyRuleChain().around(jdbcRule).around(new LoggerContextRule(
- "org/apache/logging/log4j/core/appender/db/jdbc/log4j2-" + databaseType + "-factory-method.xml"));
+ "org/apache/logging/log4j/jdbc/appender/log4j2-" + databaseType + "-factory-method.xml"));
this.jdbcRule = jdbcRule;
}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/ColumnConfigTest.java b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/ColumnConfigTest.java
similarity index 98%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/ColumnConfigTest.java
rename to log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/ColumnConfigTest.java
index 9d36cb762c9..62c01fb8e56 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/ColumnConfigTest.java
+++ b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/ColumnConfigTest.java
@@ -14,8 +14,9 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jdbc;
+package org.apache.logging.log4j.jdbc.appender;
+import org.apache.logging.log4j.jdbc.appender.ColumnConfig;
import org.apache.logging.log4j.util.Strings;
import org.junit.Test;
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/DataSourceConnectionSourceTest.java b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/DataSourceConnectionSourceTest.java
similarity index 96%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/DataSourceConnectionSourceTest.java
rename to log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/DataSourceConnectionSourceTest.java
index a49404a83fc..94fc8086c22 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/DataSourceConnectionSourceTest.java
+++ b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/DataSourceConnectionSourceTest.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jdbc;
+package org.apache.logging.log4j.jdbc.appender;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@@ -28,6 +28,7 @@
import javax.sql.DataSource;
+import org.apache.logging.log4j.jdbc.appender.DataSourceConnectionSource;
import org.apache.logging.log4j.junit.JndiRule;
import org.apache.logging.log4j.junit.LoggerContextRule;
import org.junit.Rule;
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/DriverManagerConnectionSourceTest.java b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/DriverManagerConnectionSourceTest.java
similarity index 94%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/DriverManagerConnectionSourceTest.java
rename to log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/DriverManagerConnectionSourceTest.java
index 5a4835a3ea5..e1e94ed96a1 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/DriverManagerConnectionSourceTest.java
+++ b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/DriverManagerConnectionSourceTest.java
@@ -15,12 +15,13 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jdbc;
+package org.apache.logging.log4j.jdbc.appender;
import java.sql.Connection;
import java.sql.SQLException;
import org.apache.logging.log4j.core.config.Property;
+import org.apache.logging.log4j.jdbc.appender.DriverManagerConnectionSource;
import org.junit.Assert;
import org.junit.Test;
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/FactoryMethodConnectionSourceTest.java b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/FactoryMethodConnectionSourceTest.java
similarity index 97%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/FactoryMethodConnectionSourceTest.java
rename to log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/FactoryMethodConnectionSourceTest.java
index 28b6d876058..8371d35caab 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/FactoryMethodConnectionSourceTest.java
+++ b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/FactoryMethodConnectionSourceTest.java
@@ -14,12 +14,13 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jdbc;
+package org.apache.logging.log4j.jdbc.appender;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
+import org.apache.logging.log4j.jdbc.appender.FactoryMethodConnectionSource;
import org.apache.logging.log4j.junit.LoggerContextRule;
import org.junit.After;
import org.junit.ClassRule;
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppenderH2DataSourceTest.java b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/JdbcAppenderH2DataSourceTest.java
similarity index 92%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppenderH2DataSourceTest.java
rename to log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/JdbcAppenderH2DataSourceTest.java
index acd14cabeb9..bb1c2433885 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppenderH2DataSourceTest.java
+++ b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/JdbcAppenderH2DataSourceTest.java
@@ -14,9 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jdbc;
-
-import org.apache.logging.log4j.junit.JdbcRule;
+package org.apache.logging.log4j.jdbc.appender;
/**
*
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppenderH2FactoryMethodTest.java b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/JdbcAppenderH2FactoryMethodTest.java
similarity index 93%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppenderH2FactoryMethodTest.java
rename to log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/JdbcAppenderH2FactoryMethodTest.java
index c79b6ba3785..ff88fe1bd14 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppenderH2FactoryMethodTest.java
+++ b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/JdbcAppenderH2FactoryMethodTest.java
@@ -14,13 +14,11 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jdbc;
+package org.apache.logging.log4j.jdbc.appender;
import java.sql.Connection;
import java.sql.SQLException;
-import org.apache.logging.log4j.junit.JdbcRule;
-
/**
*
*/
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppenderHsqldbDataSourceTest.java b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/JdbcAppenderHsqldbDataSourceTest.java
similarity index 93%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppenderHsqldbDataSourceTest.java
rename to log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/JdbcAppenderHsqldbDataSourceTest.java
index 79560ffcae5..32135eb8361 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppenderHsqldbDataSourceTest.java
+++ b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/JdbcAppenderHsqldbDataSourceTest.java
@@ -14,13 +14,13 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jdbc;
+package org.apache.logging.log4j.jdbc.appender;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
-import org.apache.logging.log4j.junit.JdbcRule;
+import org.apache.logging.log4j.jdbc.appender.AbstractConnectionSource;
/**
*
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppenderHsqldbFactoryMethodTest.java b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/JdbcAppenderHsqldbFactoryMethodTest.java
similarity index 94%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppenderHsqldbFactoryMethodTest.java
rename to log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/JdbcAppenderHsqldbFactoryMethodTest.java
index 0d76ac1e36f..355fbeadb9b 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppenderHsqldbFactoryMethodTest.java
+++ b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/JdbcAppenderHsqldbFactoryMethodTest.java
@@ -14,13 +14,13 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jdbc;
+package org.apache.logging.log4j.jdbc.appender;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
-import org.apache.logging.log4j.junit.JdbcRule;
+import org.apache.logging.log4j.jdbc.appender.AbstractConnectionSource;
/**
*
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppenderMapMessageDataSourceTest.java b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/JdbcAppenderMapMessageDataSourceTest.java
similarity index 96%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppenderMapMessageDataSourceTest.java
rename to log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/JdbcAppenderMapMessageDataSourceTest.java
index c186537512c..a60c3c0ca67 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppenderMapMessageDataSourceTest.java
+++ b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/JdbcAppenderMapMessageDataSourceTest.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jdbc;
+package org.apache.logging.log4j.jdbc.appender;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -33,7 +33,6 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.util.Throwables;
-import org.apache.logging.log4j.junit.JdbcRule;
import org.apache.logging.log4j.junit.JndiRule;
import org.apache.logging.log4j.junit.LoggerContextRule;
import org.apache.logging.log4j.message.MapMessage;
@@ -66,7 +65,7 @@ protected JdbcAppenderMapMessageDataSourceTest(final JdbcRule jdbcRule) {
this.rules = RuleChain.emptyRuleChain()
.around(new JndiRule("java:/comp/env/jdbc/TestDataSourceAppender", createMockDataSource()))
.around(jdbcRule)
- .around(new LoggerContextRule("org/apache/logging/log4j/core/appender/db/jdbc/log4j2-data-source-map-message.xml"));
+ .around(new LoggerContextRule("org/apache/logging/log4j/jdbc/appender/log4j2-data-source-map-message.xml"));
// @formatter:on
this.jdbcRule = jdbcRule;
}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcH2TestHelper.java b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/JdbcH2TestHelper.java
similarity index 89%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcH2TestHelper.java
rename to log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/JdbcH2TestHelper.java
index 7152f1141fc..9eb271390c0 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcH2TestHelper.java
+++ b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/JdbcH2TestHelper.java
@@ -14,12 +14,15 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.appender.db.jdbc;
+package org.apache.logging.log4j.jdbc.appender;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
+import org.apache.logging.log4j.jdbc.appender.AbstractConnectionSource;
+import org.apache.logging.log4j.jdbc.appender.ConnectionSource;
+
public class JdbcH2TestHelper {
public static final String CONNECTION_STRING = "jdbc:h2:mem:Log4j";
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/junit/JdbcRule.java b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/JdbcRule.java
similarity index 95%
rename from log4j-core/src/test/java/org/apache/logging/log4j/junit/JdbcRule.java
rename to log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/JdbcRule.java
index 9354a5e696a..bd062818503 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/junit/JdbcRule.java
+++ b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/JdbcRule.java
@@ -14,12 +14,13 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.junit;
+package org.apache.logging.log4j.jdbc.appender;
import java.sql.Connection;
import java.sql.Statement;
-import org.apache.logging.log4j.core.appender.db.jdbc.ConnectionSource;
+import org.apache.logging.log4j.jdbc.appender.ConnectionSource;
+import org.apache.logging.log4j.junit.LoggerContextRule;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/convert/DateTypeConverterTest.java b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/convert/DateTypeConverterTest.java
similarity index 94%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/convert/DateTypeConverterTest.java
rename to log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/convert/DateTypeConverterTest.java
index 1c83d8d5dc3..494b3dcb943 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/convert/DateTypeConverterTest.java
+++ b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/convert/DateTypeConverterTest.java
@@ -14,12 +14,13 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.convert;
+package org.apache.logging.log4j.jdbc.convert;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.Date;
+import org.apache.logging.log4j.jdbc.convert.DateTypeConverter;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
diff --git a/log4j-core/src/test/resources/log4j-fatalOnly.xml b/log4j-jdbc/src/test/resources/log4j-fatalOnly.xml
similarity index 100%
rename from log4j-core/src/test/resources/log4j-fatalOnly.xml
rename to log4j-jdbc/src/test/resources/log4j-fatalOnly.xml
diff --git a/log4j-core/src/test/resources/org/apache/logging/log4j/core/appender/db/jdbc/log4j2-data-source-map-message.xml b/log4j-jdbc/src/test/resources/org/apache/logging/log4j/jdbc/appender/log4j2-data-source-map-message.xml
similarity index 93%
rename from log4j-core/src/test/resources/org/apache/logging/log4j/core/appender/db/jdbc/log4j2-data-source-map-message.xml
rename to log4j-jdbc/src/test/resources/org/apache/logging/log4j/jdbc/appender/log4j2-data-source-map-message.xml
index a50bbf6c58a..7fc2114fe22 100644
--- a/log4j-core/src/test/resources/org/apache/logging/log4j/core/appender/db/jdbc/log4j2-data-source-map-message.xml
+++ b/log4j-jdbc/src/test/resources/org/apache/logging/log4j/jdbc/appender/log4j2-data-source-map-message.xml
@@ -31,7 +31,7 @@
-
+
diff --git a/log4j-core/src/test/resources/org/apache/logging/log4j/core/appender/db/jdbc/log4j2-data-source.xml b/log4j-jdbc/src/test/resources/org/apache/logging/log4j/jdbc/appender/log4j2-data-source.xml
similarity index 94%
rename from log4j-core/src/test/resources/org/apache/logging/log4j/core/appender/db/jdbc/log4j2-data-source.xml
rename to log4j-jdbc/src/test/resources/org/apache/logging/log4j/jdbc/appender/log4j2-data-source.xml
index 4e6ca91a69b..3f9766db30c 100644
--- a/log4j-core/src/test/resources/org/apache/logging/log4j/core/appender/db/jdbc/log4j2-data-source.xml
+++ b/log4j-jdbc/src/test/resources/org/apache/logging/log4j/jdbc/appender/log4j2-data-source.xml
@@ -33,7 +33,7 @@
-
+
diff --git a/log4j-core/src/test/resources/org/apache/logging/log4j/core/appender/db/jdbc/log4j2-h2-factory-method.xml b/log4j-jdbc/src/test/resources/org/apache/logging/log4j/jdbc/appender/log4j2-h2-factory-method.xml
similarity index 89%
rename from log4j-core/src/test/resources/org/apache/logging/log4j/core/appender/db/jdbc/log4j2-h2-factory-method.xml
rename to log4j-jdbc/src/test/resources/org/apache/logging/log4j/jdbc/appender/log4j2-h2-factory-method.xml
index b7ef94006b8..b89c1395f2d 100644
--- a/log4j-core/src/test/resources/org/apache/logging/log4j/core/appender/db/jdbc/log4j2-h2-factory-method.xml
+++ b/log4j-jdbc/src/test/resources/org/apache/logging/log4j/jdbc/appender/log4j2-h2-factory-method.xml
@@ -22,7 +22,7 @@
-
@@ -35,7 +35,7 @@
-
+
diff --git a/log4j-core/src/test/resources/org/apache/logging/log4j/core/appender/db/jdbc/log4j2-hsqldb-factory-method.xml b/log4j-jdbc/src/test/resources/org/apache/logging/log4j/jdbc/appender/log4j2-hsqldb-factory-method.xml
similarity index 89%
rename from log4j-core/src/test/resources/org/apache/logging/log4j/core/appender/db/jdbc/log4j2-hsqldb-factory-method.xml
rename to log4j-jdbc/src/test/resources/org/apache/logging/log4j/jdbc/appender/log4j2-hsqldb-factory-method.xml
index be92697e4ef..293ed80c98b 100644
--- a/log4j-core/src/test/resources/org/apache/logging/log4j/core/appender/db/jdbc/log4j2-hsqldb-factory-method.xml
+++ b/log4j-jdbc/src/test/resources/org/apache/logging/log4j/jdbc/appender/log4j2-hsqldb-factory-method.xml
@@ -22,7 +22,7 @@
-
@@ -35,7 +35,7 @@
-
+
diff --git a/log4j-perf/pom.xml b/log4j-perf/pom.xml
index b352bd3f2eb..0f48624edef 100644
--- a/log4j-perf/pom.xml
+++ b/log4j-perf/pom.xml
@@ -63,10 +63,15 @@
org.apache.logging.log4jlog4j-core
+
+ org.apache.logging.log4j
+ log4j-jdbc
+ ${project.version}
+ org.apache.logging.log4jlog4j-jpa
- 2.10.1-SNAPSHOT
+ ${project.version}org.slf4j
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/JdbcAppenderBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/JdbcAppenderBenchmark.java
index 62e6218a74d..14ae458db12 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/JdbcAppenderBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/JdbcAppenderBenchmark.java
@@ -26,10 +26,10 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.LoggerContext;
-import org.apache.logging.log4j.core.appender.db.jdbc.JdbcAppender;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.config.DefaultConfiguration;
import org.apache.logging.log4j.core.util.Closer;
+import org.apache.logging.log4j.jdbc.appender.JdbcAppender;
import org.apache.logging.log4j.status.StatusLogger;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
diff --git a/pom.xml b/pom.xml
index 1ae7f777104..691d456860c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1335,6 +1335,7 @@
log4j-jmx-guilog4j-sampleslog4j-bom
+ log4j-jdbclog4j-jdbc-dbcp2log4j-jpalog4j-jeromq
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 95801c021ce..5f577613612 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -185,6 +185,9 @@
Move JMS code to a new module log4j-jms.
+
+ Move JDBC code to a new module log4j-jdbc.
+
diff --git a/src/site/xdoc/manual/appenders.xml b/src/site/xdoc/manual/appenders.xml
index de83a704017..caabe2dc6e7 100644
--- a/src/site/xdoc/manual/appenders.xml
+++ b/src/site/xdoc/manual/appenders.xml
@@ -982,6 +982,9 @@ CREATE TABLE logs (
+
+ As of Log4j 2.11.0, JDBC support has moved from the existing module logj-core to the new module log4j-jdbc.
+
The JDBCAppender writes log events to a relational database table using standard JDBC. It can be configured
to obtain JDBC connections using a JNDI DataSource or a custom factory method. Whichever
approach you take, it must be backed by a connection pool. Otherwise, logging
From ded845696bcd0b96f3eb4b647feeecc149f0f72c Mon Sep 17 00:00:00 2001
From: rpopma
Date: Tue, 30 Jan 2018 23:08:29 +0900
Subject: [PATCH 0029/2347] LOG4J2-2236 Removed unnecessary dependency on
jcommander since Log4j uses embedded picocli since 2.9.
(cherry picked from commit 4da4243f50ba2af3ad69f69f56c37ff7d6eac250)
# Conflicts:
# log4j-core/pom.xml
# src/changes/changes.xml
---
log4j-core/pom.xml | 6 ------
pom.xml | 5 -----
src/changes/changes.xml | 18 +++---------------
3 files changed, 3 insertions(+), 26 deletions(-)
diff --git a/log4j-core/pom.xml b/log4j-core/pom.xml
index dab3328dfc2..dc1694edf84 100644
--- a/log4j-core/pom.xml
+++ b/log4j-core/pom.xml
@@ -113,12 +113,6 @@
commons-compresstrue
-
-
- com.beust
- jcommander
- true
-
diff --git a/pom.xml b/pom.xml
index 1ae7f777104..ea37eed9bb4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -296,11 +296,6 @@
commons-lang33.7
-
- com.beust
- jcommander
- 1.48
- ch.qos.logbacklogback-classic
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 95801c021ce..c683d69334a 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -37,6 +37,9 @@
Moved time-related classes from core.util to core.time. Classes considered private moved to core.time.internal.
+
+ Removed unnecessary dependency on jcommander since Log4j uses embedded picocli since 2.9.
+
Added support for precise (micro and nanosecond) timestamps when running on Java 9. A limited number of precise %d date formats are supported with PatternLayout. POTENTIAL BREAKING CHANGE: The XML, JSON and YAML formats have changed: they no longer have the "timeMillis" attribute and instead have an "Instant" element with "epochSecond" and "nanoOfSecond" attributes.
@@ -170,21 +173,6 @@
Update Jackson from 2.9.3 to 2.9.4.
-
- Split off ZeroMq/JeroMq support into a new module log4j-jeromq.
-
-
- Split off Kafka support into a new module log4j-kafka.
-
-
- Split off SMTP support into a new module log4j-smtp.
-
-
- Move CSV layout from log4j-core to a new module log4j-csv.
-
-
- Move JMS code to a new module log4j-jms.
-
From 041fe8ffeb910f56194323a3b9808e3d27bab335 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Tue, 30 Jan 2018 09:05:17 -0700
Subject: [PATCH 0030/2347] Update POM version to 3.0.0-SNAPSHOT since we now
have a 2.x-release branch.
---
log4j-1.2-api/pom.xml | 2 +-
log4j-api-java9/pom.xml | 2 +-
log4j-api/pom.xml | 2 +-
log4j-appserver/pom.xml | 2 +-
log4j-bom/pom.xml | 2 +-
log4j-cassandra/pom.xml | 2 +-
log4j-core-its/pom.xml | 2 +-
log4j-core-java9/pom.xml | 2 +-
log4j-core/pom.xml | 2 +-
log4j-couchdb/pom.xml | 2 +-
log4j-csv/pom.xml | 2 +-
log4j-distribution/pom.xml | 2 +-
log4j-flume-ng/pom.xml | 2 +-
log4j-iostreams/pom.xml | 2 +-
log4j-jcl/pom.xml | 2 +-
log4j-jdbc-dbcp2/pom.xml | 2 +-
log4j-jdbc/pom.xml | 2 +-
log4j-jeromq/pom.xml | 2 +-
log4j-jms/pom.xml | 2 +-
log4j-jmx-gui/pom.xml | 2 +-
log4j-jpa/pom.xml | 2 +-
log4j-jul/pom.xml | 2 +-
log4j-kafka/pom.xml | 2 +-
log4j-liquibase/pom.xml | 2 +-
log4j-mongodb2/pom.xml | 2 +-
log4j-mongodb3/pom.xml | 2 +-
log4j-osgi/pom.xml | 2 +-
log4j-perf/pom.xml | 2 +-
log4j-samples/log4j-samples-configuration/pom.xml | 2 +-
log4j-samples/log4j-samples-flume-common/pom.xml | 2 +-
log4j-samples/log4j-samples-flume-embedded/pom.xml | 2 +-
log4j-samples/log4j-samples-flume-remote/pom.xml | 2 +-
log4j-samples/log4j-samples-loggerProperties/pom.xml | 2 +-
log4j-samples/pom.xml | 2 +-
log4j-slf4j-impl/pom.xml | 2 +-
log4j-smtp/pom.xml | 2 +-
log4j-taglib/pom.xml | 2 +-
log4j-to-slf4j/pom.xml | 2 +-
log4j-web/pom.xml | 2 +-
pom.xml | 2 +-
40 files changed, 40 insertions(+), 40 deletions(-)
diff --git a/log4j-1.2-api/pom.xml b/log4j-1.2-api/pom.xml
index 3ddf8055ac7..95c6c9b3c59 100644
--- a/log4j-1.2-api/pom.xml
+++ b/log4j-1.2-api/pom.xml
@@ -20,7 +20,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT../log4j-1.2-api
diff --git a/log4j-api-java9/pom.xml b/log4j-api-java9/pom.xml
index 183ad14dd3c..793c4b92df1 100644
--- a/log4j-api-java9/pom.xml
+++ b/log4j-api-java9/pom.xml
@@ -20,7 +20,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT../log4j-api-java9
diff --git a/log4j-api/pom.xml b/log4j-api/pom.xml
index 2ddbde86382..5ee38a4c2bd 100644
--- a/log4j-api/pom.xml
+++ b/log4j-api/pom.xml
@@ -20,7 +20,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT../log4j-api
diff --git a/log4j-appserver/pom.xml b/log4j-appserver/pom.xml
index bd1351fd941..79fbad84a2d 100644
--- a/log4j-appserver/pom.xml
+++ b/log4j-appserver/pom.xml
@@ -20,7 +20,7 @@
log4jorg.apache.logging.log4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT4.0.0
diff --git a/log4j-bom/pom.xml b/log4j-bom/pom.xml
index 0f4bb816f10..97021b2cf80 100644
--- a/log4j-bom/pom.xml
+++ b/log4j-bom/pom.xml
@@ -26,7 +26,7 @@
Apache Log4j Bill of Materialsorg.apache.logging.log4jlog4j-bom
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOTpom
diff --git a/log4j-cassandra/pom.xml b/log4j-cassandra/pom.xml
index 869b5081c83..be370788737 100644
--- a/log4j-cassandra/pom.xml
+++ b/log4j-cassandra/pom.xml
@@ -20,7 +20,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT4.0.0
diff --git a/log4j-core-its/pom.xml b/log4j-core-its/pom.xml
index 9df2f43fca6..2a0cec1a2a8 100644
--- a/log4j-core-its/pom.xml
+++ b/log4j-core-its/pom.xml
@@ -20,7 +20,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT../log4j-core-its
diff --git a/log4j-core-java9/pom.xml b/log4j-core-java9/pom.xml
index 2da8629595c..b818c7fc7c1 100644
--- a/log4j-core-java9/pom.xml
+++ b/log4j-core-java9/pom.xml
@@ -20,7 +20,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT../log4j-core-java9
diff --git a/log4j-core/pom.xml b/log4j-core/pom.xml
index dc1694edf84..76ac37ef38a 100644
--- a/log4j-core/pom.xml
+++ b/log4j-core/pom.xml
@@ -20,7 +20,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT../log4j-core
diff --git a/log4j-couchdb/pom.xml b/log4j-couchdb/pom.xml
index 6acded48280..4e7e75a55fa 100644
--- a/log4j-couchdb/pom.xml
+++ b/log4j-couchdb/pom.xml
@@ -20,7 +20,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT4.0.0
diff --git a/log4j-csv/pom.xml b/log4j-csv/pom.xml
index 3876d51e7b6..3cec7bfa68c 100644
--- a/log4j-csv/pom.xml
+++ b/log4j-csv/pom.xml
@@ -12,7 +12,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT4.0.0
diff --git a/log4j-distribution/pom.xml b/log4j-distribution/pom.xml
index 275d3795315..30ee9b32d4b 100644
--- a/log4j-distribution/pom.xml
+++ b/log4j-distribution/pom.xml
@@ -20,7 +20,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT../log4j-distribution
diff --git a/log4j-flume-ng/pom.xml b/log4j-flume-ng/pom.xml
index 7a654e4a26a..cdd2ca1ce30 100644
--- a/log4j-flume-ng/pom.xml
+++ b/log4j-flume-ng/pom.xml
@@ -20,7 +20,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT../log4j-flume-ng
diff --git a/log4j-iostreams/pom.xml b/log4j-iostreams/pom.xml
index e3a21e2d2f1..68efa5848a1 100644
--- a/log4j-iostreams/pom.xml
+++ b/log4j-iostreams/pom.xml
@@ -20,7 +20,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT../log4j-iostreams
diff --git a/log4j-jcl/pom.xml b/log4j-jcl/pom.xml
index 0eb099e7e20..5113378123d 100644
--- a/log4j-jcl/pom.xml
+++ b/log4j-jcl/pom.xml
@@ -20,7 +20,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT../log4j-jcl
diff --git a/log4j-jdbc-dbcp2/pom.xml b/log4j-jdbc-dbcp2/pom.xml
index 900ac8ec40a..a9a77ff3b2e 100644
--- a/log4j-jdbc-dbcp2/pom.xml
+++ b/log4j-jdbc-dbcp2/pom.xml
@@ -12,7 +12,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT4.0.0
diff --git a/log4j-jdbc/pom.xml b/log4j-jdbc/pom.xml
index 9cc622ebcd8..195b7c28690 100644
--- a/log4j-jdbc/pom.xml
+++ b/log4j-jdbc/pom.xml
@@ -12,7 +12,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT4.0.0
diff --git a/log4j-jeromq/pom.xml b/log4j-jeromq/pom.xml
index 77f47758bfd..2f03dc6a09b 100644
--- a/log4j-jeromq/pom.xml
+++ b/log4j-jeromq/pom.xml
@@ -12,7 +12,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT4.0.0
diff --git a/log4j-jms/pom.xml b/log4j-jms/pom.xml
index db1b029f6bd..4d9d9929b31 100644
--- a/log4j-jms/pom.xml
+++ b/log4j-jms/pom.xml
@@ -12,7 +12,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT4.0.0
diff --git a/log4j-jmx-gui/pom.xml b/log4j-jmx-gui/pom.xml
index 7f283e80b73..ad6c84be334 100644
--- a/log4j-jmx-gui/pom.xml
+++ b/log4j-jmx-gui/pom.xml
@@ -20,7 +20,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT../log4j-jmx-gui
diff --git a/log4j-jpa/pom.xml b/log4j-jpa/pom.xml
index 3d8ee71863a..9baa151647f 100644
--- a/log4j-jpa/pom.xml
+++ b/log4j-jpa/pom.xml
@@ -12,7 +12,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT4.0.0
diff --git a/log4j-jul/pom.xml b/log4j-jul/pom.xml
index 3d81b4611eb..a1d9ccbd693 100644
--- a/log4j-jul/pom.xml
+++ b/log4j-jul/pom.xml
@@ -20,7 +20,7 @@
log4jorg.apache.logging.log4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT../4.0.0
diff --git a/log4j-kafka/pom.xml b/log4j-kafka/pom.xml
index 73df1a5f22f..9f6d44960e0 100644
--- a/log4j-kafka/pom.xml
+++ b/log4j-kafka/pom.xml
@@ -12,7 +12,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT4.0.0
diff --git a/log4j-liquibase/pom.xml b/log4j-liquibase/pom.xml
index b65d1a94208..34fb47d21c4 100644
--- a/log4j-liquibase/pom.xml
+++ b/log4j-liquibase/pom.xml
@@ -20,7 +20,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT../log4j-liquibase
diff --git a/log4j-mongodb2/pom.xml b/log4j-mongodb2/pom.xml
index 9c7979e2d47..9f22ba97eed 100644
--- a/log4j-mongodb2/pom.xml
+++ b/log4j-mongodb2/pom.xml
@@ -20,7 +20,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT4.0.0
diff --git a/log4j-mongodb3/pom.xml b/log4j-mongodb3/pom.xml
index 4d4a6520d2b..2d6667db5a6 100644
--- a/log4j-mongodb3/pom.xml
+++ b/log4j-mongodb3/pom.xml
@@ -20,7 +20,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT4.0.0
diff --git a/log4j-osgi/pom.xml b/log4j-osgi/pom.xml
index ea454fdc6ce..6200b86a9a1 100644
--- a/log4j-osgi/pom.xml
+++ b/log4j-osgi/pom.xml
@@ -20,7 +20,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT../log4j-osgi
diff --git a/log4j-perf/pom.xml b/log4j-perf/pom.xml
index 0f48624edef..02e3162780d 100644
--- a/log4j-perf/pom.xml
+++ b/log4j-perf/pom.xml
@@ -20,7 +20,7 @@
log4jorg.apache.logging.log4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT../
diff --git a/log4j-samples/log4j-samples-configuration/pom.xml b/log4j-samples/log4j-samples-configuration/pom.xml
index 0003f3713c9..dc65cb2708c 100644
--- a/log4j-samples/log4j-samples-configuration/pom.xml
+++ b/log4j-samples/log4j-samples-configuration/pom.xml
@@ -20,7 +20,7 @@
log4j-samplesorg.apache.logging.log4j.samples
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOTlog4j-samples-configurationjar
diff --git a/log4j-samples/log4j-samples-flume-common/pom.xml b/log4j-samples/log4j-samples-flume-common/pom.xml
index a5df8cac9f3..876b9ecb3c7 100644
--- a/log4j-samples/log4j-samples-flume-common/pom.xml
+++ b/log4j-samples/log4j-samples-flume-common/pom.xml
@@ -20,7 +20,7 @@
log4j-samplesorg.apache.logging.log4j.samples
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOTlog4j-samples-flume-commonjar
diff --git a/log4j-samples/log4j-samples-flume-embedded/pom.xml b/log4j-samples/log4j-samples-flume-embedded/pom.xml
index e8892792cd7..00b95d0449b 100644
--- a/log4j-samples/log4j-samples-flume-embedded/pom.xml
+++ b/log4j-samples/log4j-samples-flume-embedded/pom.xml
@@ -20,7 +20,7 @@
log4j-samplesorg.apache.logging.log4j.samples
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOTlog4j-samples-flume-embeddedwar
diff --git a/log4j-samples/log4j-samples-flume-remote/pom.xml b/log4j-samples/log4j-samples-flume-remote/pom.xml
index 76e50a8afb2..c5e16f3bead 100644
--- a/log4j-samples/log4j-samples-flume-remote/pom.xml
+++ b/log4j-samples/log4j-samples-flume-remote/pom.xml
@@ -20,7 +20,7 @@
log4j-samplesorg.apache.logging.log4j.samples
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOTlog4j-samples-flume-remotewar
diff --git a/log4j-samples/log4j-samples-loggerProperties/pom.xml b/log4j-samples/log4j-samples-loggerProperties/pom.xml
index 36c14440511..25ca5c8c59a 100644
--- a/log4j-samples/log4j-samples-loggerProperties/pom.xml
+++ b/log4j-samples/log4j-samples-loggerProperties/pom.xml
@@ -20,7 +20,7 @@
log4j-samplesorg.apache.logging.log4j.samples
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOTlog4j-samples-loggerPropertiesjar
diff --git a/log4j-samples/pom.xml b/log4j-samples/pom.xml
index 92e1284139a..d479b3cbd7e 100644
--- a/log4j-samples/pom.xml
+++ b/log4j-samples/pom.xml
@@ -20,7 +20,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT../org.apache.logging.log4j.samples
diff --git a/log4j-slf4j-impl/pom.xml b/log4j-slf4j-impl/pom.xml
index db270ee1f36..2b5fcdd2d91 100644
--- a/log4j-slf4j-impl/pom.xml
+++ b/log4j-slf4j-impl/pom.xml
@@ -20,7 +20,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT../log4j-slf4j-impl
diff --git a/log4j-smtp/pom.xml b/log4j-smtp/pom.xml
index 203db56de7a..99cb383bdea 100644
--- a/log4j-smtp/pom.xml
+++ b/log4j-smtp/pom.xml
@@ -12,7 +12,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT4.0.0
diff --git a/log4j-taglib/pom.xml b/log4j-taglib/pom.xml
index 49361e2aaf6..8c321a1b271 100644
--- a/log4j-taglib/pom.xml
+++ b/log4j-taglib/pom.xml
@@ -20,7 +20,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT../log4j-taglib
diff --git a/log4j-to-slf4j/pom.xml b/log4j-to-slf4j/pom.xml
index c7231003ee8..e544bbde6cc 100644
--- a/log4j-to-slf4j/pom.xml
+++ b/log4j-to-slf4j/pom.xml
@@ -20,7 +20,7 @@
org.apache.logging.log4jlog4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT../log4j-to-slf4j
diff --git a/log4j-web/pom.xml b/log4j-web/pom.xml
index fb4fe1a771c..1d4300c8594 100644
--- a/log4j-web/pom.xml
+++ b/log4j-web/pom.xml
@@ -20,7 +20,7 @@
log4jorg.apache.logging.log4j
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOT4.0.0
diff --git a/pom.xml b/pom.xml
index 86d2786f041..ed00dd87018 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,7 +20,7 @@
log4jpomApache Log4j 2
- 2.10.1-SNAPSHOT
+ 3.0.0-SNAPSHOTorg.apache.logginglogging-parent
From a9e8f525a20d92d85caf6c4e4de22d45b0a98c2c Mon Sep 17 00:00:00 2001
From: rpopma
Date: Thu, 1 Feb 2018 21:08:50 +0900
Subject: [PATCH 0031/2347] Update changes.xml: moved JIRA tickets that are not
included in the 2.11 release to the 3.0 section
---
src/changes/changes.xml | 40 +++++++++++++++++++++-------------------
1 file changed, 21 insertions(+), 19 deletions(-)
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 2f21b0f8dbe..469493ae421 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -30,13 +30,33 @@
- "update" - Change
- "remove" - Removed
-->
-
+
Renamed package core.util.datetime to core.time.internal.format to clarify these classes are to be considered private.
Moved time-related classes from core.util to core.time. Classes considered private moved to core.time.internal.
+
+ Split off ZeroMq/JeroMq support into a new module log4j-jeromq.
+
+
+ Split off Kafka support into a new module log4j-kafka.
+
+
+ Split off SMTP support into a new module log4j-smtp.
+
+
+ Move CSV layout from log4j-core to a new module log4j-csv.
+
+
+ Move JMS code to a new module log4j-jms.
+
+
+ Move JDBC code to a new module log4j-jdbc.
+
+
+
Removed unnecessary dependency on jcommander since Log4j uses embedded picocli since 2.9.
@@ -173,24 +193,6 @@
Update Jackson from 2.9.3 to 2.9.4.
-
- Split off ZeroMq/JeroMq support into a new module log4j-jeromq.
-
-
- Split off Kafka support into a new module log4j-kafka.
-
-
- Split off SMTP support into a new module log4j-smtp.
-
-
- Move CSV layout from log4j-core to a new module log4j-csv.
-
-
- Move JMS code to a new module log4j-jms.
-
-
- Move JDBC code to a new module log4j-jdbc.
-
From f8479bc534f68a3a7cd1e1a9babc5d33a66aa805 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Wed, 7 Feb 2018 10:12:08 -0700
Subject: [PATCH 0032/2347] Better test class name.
---
.../log4j/osgi/tests/junit/{OsgiRule.java => OsgiTestRule.java} | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/junit/{OsgiRule.java => OsgiTestRule.java} (100%)
diff --git a/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/junit/OsgiRule.java b/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/junit/OsgiTestRule.java
similarity index 100%
rename from log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/junit/OsgiRule.java
rename to log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/junit/OsgiTestRule.java
From 3d07263d8a1a70c6a64bcb08a5396edb92eafa7b Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Wed, 7 Feb 2018 10:14:59 -0700
Subject: [PATCH 0033/2347] Better test class name.
---
.../apache/logging/log4j/osgi/tests/junit/OsgiTestRule.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/junit/OsgiTestRule.java b/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/junit/OsgiTestRule.java
index 68321579ee9..4e683682162 100644
--- a/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/junit/OsgiTestRule.java
+++ b/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/junit/OsgiTestRule.java
@@ -28,12 +28,12 @@
/**
* JUnit rule to initialize and shutdown an OSGi framework.
*/
-public class OsgiRule extends ExternalResource {
+public class OsgiTestRule extends ExternalResource {
private final FrameworkFactory factory;
private Framework framework;
- public OsgiRule(final FrameworkFactory factory) {
+ public OsgiTestRule(final FrameworkFactory factory) {
this.factory = factory;
}
From 5f248ef7a498aa5c8cfe3ae9e0bf7ab644890435 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Wed, 7 Feb 2018 10:16:26 -0700
Subject: [PATCH 0034/2347] Better test class name.
---
.../logging/log4j/osgi/tests/AbstractLoadBundleTest.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractLoadBundleTest.java b/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractLoadBundleTest.java
index dde3f7de9e5..988263194ea 100644
--- a/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractLoadBundleTest.java
+++ b/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractLoadBundleTest.java
@@ -24,7 +24,7 @@
import java.nio.file.Paths;
import org.apache.logging.log4j.osgi.tests.junit.BundleTestInfo;
-import org.apache.logging.log4j.osgi.tests.junit.OsgiRule;
+import org.apache.logging.log4j.osgi.tests.junit.OsgiTestRule;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
@@ -46,7 +46,7 @@ public abstract class AbstractLoadBundleTest {
private Path here;
@Rule
- public OsgiRule osgi = new OsgiRule(getFactory());
+ public OsgiTestRule osgi = new OsgiTestRule(getFactory());
/**
* Constructs a test for a given bundle.
*/
From ad2ee803e0348036349ea776514cf243a7b76fee Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Wed, 7 Feb 2018 10:30:35 -0700
Subject: [PATCH 0035/2347] Remove exceptions that are not thrown from method
signatures.
---
.../logging/log4j/osgi/tests/AbstractLoadBundleTest.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractLoadBundleTest.java b/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractLoadBundleTest.java
index 988263194ea..6edf48a31e6 100644
--- a/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractLoadBundleTest.java
+++ b/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractLoadBundleTest.java
@@ -59,7 +59,7 @@ public AbstractLoadBundleTest() {
* Called before each @Test.
*/
@Before
- public void before() throws BundleException {
+ public void before() {
bundleContext = osgi.getFramework().getBundleContext();
here = Paths.get(".").toAbsolutePath().normalize();
@@ -150,7 +150,7 @@ private void uninstall(final Bundle api, final Bundle core, final Bundle dummy)
* Tests starting, then stopping, then restarting, then stopping, and finally uninstalling the API and Core bundles
*/
@Test
- public void testApiCoreStartStopStartStop() throws BundleException, ReflectiveOperationException {
+ public void testApiCoreStartStopStartStop() throws BundleException {
final Bundle api = getApiBundle();
final Bundle core = getCoreBundle();
From ae6d9c15b0e8e9a754e5396a4ee968f7465efc3e Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Wed, 7 Feb 2018 10:41:05 -0700
Subject: [PATCH 0036/2347] Minor refactoring in test framework.
---
.../logging/log4j/osgi/tests/AbstractLoadBundleTest.java | 8 ++++----
.../logging/log4j/osgi/tests/junit/BundleTestInfo.java | 5 ++++-
2 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractLoadBundleTest.java b/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractLoadBundleTest.java
index 6edf48a31e6..80f4dc7be66 100644
--- a/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractLoadBundleTest.java
+++ b/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractLoadBundleTest.java
@@ -66,23 +66,23 @@ public void before() {
}
private Bundle getApiBundle() throws BundleException {
- final Path apiPath = here.resolveSibling("log4j-api").resolve("target").resolve("log4j-api-" + bundleTestInfo.getVersion() + ".jar");
+ final Path apiPath = here.resolveSibling("log4j-api").resolve("target").resolve(bundleTestInfo.buildJarFileName("log4j-api"));
return bundleContext.installBundle(apiPath.toUri().toString());
}
private Bundle getCoreBundle() throws BundleException {
- final Path corePath = here.resolveSibling("log4j-core").resolve("target").resolve("log4j-core-" + bundleTestInfo.getVersion() + ".jar");
+ final Path corePath = here.resolveSibling("log4j-core").resolve("target").resolve(bundleTestInfo.buildJarFileName("log4j-core"));
return bundleContext.installBundle(corePath.toUri().toString());
}
private Bundle getDummyBundle() throws BundleException {
- final Path dumyPath = here.resolveSibling("log4j-samples").resolve("log4j-samples-configuration").resolve("target").resolve("log4j-samples-configuration-" + bundleTestInfo.getVersion() + ".jar");
+ final Path dumyPath = here.resolveSibling("log4j-samples").resolve("log4j-samples-configuration").resolve("target").resolve(bundleTestInfo.buildJarFileName("log4j-samples-configuration"));
return bundleContext.installBundle(dumyPath.toUri().toString());
}
private Bundle get12ApiBundle() throws BundleException {
- final Path apiPath = here.resolveSibling("log4j-1.2-api").resolve("target").resolve("log4j-1.2-api-" + bundleTestInfo.getVersion() + ".jar");
+ final Path apiPath = here.resolveSibling("log4j-1.2-api").resolve("target").resolve(bundleTestInfo.buildJarFileName("log4j-1.2-api"));
return bundleContext.installBundle(apiPath.toUri().toString());
}
diff --git a/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/junit/BundleTestInfo.java b/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/junit/BundleTestInfo.java
index 9a4f8a81737..02596168d81 100644
--- a/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/junit/BundleTestInfo.java
+++ b/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/junit/BundleTestInfo.java
@@ -45,6 +45,10 @@ public BundleTestInfo() {
}
}
+ public String buildJarFileName(final String artifactId) {
+ return artifactId + "-" + getVersion() + ".jar";
+ }
+
/**
* Gets the Maven artifact ID.
*
@@ -67,5 +71,4 @@ public String getVersion() {
public String toString() {
return "BundleTestInfo [project=" + project + "]";
}
-
}
From 9774e05ec9d3cd2394e5736fb8902b90c54e4165 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Wed, 7 Feb 2018 11:51:20 -0700
Subject: [PATCH 0037/2347] Refactoring in test framework before porting to
Apache Commons Testing.
---
.../osgi/tests/AbstractLoadBundleTest.java | 52 +++----------
.../log4j/osgi/tests/AbstractOsgiTest.java | 74 +++++++++++++++++++
2 files changed, 84 insertions(+), 42 deletions(-)
create mode 100644 log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractOsgiTest.java
diff --git a/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractLoadBundleTest.java b/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractLoadBundleTest.java
index 80f4dc7be66..8b0a6656c29 100644
--- a/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractLoadBundleTest.java
+++ b/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractLoadBundleTest.java
@@ -21,69 +21,37 @@
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.nio.file.Path;
-import java.nio.file.Paths;
-import org.apache.logging.log4j.osgi.tests.junit.BundleTestInfo;
-import org.apache.logging.log4j.osgi.tests.junit.OsgiTestRule;
import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Rule;
import org.junit.Test;
import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
import org.osgi.framework.launch.FrameworkFactory;
/**
* Tests a basic Log4J 'setup' in an OSGi container.
*/
-public abstract class AbstractLoadBundleTest {
-
- private BundleContext bundleContext;
-
- private final BundleTestInfo bundleTestInfo;
-
- private Path here;
-
- @Rule
- public OsgiTestRule osgi = new OsgiTestRule(getFactory());
- /**
- * Constructs a test for a given bundle.
- */
- public AbstractLoadBundleTest() {
- super();
- this.bundleTestInfo = new BundleTestInfo();
- }
-
- /**
- * Called before each @Test.
- */
- @Before
- public void before() {
- bundleContext = osgi.getFramework().getBundleContext();
-
- here = Paths.get(".").toAbsolutePath().normalize();
- }
+public abstract class AbstractLoadBundleTest extends AbstractOsgiTest {
private Bundle getApiBundle() throws BundleException {
- final Path apiPath = here.resolveSibling("log4j-api").resolve("target").resolve(bundleTestInfo.buildJarFileName("log4j-api"));
- return bundleContext.installBundle(apiPath.toUri().toString());
+ final Path apiPath = getHere().resolveSibling("log4j-api").resolve("target").resolve(getBundleTestInfo().buildJarFileName("log4j-api"));
+ return getBundleContext().installBundle(apiPath.toUri().toString());
}
private Bundle getCoreBundle() throws BundleException {
- final Path corePath = here.resolveSibling("log4j-core").resolve("target").resolve(bundleTestInfo.buildJarFileName("log4j-core"));
- return bundleContext.installBundle(corePath.toUri().toString());
+ final Path corePath = getHere().resolveSibling("log4j-core").resolve("target").resolve(getBundleTestInfo().buildJarFileName("log4j-core"));
+ return getBundleContext().installBundle(corePath.toUri().toString());
}
private Bundle getDummyBundle() throws BundleException {
- final Path dumyPath = here.resolveSibling("log4j-samples").resolve("log4j-samples-configuration").resolve("target").resolve(bundleTestInfo.buildJarFileName("log4j-samples-configuration"));
- return bundleContext.installBundle(dumyPath.toUri().toString());
+ final Path dumyPath = getHere().resolveSibling("log4j-samples").resolve("log4j-samples-configuration").resolve("target").resolve(getBundleTestInfo().buildJarFileName("log4j-samples-configuration"));
+ return getBundleContext().installBundle(dumyPath.toUri().toString());
}
private Bundle get12ApiBundle() throws BundleException {
- final Path apiPath = here.resolveSibling("log4j-1.2-api").resolve("target").resolve(bundleTestInfo.buildJarFileName("log4j-1.2-api"));
- return bundleContext.installBundle(apiPath.toUri().toString());
+ final Path apiPath = getHere().resolveSibling("log4j-1.2-api").resolve("target").resolve(getBundleTestInfo().buildJarFileName("log4j-1.2-api"));
+ return getBundleContext().installBundle(apiPath.toUri().toString());
}
@@ -314,7 +282,7 @@ public void testLog4J12Fragement() throws BundleException, ReflectiveOperationEx
core.stop();
api.stop();
-
+
uninstall(api, core, compat);
}
diff --git a/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractOsgiTest.java b/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractOsgiTest.java
new file mode 100644
index 00000000000..bd47a89a428
--- /dev/null
+++ b/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractOsgiTest.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.osgi.tests;
+
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import org.apache.logging.log4j.osgi.tests.junit.BundleTestInfo;
+import org.apache.logging.log4j.osgi.tests.junit.OsgiTestRule;
+import org.junit.Before;
+import org.junit.Rule;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.launch.FrameworkFactory;
+
+/**
+ * Tests a basic Log4J 'setup' in an OSGi container.
+ */
+public abstract class AbstractOsgiTest {
+
+ private BundleContext bundleContext;
+
+ private final BundleTestInfo bundleTestInfo;
+
+ private Path here;
+
+ @Rule
+ public OsgiTestRule osgi = new OsgiTestRule(getFactory());
+
+ /**
+ * Constructs a test for a given bundle.
+ */
+ public AbstractOsgiTest() {
+ super();
+ this.bundleTestInfo = new BundleTestInfo();
+ }
+
+ /**
+ * Called before each @Test.
+ */
+ @Before
+ public void before() {
+ bundleContext = osgi.getFramework().getBundleContext();
+ here = Paths.get(".").toAbsolutePath().normalize();
+ }
+
+ public BundleContext getBundleContext() {
+ return bundleContext;
+ }
+
+ public BundleTestInfo getBundleTestInfo() {
+ return bundleTestInfo;
+ }
+
+ protected abstract FrameworkFactory getFactory();
+
+ public Path getHere() {
+ return here;
+ }
+
+}
From c7c7aaa460ba0f387abf9079415c0ad9576d2fd3 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Wed, 7 Feb 2018 11:51:55 -0700
Subject: [PATCH 0038/2347] Javadoc.
---
.../org/apache/logging/log4j/osgi/tests/AbstractOsgiTest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractOsgiTest.java b/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractOsgiTest.java
index bd47a89a428..a717c464f5d 100644
--- a/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractOsgiTest.java
+++ b/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractOsgiTest.java
@@ -27,7 +27,7 @@
import org.osgi.framework.launch.FrameworkFactory;
/**
- * Tests a basic Log4J 'setup' in an OSGi container.
+ * Subclasses can tests a basic setup in an OSGi container.
*/
public abstract class AbstractOsgiTest {
From 113611db542cf6566909239323a5795927e8d3cf Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Wed, 7 Feb 2018 12:01:24 -0700
Subject: [PATCH 0039/2347] Refactoring in test framework before porting to
Apache Commons Testing.
---
.../logging/log4j/osgi/tests/AbstractLoadBundleTest.java | 3 ---
1 file changed, 3 deletions(-)
diff --git a/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractLoadBundleTest.java b/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractLoadBundleTest.java
index 8b0a6656c29..5b63c6561d4 100644
--- a/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractLoadBundleTest.java
+++ b/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractLoadBundleTest.java
@@ -26,7 +26,6 @@
import org.junit.Test;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleException;
-import org.osgi.framework.launch.FrameworkFactory;
/**
* Tests a basic Log4J 'setup' in an OSGi container.
@@ -55,8 +54,6 @@ private Bundle get12ApiBundle() throws BundleException {
}
- protected abstract FrameworkFactory getFactory();
-
private void log(final Bundle dummy) throws ReflectiveOperationException {
// use reflection to log in the context of the dummy bundle
From fd21d224b519ce0a479bb0c468907f6a01917f87 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Wed, 7 Feb 2018 12:04:51 -0700
Subject: [PATCH 0040/2347] Remove unused class that is now in log4j-osgi.
---
.../logging/log4j/junit/BundleTestInfo.java | 71 -------------------
1 file changed, 71 deletions(-)
delete mode 100644 log4j-api/src/test/java/org/apache/logging/log4j/junit/BundleTestInfo.java
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/junit/BundleTestInfo.java b/log4j-api/src/test/java/org/apache/logging/log4j/junit/BundleTestInfo.java
deleted file mode 100644
index 7cdf46831da..00000000000
--- a/log4j-api/src/test/java/org/apache/logging/log4j/junit/BundleTestInfo.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * 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.junit;
-
-import java.io.FileReader;
-import java.io.IOException;
-
-import org.apache.maven.model.Model;
-import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
-import org.apache.maven.project.MavenProject;
-import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
-
-/**
- * Provides tests with bundle information. Reads the {@code pom.xml} in the current directory to get project settings.
- */
-public class BundleTestInfo {
-
- private final MavenProject project;
-
- /**
- * Constructs a new helper objects and initializes itself.
- */
- public BundleTestInfo() {
- try (final FileReader reader = new FileReader("pom.xml")) {
- // get a raw POM view, not a fully realized POM object.
- final Model model = new MavenXpp3Reader().read(reader);
- this.project = new MavenProject(model);
- } catch (final IOException | XmlPullParserException e) {
- throw new IllegalStateException("Could not read pom.xml", e);
- }
- }
-
- /**
- * Gets the Maven artifact ID.
- *
- * @return the Maven artifact ID.
- */
- public String getArtifactId() {
- return project.getArtifactId();
- }
-
- /**
- * Gets the Maven version String.
- *
- * @return the Maven version String.
- */
- public String getVersion() {
- return project.getVersion();
- }
-
- @Override
- public String toString() {
- return "BundleTestInfo [project=" + project + "]";
- }
-
-}
From 5c5716bdf0494b70115960aa998776ce2de9dc66 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Thu, 8 Feb 2018 21:08:57 -0700
Subject: [PATCH 0041/2347] [LOG4J2-2243] Cannot see or copy all of certain
JAnsi exception messages on Windows due to NUL characters.
---
.../src/main/java/org/apache/logging/log4j/util/Chars.java | 3 +++
.../logging/log4j/core/appender/ConsoleAppender.java | 7 ++++++-
src/changes/changes.xml | 3 +++
3 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/Chars.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/Chars.java
index c6642eac3ff..996a5b13f52 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/Chars.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/Chars.java
@@ -33,6 +33,9 @@ public final class Chars {
/** Line Feed. */
public static final char LF = '\n';
+ /** NUL. */
+ public static final char NUL = 0;
+
/** Single Quote [']. */
public static final char QUOTE = '\'';
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
index 90d16e6a961..f6103e635f4 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
@@ -39,6 +39,7 @@
import org.apache.logging.log4j.core.util.Booleans;
import org.apache.logging.log4j.core.util.CloseShieldOutputStream;
import org.apache.logging.log4j.core.util.Throwables;
+import org.apache.logging.log4j.util.Chars;
import org.apache.logging.log4j.util.LoaderUtil;
import org.apache.logging.log4j.util.PropertiesUtil;
@@ -273,11 +274,15 @@ private static OutputStream getOutputStream(final boolean follow, final boolean
} catch (final NoSuchMethodException nsme) {
LOGGER.warn("{} is missing the proper constructor", JANSI_CLASS);
} catch (final Exception ex) {
- LOGGER.warn("Unable to instantiate {} due to {}", JANSI_CLASS, Throwables.getRootCause(ex).toString().trim());
+ LOGGER.warn("Unable to instantiate {} due to {}", JANSI_CLASS, clean(Throwables.getRootCause(ex).toString()).trim());
}
return outputStream;
}
+ private static String clean(String string) {
+ return string.replace(Chars.NUL, Chars.SPACE);
+ }
+
/**
* An implementation of OutputStream that redirects to the current System.err.
*/
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 469493ae421..23f5d08e577 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -193,6 +193,9 @@
Update Jackson from 2.9.3 to 2.9.4.
+
+ Cannot see or copy all of certain JAnsi exception messages on Windows due to NUL characters.
+
From ad5a3a8deed0f3066cf1d08235dc56c21fee511d Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Sat, 10 Feb 2018 09:47:29 -0700
Subject: [PATCH 0042/2347] Remove comment that no longer applies since this is
an interface and not a class with factory methods.
---
.../java/org/apache/logging/log4j/core/lookup/StrLookup.java | 4 ----
1 file changed, 4 deletions(-)
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/StrLookup.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/StrLookup.java
index e29d2804a27..cdef668b750 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/StrLookup.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/StrLookup.java
@@ -26,10 +26,6 @@
* demand based on the key.
*
*
- * This class comes complete with various factory methods.
- * If these do not suffice, you can subclass and implement your own matcher.
- *
- *
* For example, it would be possible to implement a lookup that used the
* key as a primary key, and looked up the value on demand from the database
*
From 585d5ca8d6b101603599385982609229ff8ee7bf Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Sat, 10 Feb 2018 09:54:34 -0700
Subject: [PATCH 0043/2347] [LOG4J2-2244]
org.apache.logging.log4j.core.lookup.EnvironmentLookup may throw NPE.
---
.../log4j/core/lookup/EnvironmentLookup.java | 15 ++++++++++-----
src/changes/changes.xml | 3 +++
2 files changed, 13 insertions(+), 5 deletions(-)
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/EnvironmentLookup.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/EnvironmentLookup.java
index 1d3b8115e3b..7f0d9355853 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/EnvironmentLookup.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/EnvironmentLookup.java
@@ -26,13 +26,18 @@
public class EnvironmentLookup extends AbstractLookup {
/**
- * Looks up the value of the environment variable.
- * @param event The current LogEvent (is ignored by this StrLookup).
- * @param key the key to be looked up, may be null
- * @return The value of the environment variable.
+ * Looks up the value of the given environment variable.
+ *
+ * @param event
+ * The current LogEvent (ignored by this StrLookup).
+ * @param key
+ * the key to look up, may be null
+ * @return the string value of the variable, or null if the variable is not defined in the system
+ * environment
*/
@Override
public String lookup(final LogEvent event, final String key) {
- return System.getenv(key);
+ // getenv throws NullPointerException if name is null
+ return key != null ? System.getenv(key) : null;
}
}
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 23f5d08e577..ea96b881de0 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -55,6 +55,9 @@
Move JDBC code to a new module log4j-jdbc.
+
+ org.apache.logging.log4j.core.lookup.EnvironmentLookup may throw NPE.
+
From f8158646d9aa324302026c033783909108ad9da5 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Sat, 10 Feb 2018 09:59:10 -0700
Subject: [PATCH 0044/2347] Fix incorrect Javadoc.
---
.../logging/log4j/core/lookup/SystemPropertiesLookup.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/SystemPropertiesLookup.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/SystemPropertiesLookup.java
index d2fb530d8c4..b74569a686e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/SystemPropertiesLookup.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/SystemPropertiesLookup.java
@@ -33,7 +33,7 @@ public class SystemPropertiesLookup extends AbstractLookup {
private static final Marker LOOKUP = MarkerManager.getMarker("LOOKUP");
/**
- * Looks up the value for the key using the data in the LogEvent.
+ * Looks up the value for the key from system properties.
* @param event The current LogEvent.
* @param key the key to be looked up, may be null
* @return The value associated with the key.
From 9eb14d414fa92ad145a1ac2a469de708b155c4d6 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Sat, 10 Feb 2018 11:32:26 -0700
Subject: [PATCH 0045/2347] Javadoc fix.
---
.../java/org/apache/logging/log4j/core/lookup/JavaLookup.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JavaLookup.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JavaLookup.java
index 08e388530fa..4b230f970b4 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JavaLookup.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JavaLookup.java
@@ -89,7 +89,7 @@ public String getVirtualMachine() {
}
/**
- * Looks up the value of the environment variable.
+ * Looks up the value of the Java platform key.
*
* @param event
* The current LogEvent (is ignored by this StrLookup).
From 9c099b25169f77a0f217c939b1eedbc413553fae Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Sat, 10 Feb 2018 11:49:04 -0700
Subject: [PATCH 0046/2347] Javadoc.
---
.../java/org/apache/logging/log4j/core/lookup/Interpolator.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/Interpolator.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/Interpolator.java
index 122515c26ad..e09cd9e83dd 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/Interpolator.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/Interpolator.java
@@ -32,7 +32,7 @@
import org.apache.logging.log4j.util.Constants;
/**
- * Proxies all the other {@link StrLookup}s.
+ * Proxies other {@link StrLookup}s using a keys within ${} markers.
*/
public class Interpolator extends AbstractConfigurationAwareLookup {
From c580bb7beb1cbfa5f1a141363be15e43a1fcfaf8 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Sat, 10 Feb 2018 18:15:24 -0700
Subject: [PATCH 0047/2347] [LOG4J2-2245] Update Apache Commons Compress from
1.15 to 1.16.1.
---
pom.xml | 2 +-
src/changes/changes.xml | 3 +++
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index ed00dd87018..494fc7bf9f4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -790,7 +790,7 @@
org.apache.commonscommons-compress
- 1.15
+ 1.16.1org.tukaani
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index ea96b881de0..008b6820c04 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -199,6 +199,9 @@
Cannot see or copy all of certain JAnsi exception messages on Windows due to NUL characters.
+
+ Update Apache Commons Compress from 1.15 to 1.16.1.
+
From 1175e4a89809d8fba68c5a25d0b780d2f044fbfe Mon Sep 17 00:00:00 2001
From: rpopma
Date: Sun, 11 Feb 2018 17:47:43 +0900
Subject: [PATCH 0048/2347] Add TOC for Maven, Ivy, Gradle Artifacts page to
left-nav menu
---
src/site/site.xml | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/src/site/site.xml b/src/site/site.xml
index 6e0ac6293e0..b30d20147c9 100644
--- a/src/site/site.xml
+++ b/src/site/site.xml
@@ -37,7 +37,15 @@
-
+
+
+
+
+
+
+
+
+
From 1d55f0f1f9c16c376f4f61b7851f262c1a0f2830 Mon Sep 17 00:00:00 2001
From: rpopma
Date: Fri, 16 Feb 2018 12:58:17 +0900
Subject: [PATCH 0049/2347] LOG4J2-2250 The internal status logger timestamp
format is now configurable with system property
`log4j2.StatusLogger.dateformat`.
(cherry picked from commit 377570d)
---
.../logging/log4j/status/StatusLogger.java | 10 ++++++-
src/site/xdoc/manual/configuration.xml.vm | 28 +++++++++++++++++--
2 files changed, 34 insertions(+), 4 deletions(-)
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusLogger.java b/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusLogger.java
index 25e85ffadc0..57da8f9ef1e 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusLogger.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusLogger.java
@@ -64,6 +64,13 @@ public final class StatusLogger extends AbstractLogger {
*/
public static final String DEFAULT_STATUS_LISTENER_LEVEL = "log4j2.StatusLogger.level";
+ /**
+ * System property that can be configured with a date-time format string to use as the format for timestamps
+ * in the status logger output. See {@link java.text.SimpleDateFormat} for supported formats.
+ * @since 2.11.0
+ */
+ public static final String STATUS_DATE_FORMAT = "log4j2.StatusLogger.dateformat";
+
private static final long serialVersionUID = 2L;
private static final String NOT_AVAIL = "?";
@@ -96,7 +103,8 @@ public final class StatusLogger extends AbstractLogger {
private StatusLogger(final String name, final MessageFactory messageFactory) {
super(name, messageFactory);
- this.logger = new SimpleLogger("StatusLogger", Level.ERROR, false, true, false, false, Strings.EMPTY,
+ this.logger = new SimpleLogger("StatusLogger", Level.ERROR, false, true, false, false,
+ System.getProperty(STATUS_DATE_FORMAT, Strings.EMPTY),
messageFactory, PROPS, System.err);
this.listenersLevel = Level.toLevel(DEFAULT_STATUS_LEVEL, Level.WARN).intLevel();
diff --git a/src/site/xdoc/manual/configuration.xml.vm b/src/site/xdoc/manual/configuration.xml.vm
index 525baa108fd..9c773c280a5 100644
--- a/src/site/xdoc/manual/configuration.xml.vm
+++ b/src/site/xdoc/manual/configuration.xml.vm
@@ -1623,7 +1623,17 @@ public class AwesomeTest {
column contains the name used in properties files and system properties; Environemt Variable
for the equivalent environment variable; and Legacy Property Name for the pre-2.10 name.
-
Factory class used by LogManager to bootstrap the logging implementation.
- The core jar provides org.apache.logging.log4j.core.impl.Log4jContextFactory.
+ The core jar provides org.apache.logging.log4j.core
+ .impl.Log4jContextFactory.
@@ -1708,7 +1719,8 @@ public class AwesomeTest {
log4j.configurationFactory
- Fully specified class name of a class extending org.apache.logging.log4j.core.config.ConfigurationFactory.
+ Fully specified class name of a class extending org.apache.logging.log4j.core
+ .config.ConfigurationFactory.
If specified, an instance of this class is added to the list of configuration factories.
@@ -2022,6 +2034,16 @@ public class AwesomeTest {
StatusLogger.getStatusData().
+
+
log4j2.statusLoggerDateformat
+
LOG4J_STATUS_LOGGER_DATEFORMAT
+
log4j2.StatusLogger.dateformat
+
"yyyy/MM/dd HH:mm:ss:SSS zzz"
+
+ Date-time format string to use as the format for timestamps
+ in the status logger output. See java.text.SimpleDateFormat for supported formats.
+
+
log4j2.asyncLoggerExceptionHandler
LOG4J_ASYNC_LOGGER_EXCEPTION_HANDLER
From 08d2c1ef3cbdb7eb4512194c5981c81b693c051b Mon Sep 17 00:00:00 2001
From: rpopma
Date: Fri, 16 Feb 2018 12:59:09 +0900
Subject: [PATCH 0050/2347] LOG4J2-2250 update change log (configurable status
logger timestamps)
(cherry picked from commit 7588d3f)
---
src/changes/changes.xml | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 008b6820c04..58f434023c3 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -60,6 +60,9 @@
+
+ The internal status logger timestamp format is now configurable with system property `log4j2.StatusLogger.dateformat`.
+
Removed unnecessary dependency on jcommander since Log4j uses embedded picocli since 2.9.
From 384e929d5d24bcb9669fa05d3a738865426eb8c0 Mon Sep 17 00:00:00 2001
From: rpopma
Date: Fri, 16 Feb 2018 21:30:35 +0900
Subject: [PATCH 0051/2347] Move Legacy Property Name into same column as
Property Name to prevent page from overflowing horizontally.
(cherry picked from commit e83d0fa)
---
src/site/xdoc/manual/configuration.xml.vm | 379 ++++++++++++++--------
1 file changed, 247 insertions(+), 132 deletions(-)
diff --git a/src/site/xdoc/manual/configuration.xml.vm b/src/site/xdoc/manual/configuration.xml.vm
index 9c773c280a5..b6d4a29a07a 100644
--- a/src/site/xdoc/manual/configuration.xml.vm
+++ b/src/site/xdoc/manual/configuration.xml.vm
@@ -1636,26 +1636,29 @@ public class AwesomeTest {
@@ -1749,12 +1766,14 @@ public class AwesomeTest {
-
log4j2.clock
+
log4j2.clock
+
+ (log4j.Clock)
+
LOG4J_CLOCK
-
log4j.Clock
SystemClock
- Implementation of the org.apache.logging.log4j.core.time.Clock
+ Implementation of the org.apache.logging.log4j .core.time.Clock
interface that is used for timestamping the log events.
By default, System.currentTimeMillis is called on every log event.
@@ -1764,9 +1783,11 @@ public class AwesomeTest {
Log level of the default configuration. The default configuration is used if the ConfigurationFactory
@@ -1774,9 +1795,11 @@ public class AwesomeTest {
If true, only the last component of a logger name is included in SimpleLogger log messages.
(E.g., if the logger name is "mycompany.myproject.mycomponent", only "mycomponent" is logged.
Date-time format to use.
- Ignored if org.apache.logging.log4j.simplelog.showdatetime is false.
+ Ignored if org.apache.logging.log4j .simplelog.showdatetime is false.
"system.err" (case-insensitive) logs to System.err,
"system.out" (case-insensitive) logs to System.out,
@@ -1960,38 +2017,46 @@ public class AwesomeTest {
This property is used to control the initial StatusLogger level, and can be overridden in code by calling
- StatusLogger.getLogger().setLevel(someLevel).
+ StatusLogger.getLogger() .setLevel(someLevel).
Note that the StatusLogger level is only used to determine the status log output level
until a listener is registered. In practice, a listener is registered when a configuration is found,
and from that point onwards, status messages are only sent to the listeners (depending on their statusLevel).
The initial "listenersLevel" of the StatusLogger. If StatusLogger listeners are added, the "listenerLevel"
@@ -2025,9 +2092,11 @@ public class AwesomeTest {
Default LoggerAdapter to use in the JUL adapter. By default, if log4j-core is available, then the class
org.apache.logging.log4j.jul .CoreLoggerAdapter will be used. Otherwise, the
@@ -2126,9 +2213,11 @@ public class AwesomeTest {
Used by the DiscardingAsyncQueueFullPolicy to determine which events to drop when the queue
becomes full. By default, INFO, DEBUG and TRACE level
@@ -2163,32 +2256,40 @@ public class AwesomeTest {
log4j2.AsyncQueueFullPolicy.
This system property can be used to force Log4j 2 to behave as if it is part of a web application (when true)
or as if it is not part of a web application (when false).
This system property can be used to switch off the use of threadlocals, which will partly disable
Log4j's garbage-free behaviour: to be fully garbage-free, Log4j stores
@@ -2196,9 +2297,11 @@ public class AwesomeTest {
Note that this property is not effective when Log4j detects it is running in a web application.
This property can be used to force garbage-aware Layouts and Appenders to revert to the
pre-2.6 behaviour where converting log events to text generates temporary objects like
@@ -2207,33 +2310,41 @@ public class AwesomeTest {
to text will convert this text to bytes without creating temporary objects.
In GC-free mode, this property determines the initial size of the reusable StringBuilders where the message
text is formatted and potentially passed to background threads.
In GC-free mode, this property determines the maximum size of the reusable StringBuilders where the message
text is formatted and potentially passed to background threads.
This property determines the maximum size of the thread-local reusable StringBuilders
used to format the log event to text by Layouts that extend AbstractStringLayout.
The org.apache.logging.log4j.util.Unbox utility
manages a small thread-local ring buffer of StringBuilders.
@@ -2245,17 +2356,21 @@ public class AwesomeTest {
Note that the specified number will be rounded up to the nearest power of 2.
- */
-class Initializers {
-
- /**
- * Used to set up {@link SetupContext} from different {@link SimpleModule}s.
- */
- static class SetupContextInitializer {
-
- 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.
- context.setMixInAnnotations(Marker.class, MarkerMixIn.class);
- context.setMixInAnnotations(Level.class, LevelMixIn.class);
- context.setMixInAnnotations(Instant.class, InstantMixIn.class);
- context.setMixInAnnotations(LogEvent.class, LogEventWithContextListMixIn.class);
- // 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 ? (stacktraceAsString ? ThrowableProxyWithStacktraceAsStringMixIn.class : ThrowableProxyMixIn.class ) : ThrowableProxyWithoutStacktraceMixIn.class);
- }
- }
-
- /**
- * Used to set up {@link SetupContext} from different {@link SimpleModule}s.
- * Differs from SetupContextInitializer by installing {@code LogEventJsonMixIn} for LogEvents,
- * not {@code LogEventMixIn}, so it handles ThreadContext serialization differently.
- */
- static class SetupContextJsonInitializer {
-
- 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.
- context.setMixInAnnotations(Marker.class, MarkerMixIn.class);
- context.setMixInAnnotations(Level.class, LevelMixIn.class);
- context.setMixInAnnotations(Instant.class, InstantMixIn.class);
- context.setMixInAnnotations(LogEvent.class, LogEventJsonMixIn.class); // different ThreadContext handling
- // 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 ? (stacktraceAsString ? ThrowableProxyWithStacktraceAsStringMixIn.class : ThrowableProxyMixIn.class ) : ThrowableProxyWithoutStacktraceMixIn.class);
- }
- }
-
- /**
- * Used to set up {@link SimpleModule} from different {@link SimpleModule} subclasses.
- */
- static class SimpleModuleInitializer {
- void initialize(final SimpleModule simpleModule, final boolean objectMessageAsJsonObject) {
- // Workaround because mix-ins do not work for classes that already have a built-in deserializer.
- // See Jackson issue 429.
- simpleModule.addDeserializer(StackTraceElement.class, new Log4jStackTraceElementDeserializer());
- simpleModule.addDeserializer(ContextStack.class, new MutableThreadContextStackDeserializer());
- if (objectMessageAsJsonObject) {
- simpleModule.addSerializer(ObjectMessage.class, new ObjectMessageSerializer());
- }
- simpleModule.addSerializer(Message.class, new MessageSerializer());
- }
- }
-
-}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
index 45c5f4f8983..7f01f8ef526 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
@@ -294,7 +294,7 @@ public Map getContentFormat() {
@Override
public String getContentType() {
- return JsonLayout.CONTENT_TYPE + "; charset=" + this.getCharset();
+ return "application/json; charset=" + this.getCharset();
}
@Override
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
deleted file mode 100644
index b4c914c183e..00000000000
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/JacksonFactory.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * 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.layout;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.xml.stream.XMLStreamException;
-
-import org.apache.logging.log4j.core.impl.Log4jLogEvent;
-import org.apache.logging.log4j.core.jackson.JsonConstants;
-import org.apache.logging.log4j.core.jackson.Log4jJsonObjectMapper;
-import org.apache.logging.log4j.core.jackson.Log4jXmlObjectMapper;
-import org.apache.logging.log4j.core.jackson.Log4jYamlObjectMapper;
-import org.apache.logging.log4j.core.jackson.XmlConstants;
-import org.codehaus.stax2.XMLStreamWriter2;
-
-import com.fasterxml.jackson.core.PrettyPrinter;
-import com.fasterxml.jackson.core.util.DefaultPrettyPrinter;
-import com.fasterxml.jackson.core.util.MinimalPrettyPrinter;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.ObjectWriter;
-import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
-import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
-import com.fasterxml.jackson.dataformat.xml.util.DefaultXmlPrettyPrinter;
-
-abstract class JacksonFactory {
-
- static class JSON extends JacksonFactory {
-
- private final boolean encodeThreadContextAsList;
- private final boolean includeStacktrace;
- private final boolean stacktraceAsString;
- private final boolean objectMessageAsJsonObject;
-
- public JSON(final boolean encodeThreadContextAsList, final boolean includeStacktrace, final boolean stacktraceAsString, final boolean objectMessageAsJsonObject) {
- this.encodeThreadContextAsList = encodeThreadContextAsList;
- this.includeStacktrace = includeStacktrace;
- this.stacktraceAsString = stacktraceAsString;
- this.objectMessageAsJsonObject = objectMessageAsJsonObject;
- }
-
- @Override
- protected String getPropertNameForContextMap() {
- return JsonConstants.ELT_CONTEXT_MAP;
- }
-
- @Override
- protected String getPropertNameForSource() {
- return JsonConstants.ELT_SOURCE;
- }
-
- @Override
- protected String getPropertNameForNanoTime() {
- return JsonConstants.ELT_NANO_TIME;
- }
-
- @Override
- protected PrettyPrinter newCompactPrinter() {
- return new MinimalPrettyPrinter();
- }
-
- @Override
- protected ObjectMapper newObjectMapper() {
- return new Log4jJsonObjectMapper(encodeThreadContextAsList, includeStacktrace, stacktraceAsString, objectMessageAsJsonObject);
- }
-
- @Override
- protected PrettyPrinter newPrettyPrinter() {
- return new DefaultPrettyPrinter();
- }
-
- }
-
- static class XML extends JacksonFactory {
-
- static final int DEFAULT_INDENT = 1;
-
- private final boolean includeStacktrace;
- private final boolean stacktraceAsString;
-
-
- public XML(final boolean includeStacktrace, final boolean stacktraceAsString) {
- this.includeStacktrace = includeStacktrace;
- this.stacktraceAsString = stacktraceAsString;
- }
-
- @Override
- protected String getPropertNameForContextMap() {
- return XmlConstants.ELT_CONTEXT_MAP;
- }
-
- @Override
- protected String getPropertNameForSource() {
- return XmlConstants.ELT_SOURCE;
- }
-
- @Override
- protected String getPropertNameForNanoTime() {
- return JsonConstants.ELT_NANO_TIME;
- }
-
- @Override
- protected PrettyPrinter newCompactPrinter() {
- // Yes, null is the proper answer.
- return null;
- }
-
- @Override
- protected ObjectMapper newObjectMapper() {
- return new Log4jXmlObjectMapper(includeStacktrace, stacktraceAsString);
- }
-
- @Override
- protected PrettyPrinter newPrettyPrinter() {
- return new Log4jXmlPrettyPrinter(DEFAULT_INDENT);
- }
- }
-
- static class YAML extends JacksonFactory {
-
- private final boolean includeStacktrace;
- private final boolean stacktraceAsString;
-
-
- public YAML(final boolean includeStacktrace, final boolean stacktraceAsString) {
- this.includeStacktrace = includeStacktrace;
- this.stacktraceAsString = stacktraceAsString;
- }
-
- @Override
- protected String getPropertNameForContextMap() {
- return JsonConstants.ELT_CONTEXT_MAP;
- }
-
- @Override
- protected String getPropertNameForSource() {
- return JsonConstants.ELT_SOURCE;
- }
-
- @Override
- protected String getPropertNameForNanoTime() {
- return JsonConstants.ELT_NANO_TIME;
- }
-
- @Override
- protected PrettyPrinter newCompactPrinter() {
- return new MinimalPrettyPrinter();
- }
-
- @Override
- protected ObjectMapper newObjectMapper() {
- return new Log4jYamlObjectMapper(false, includeStacktrace, stacktraceAsString);
- }
-
- @Override
- protected PrettyPrinter newPrettyPrinter() {
- return new DefaultPrettyPrinter();
- }
- }
-
- /**
- * When <Event>s are written into a XML file; the "Event" object is not the root element, but an element named
- * <Events> created using {@link XmlLayout#getHeader()} and {@link XmlLayout#getFooter()} methods.
- *
- * {@link com.fasterxml.jackson.dataformat.xml.util.DefaultXmlPrettyPrinter} is used to print the Event object into
- * XML; hence it assumes <Event> tag as the root element, so it prints the <Event> tag without any
- * indentation. To add an indentation to the <Event> tag; hence an additional indentation for any
- * sub-elements, this class is written. As an additional task, to avoid the blank line printed after the ending
- * </Event> tag, {@link #writePrologLinefeed(XMLStreamWriter2)} method is also overridden.
- *
+ * Differs from SetupContextInitializer by installing {@code LogEventJsonMixIn} for LogEvents, not
+ * {@code LogEventMixIn}, so it handles {@link ThreadContext} serialization differently.
+ *
+ *
+ * Consider this class private.
+ *
+ */
+public class JsonSetupContextInitializer {
+
+ public 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.
+ context.setMixInAnnotations(Marker.class, MarkerMixIn.class);
+ context.setMixInAnnotations(Level.class, LevelMixIn.class);
+ context.setMixInAnnotations(Instant.class, InstantMixIn.class);
+ context.setMixInAnnotations(LogEvent.class, LogEventJsonMixIn.class); // different ThreadContext handling
+ // 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
+ ? (stacktraceAsString ? ThrowableProxyWithStacktraceAsStringMixIn.class : ThrowableProxyMixIn.class)
+ : ThrowableProxyWithoutStacktraceMixIn.class);
+ }
+}
\ No newline at end of file
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/Log4jJsonModule.java b/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/Log4jJsonModule.java
similarity index 81%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/Log4jJsonModule.java
rename to log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/Log4jJsonModule.java
index ceb53b46269..ab7741138e4 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/Log4jJsonModule.java
+++ b/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/Log4jJsonModule.java
@@ -14,11 +14,10 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.jackson.json;
-import org.apache.logging.log4j.core.jackson.Initializers.SetupContextInitializer;
-import org.apache.logging.log4j.core.jackson.Initializers.SetupContextJsonInitializer;
-import org.apache.logging.log4j.core.jackson.Initializers.SimpleModuleInitializer;
+import org.apache.logging.log4j.jackson.SetupContextInitializer;
+import org.apache.logging.log4j.jackson.SimpleModuleInitializer;
import com.fasterxml.jackson.core.Version;
import com.fasterxml.jackson.databind.module.SimpleModule;
@@ -34,15 +33,13 @@ class Log4jJsonModule extends SimpleModule {
private final boolean encodeThreadContextAsList;
private final boolean includeStacktrace;
private final boolean stacktraceAsString;
- private final boolean objectMessageAsJsonObject;
Log4jJsonModule(final boolean encodeThreadContextAsList, final boolean includeStacktrace, final boolean stacktraceAsString, final boolean objectMessageAsJsonObject) {
super(Log4jJsonModule.class.getName(), new Version(2, 0, 0, null, null, null));
this.encodeThreadContextAsList = encodeThreadContextAsList;
this.includeStacktrace = includeStacktrace;
this.stacktraceAsString = stacktraceAsString;
- this.objectMessageAsJsonObject = objectMessageAsJsonObject;
- // MUST init here.
+ // MUST initialize() here.
// Calling this from setupModule is too late!
//noinspection ThisEscapedInObjectConstruction
new SimpleModuleInitializer().initialize(this, objectMessageAsJsonObject);
@@ -55,7 +52,7 @@ public void setupModule(final SetupContext context) {
if (encodeThreadContextAsList) {
new SetupContextInitializer().setupModule(context, includeStacktrace, stacktraceAsString);
} else {
- new SetupContextJsonInitializer().setupModule(context, includeStacktrace, stacktraceAsString);
+ new JsonSetupContextInitializer().setupModule(context, includeStacktrace, stacktraceAsString);
}
}
}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/Log4jJsonObjectMapper.java b/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/Log4jJsonObjectMapper.java
similarity index 97%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/Log4jJsonObjectMapper.java
rename to log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/Log4jJsonObjectMapper.java
index 4997c9135f8..f0df03b2b92 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/Log4jJsonObjectMapper.java
+++ b/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/Log4jJsonObjectMapper.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.jackson.json;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
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
new file mode 100644
index 00000000000..dd7b789ef5d
--- /dev/null
+++ b/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/layout/JsonJacksonFactory.java
@@ -0,0 +1,60 @@
+package org.apache.logging.log4j.jackson.json.layout;
+
+import org.apache.logging.log4j.jackson.AbstractJacksonFactory;
+import org.apache.logging.log4j.jackson.JsonConstants;
+import org.apache.logging.log4j.jackson.json.Log4jJsonObjectMapper;
+
+import com.fasterxml.jackson.core.PrettyPrinter;
+import com.fasterxml.jackson.core.util.DefaultPrettyPrinter;
+import com.fasterxml.jackson.core.util.MinimalPrettyPrinter;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+class JsonJacksonFactory extends AbstractJacksonFactory {
+
+ private final boolean encodeThreadContextAsList;
+ private final boolean objectMessageAsJsonObject;
+
+ public JsonJacksonFactory(final boolean encodeThreadContextAsList, final boolean includeStacktrace,
+ final boolean stacktraceAsString, final boolean objectMessageAsJsonObject) {
+ super(includeStacktrace, stacktraceAsString);
+ this.encodeThreadContextAsList = encodeThreadContextAsList;
+ this.objectMessageAsJsonObject = objectMessageAsJsonObject;
+ }
+
+ @Override
+ protected String getPropertyNameForContextMap() {
+ return JsonConstants.ELT_CONTEXT_MAP;
+ }
+
+ @Override
+ protected String getPropertyNameForNanoTime() {
+ return JsonConstants.ELT_NANO_TIME;
+ }
+
+ @Override
+ protected String getPropertyNameForSource() {
+ return JsonConstants.ELT_SOURCE;
+ }
+
+ @Override
+ protected String getPropertyNameForStackTrace() {
+ return JsonConstants.ELT_EXTENDED_STACK_TRACE;
+ }
+
+ @Override
+ protected PrettyPrinter newCompactPrinter() {
+ return new MinimalPrettyPrinter();
+ }
+
+ @Override
+ protected ObjectMapper newObjectMapper() {
+ return new Log4jJsonObjectMapper(encodeThreadContextAsList, includeStacktrace, stacktraceAsString,
+ objectMessageAsJsonObject);
+ }
+
+ @Override
+ protected PrettyPrinter newPrettyPrinter() {
+ return new DefaultPrettyPrinter();
+ }
+
+}
\ No newline at end of file
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/JsonLayout.java b/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/layout/JsonLayout.java
similarity index 88%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/layout/JsonLayout.java
rename to log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/layout/JsonLayout.java
index 607ec43baf7..224cfb4bacc 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/JsonLayout.java
+++ b/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/layout/JsonLayout.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.layout;
+package org.apache.logging.log4j.jackson.json.layout;
import java.io.IOException;
import java.io.Writer;
@@ -32,7 +32,14 @@
import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
import org.apache.logging.log4j.core.config.plugins.PluginElement;
+import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.core.util.KeyValuePair;
+import org.apache.logging.log4j.jackson.AbstractJacksonLayout;
+import org.apache.logging.log4j.jackson.XmlConstants;
+
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonUnwrapped;
/**
* Appends a series of JSON events as strings serialized as bytes.
@@ -68,12 +75,6 @@
@Plugin(name = "JsonLayout", category = Node.CATEGORY, elementType = Layout.ELEMENT_TYPE, printObject = true)
public final class JsonLayout extends AbstractJacksonLayout {
- private static final String DEFAULT_FOOTER = "]";
-
- private static final String DEFAULT_HEADER = "[";
-
- static final String CONTENT_TYPE = "application/json";
-
public static class Builder> extends AbstractJacksonLayout.Builder
implements org.apache.logging.log4j.core.util.Builder {
@@ -102,120 +103,71 @@ public JsonLayout build() {
getAdditionalFields(), getObjectMessageAsJsonObject());
}
- public boolean isPropertiesAsList() {
- return propertiesAsList;
- }
-
- public B setPropertiesAsList(final boolean propertiesAsList) {
- this.propertiesAsList = propertiesAsList;
- return asBuilder();
+ @Override
+ public KeyValuePair[] getAdditionalFields() {
+ return additionalFields;
}
public boolean getObjectMessageAsJsonObject() {
return objectMessageAsJsonObject;
}
- public B setObjectMessageAsJsonObject(final boolean objectMessageAsJsonObject) {
- this.objectMessageAsJsonObject = objectMessageAsJsonObject;
- return asBuilder();
+ public boolean isPropertiesAsList() {
+ return propertiesAsList;
}
@Override
- public KeyValuePair[] getAdditionalFields() {
- return additionalFields;
+ public B setAdditionalFields(final KeyValuePair[] additionalFields) {
+ this.additionalFields = additionalFields;
+ return asBuilder();
}
- @Override
- public B setAdditionalFields(KeyValuePair[] additionalFields) {
- this.additionalFields = additionalFields;
+ public B setObjectMessageAsJsonObject(final boolean objectMessageAsJsonObject) {
+ this.objectMessageAsJsonObject = objectMessageAsJsonObject;
return asBuilder();
}
- }
- /**
- * @deprecated Use {@link #newBuilder()} instead
- */
- @Deprecated
- 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, false, false).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(),
- false, null);
+ public B setPropertiesAsList(final boolean propertiesAsList) {
+ this.propertiesAsList = propertiesAsList;
+ return asBuilder();
+ }
}
- private 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, final boolean stacktraceAsString,
- final boolean includeNullDelimiter,
- final KeyValuePair[] additionalFields, final boolean objectMessageAsJsonObject) {
- super(config, new JacksonFactory.JSON(encodeThreadContextAsList, includeStacktrace, stacktraceAsString, objectMessageAsJsonObject).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(),
- includeNullDelimiter,
- additionalFields);
- }
+ @JsonRootName(XmlConstants.ELT_EVENT)
+ public static class JsonLogEventWithAdditionalFields extends LogEventWithAdditionalFields {
- /**
- * Returns appropriate JSON header.
- *
- * @return a byte array containing the header, opening the JSON array.
- */
- @Override
- public byte[] getHeader() {
- if (!this.complete) {
- return null;
+ public JsonLogEventWithAdditionalFields(final Object logEvent, final Map additionalFields) {
+ super(logEvent, additionalFields);
}
- final StringBuilder buf = new StringBuilder();
- final String str = serializeToString(getHeaderSerializer());
- if (str != null) {
- buf.append(str);
- }
- buf.append(this.eol);
- return getBytes(buf.toString());
- }
- /**
- * Returns appropriate JSON footer.
- *
- * @return a byte array containing the footer, closing the JSON array.
- */
- @Override
- public byte[] getFooter() {
- if (!this.complete) {
- return null;
+ @Override
+ @JsonAnyGetter
+ public Map getAdditionalFields() {
+ return super.getAdditionalFields();
}
- final StringBuilder buf = new StringBuilder();
- buf.append(this.eol);
- final String str = serializeToString(getFooterSerializer());
- if (str != null) {
- buf.append(str);
+
+ @Override
+ @JsonUnwrapped
+ public Object getLogEvent() {
+ return super.getLogEvent();
}
- buf.append(this.eol);
- return getBytes(buf.toString());
}
- @Override
- public Map getContentFormat() {
- final Map result = new HashMap<>();
- result.put("version", "2.0");
- return result;
- }
+ private static final String DEFAULT_FOOTER = "]";
+
+ private static final String DEFAULT_HEADER = "[";
+
+
+ static final String CONTENT_TYPE = "application/json";
/**
- * @return The content type.
+ * Creates a JSON Layout using the default settings. Useful for testing.
+ *
+ * @return A JSON Layout.
*/
- @Override
- public String getContentType() {
- return CONTENT_TYPE + "; charset=" + this.getCharset();
+ public static JsonLayout createDefaultLayout() {
+ return new JsonLayout(new DefaultConfiguration(), false, false, false, false, false, false,
+ DEFAULT_HEADER, DEFAULT_FOOTER, StandardCharsets.UTF_8, true, false, false, null, false);
}
/**
@@ -274,13 +226,95 @@ public static > B newBuilder() {
}
/**
- * Creates a JSON Layout using the default settings. Useful for testing.
+ * @deprecated Use {@link #newBuilder()} instead
+ */
+ @Deprecated
+ 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 JsonJacksonFactory(encodeThreadContextAsList, includeStacktrace, false, false).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(),
+ false, null);
+ }
+
+ private 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, final boolean stacktraceAsString,
+ final boolean includeNullDelimiter,
+ final KeyValuePair[] additionalFields, final boolean objectMessageAsJsonObject) {
+ super(config, new JsonJacksonFactory(encodeThreadContextAsList, includeStacktrace, stacktraceAsString, objectMessageAsJsonObject).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(),
+ includeNullDelimiter,
+ additionalFields);
+ }
+
+ @Override
+ protected LogEventWithAdditionalFields createLogEventWithAdditionalFields(final LogEvent event,
+ final Map additionalFieldsMap) {
+ return new JsonLogEventWithAdditionalFields(event, additionalFieldsMap);
+ }
+
+ @Override
+ public Map getContentFormat() {
+ final Map result = new HashMap<>();
+ result.put("version", "2.0");
+ return result;
+ }
+
+ /**
+ * @return The content type.
+ */
+ @Override
+ public String getContentType() {
+ return CONTENT_TYPE + "; charset=" + this.getCharset();
+ }
+
+ /**
+ * Returns appropriate JSON footer.
*
- * @return A JSON Layout.
+ * @return a byte array containing the footer, closing the JSON array.
*/
- public static JsonLayout createDefaultLayout() {
- return new JsonLayout(new DefaultConfiguration(), false, false, false, false, false, false,
- DEFAULT_HEADER, DEFAULT_FOOTER, StandardCharsets.UTF_8, true, false, false, null, false);
+ @Override
+ public byte[] getFooter() {
+ if (!this.complete) {
+ return null;
+ }
+ final StringBuilder buf = new StringBuilder();
+ buf.append(this.eol);
+ final String str = serializeToString(getFooterSerializer());
+ if (str != null) {
+ buf.append(str);
+ }
+ buf.append(this.eol);
+ return getBytes(buf.toString());
+ }
+
+ /**
+ * Returns appropriate JSON header.
+ *
+ * @return a byte array containing the header, opening the JSON array.
+ */
+ @Override
+ public byte[] getHeader() {
+ if (!this.complete) {
+ return null;
+ }
+ final StringBuilder buf = new StringBuilder();
+ final String str = serializeToString(getHeaderSerializer());
+ if (str != null) {
+ buf.append(str);
+ }
+ buf.append(this.eol);
+ return getBytes(buf.toString());
}
@Override
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/parser/JsonLogEventParser.java b/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/parser/JsonLogEventParser.java
similarity index 78%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/parser/JsonLogEventParser.java
rename to log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/parser/JsonLogEventParser.java
index 084ca4c09bb..28279d18433 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/parser/JsonLogEventParser.java
+++ b/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/parser/JsonLogEventParser.java
@@ -14,13 +14,14 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.parser;
+package org.apache.logging.log4j.jackson.json.parser;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.jackson.Log4jJsonObjectMapper;
+import org.apache.logging.log4j.core.parser.AbstractJacksonLogEventParser;
+import org.apache.logging.log4j.jackson.json.Log4jJsonObjectMapper;
/**
- * Parses the output from JsonLayout layout into instances of {@link LogEvent}.
+ * Parses the output from XmlLayout layout into instances of {@link LogEvent}.
*/
public class JsonLogEventParser extends AbstractJacksonLogEventParser {
diff --git a/log4j-layout-jackson-json/src/site/manual/index.md b/log4j-layout-jackson-json/src/site/manual/index.md
new file mode 100644
index 00000000000..6cadb785073
--- /dev/null
+++ b/log4j-layout-jackson-json/src/site/manual/index.md
@@ -0,0 +1,33 @@
+
+
+
+# Apache Log4j Layout for Jackson JSON module
+
+As of Log4j 3.0.0, the layout based on Jackson JSON has moved from the existing module logj-core to the new modules log4j-layout-jackson-json.
+
+## Requirements
+
+This module was introduced in Log4j 2.11.0 and requires Jackson.
+
+Some features may require optional
+[dependencies](../runtime-dependencies.html). These dependencies are specified in the
+documentation for those features.
+
+Some Log4j features require external dependencies.
+See the [Dependency Tree](dependencies.html#Dependency_Tree)
+for the exact list of JAR files needed for these features.
diff --git a/log4j-layout-jackson-json/src/site/site.xml b/log4j-layout-jackson-json/src/site/site.xml
new file mode 100644
index 00000000000..6d4cddc0b14
--- /dev/null
+++ b/log4j-layout-jackson-json/src/site/site.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/jackson/JacksonIssue429MyNamesTest.java b/log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/JacksonIssue429MyNamesTest.java
similarity index 99%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/jackson/JacksonIssue429MyNamesTest.java
rename to log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/JacksonIssue429MyNamesTest.java
index 63c79198f9c..acc15c2ece4 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/jackson/JacksonIssue429MyNamesTest.java
+++ b/log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/JacksonIssue429MyNamesTest.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.jackson.json;
import java.io.IOException;
@@ -22,6 +22,7 @@
import org.apache.logging.log4j.util.Strings;
import org.junit.Assert;
import org.junit.Test;
+import org.junit.experimental.categories.Category;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonParser;
@@ -33,7 +34,6 @@
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer;
import com.fasterxml.jackson.databind.module.SimpleModule;
-import org.junit.experimental.categories.Category;
@Category(Layouts.Json.class)
public class JacksonIssue429MyNamesTest {
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/jackson/JacksonIssue429Test.java b/log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/JacksonIssue429Test.java
similarity index 98%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/jackson/JacksonIssue429Test.java
rename to log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/JacksonIssue429Test.java
index 6cbccc68fef..93d1d53c2af 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/jackson/JacksonIssue429Test.java
+++ b/log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/JacksonIssue429Test.java
@@ -14,13 +14,14 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.jackson.json;
import java.io.IOException;
import org.apache.logging.log4j.categories.Layouts;
import org.junit.Assert;
import org.junit.Test;
+import org.junit.experimental.categories.Category;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonParser;
@@ -30,7 +31,6 @@
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import com.fasterxml.jackson.databind.module.SimpleModule;
-import org.junit.experimental.categories.Category;
@Category(Layouts.Json.class)
public class JacksonIssue429Test {
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/jackson/LevelMixInJsonTest.java b/log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/LevelMixInJsonTest.java
similarity index 91%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/jackson/LevelMixInJsonTest.java
rename to log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/LevelMixInJsonTest.java
index 14b015bec74..7f75148e2aa 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/jackson/LevelMixInJsonTest.java
+++ b/log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/LevelMixInJsonTest.java
@@ -15,12 +15,14 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.jackson.json;
-import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.logging.log4j.categories.Layouts;
+import org.apache.logging.log4j.jackson.LevelMixInTest;
import org.junit.experimental.categories.Category;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
@Category(Layouts.Json.class)
public class LevelMixInJsonTest extends LevelMixInTest {
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/MarkerMixInJsonTest.java b/log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/MarkerMixInJsonTest.java
similarity index 85%
rename from log4j-core/src/test/java/org/apache/logging/log4j/MarkerMixInJsonTest.java
rename to log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/MarkerMixInJsonTest.java
index 8777696585d..db9588b4a20 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/MarkerMixInJsonTest.java
+++ b/log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/MarkerMixInJsonTest.java
@@ -15,15 +15,16 @@
* limitations under the license.
*/
-package org.apache.logging.log4j;
+package org.apache.logging.log4j.jackson.json;
-import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.logging.log4j.categories.Layouts;
-import org.apache.logging.log4j.core.jackson.Log4jJsonObjectMapper;
+import org.apache.logging.log4j.jackson.AbstractMarkerMixInTest;
import org.junit.experimental.categories.Category;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
@Category(Layouts.Json.class)
-public class MarkerMixInJsonTest extends MarkerMixInTest {
+public class MarkerMixInJsonTest extends AbstractMarkerMixInTest {
@Override
protected ObjectMapper newObjectMapper() {
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/jackson/StackTraceElementMixInTest.java b/log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/StackTraceElementJsonMixInTest.java
similarity index 91%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/jackson/StackTraceElementMixInTest.java
rename to log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/StackTraceElementJsonMixInTest.java
index f14a26eec0f..fc0b4599abe 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/jackson/StackTraceElementMixInTest.java
+++ b/log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/StackTraceElementJsonMixInTest.java
@@ -14,32 +14,27 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.jackson.json;
import java.io.IOException;
import org.apache.logging.log4j.categories.Layouts;
+import org.apache.logging.log4j.jackson.Log4jStackTraceElementDeserializer;
import org.junit.Assert;
import org.junit.Test;
+import org.junit.experimental.categories.Category;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
-import org.junit.experimental.categories.Category;
@Category(Layouts.Json.class)
-public class StackTraceElementMixInTest {
-
- @Test
- public void testLog4jJsonObjectMapper() throws Exception {
- this.roundtrip(new Log4jJsonObjectMapper());
- }
+public class StackTraceElementJsonMixInTest {
- @Test
- public void testLog4jYamlObjectMapper() throws Exception {
- this.roundtrip(new Log4jYamlObjectMapper());
+ protected String aposToQuotes(final String json) {
+ return json.replace("'", "\"");
}
/**
@@ -57,18 +52,10 @@ private void roundtrip(final ObjectMapper mapper) throws JsonProcessingException
}
@Test
- public void testLog4jXmlObjectMapper() throws Exception {
- this.roundtrip(new Log4jXmlObjectMapper());
- }
-
- protected String aposToQuotes(final String json) {
- return json.replace("'", "\"");
- }
-
- @Test
- public void testFromJsonWithSimpleModule() throws Exception {
+ public void testFromJsonWithLog4jModule() throws Exception {
final ObjectMapper mapper = new ObjectMapper();
- final SimpleModule module = new SimpleModule();
+ final boolean encodeThreadContextAsList = false;
+ final SimpleModule module = new Log4jJsonModule(encodeThreadContextAsList, true, false, false);
module.addDeserializer(StackTraceElement.class, new Log4jStackTraceElementDeserializer());
mapper.registerModule(module);
final StackTraceElement expected = new StackTraceElement("package.SomeClass", "someMethod", "SomeClass.java", 123);
@@ -78,10 +65,9 @@ public void testFromJsonWithSimpleModule() throws Exception {
}
@Test
- public void testFromJsonWithLog4jModule() throws Exception {
+ public void testFromJsonWithSimpleModule() throws Exception {
final ObjectMapper mapper = new ObjectMapper();
- final boolean encodeThreadContextAsList = false;
- final SimpleModule module = new Log4jJsonModule(encodeThreadContextAsList, true, false, false);
+ final SimpleModule module = new SimpleModule();
module.addDeserializer(StackTraceElement.class, new Log4jStackTraceElementDeserializer());
mapper.registerModule(module);
final StackTraceElement expected = new StackTraceElement("package.SomeClass", "someMethod", "SomeClass.java", 123);
@@ -89,4 +75,9 @@ public void testFromJsonWithLog4jModule() throws Exception {
final StackTraceElement actual = mapper.readValue(s, StackTraceElement.class);
Assert.assertEquals(expected, actual);
}
+
+ @Test
+ public void testLog4jJsonObjectMapper() throws Exception {
+ this.roundtrip(new Log4jJsonObjectMapper());
+ }
}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/ConcurrentLoggingWithJsonLayoutTest.java b/log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/layout/ConcurrentLoggingWithJsonLayoutTest.java
similarity index 95%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/layout/ConcurrentLoggingWithJsonLayoutTest.java
rename to log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/layout/ConcurrentLoggingWithJsonLayoutTest.java
index 0e4ad52ecc4..5d6f02d27f9 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/ConcurrentLoggingWithJsonLayoutTest.java
+++ b/log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/layout/ConcurrentLoggingWithJsonLayoutTest.java
@@ -14,7 +14,11 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.layout;
+package org.apache.logging.log4j.jackson.json.layout;
+
+import static org.hamcrest.CoreMatchers.endsWith;
+import static org.hamcrest.CoreMatchers.startsWith;
+import static org.junit.Assert.assertThat;
import java.io.File;
import java.nio.charset.Charset;
@@ -31,18 +35,38 @@
import org.junit.ClassRule;
import org.junit.Test;
-import static org.hamcrest.CoreMatchers.*;
-
-import static org.junit.Assert.*;
-
/**
* Test for LOG4J2-1769.
*
* @since 2.8
*/
public class ConcurrentLoggingWithJsonLayoutTest {
+
+ private class LoggingThread extends Thread {
+ private final Set threads;
+ private final Logger log;
+
+ LoggingThread(final Set threads, final Logger log) {
+ this.threads = threads;
+ this.log = log;
+ }
+
+ @Override
+ public void run() {
+ log.info(threads.size());
+ try {
+ for (int i = 0; i < 64; i++) {
+ log.info("First message.");
+ log.info("Second message.");
+ }
+ } finally {
+ threads.remove(this);
+ }
+ }
+ }
@ClassRule
public static LoggerContextRule context = new LoggerContextRule("log4j2-json-layout.xml");
+
private static final String PATH = "target/test-json-layout.log";
@AfterClass
@@ -90,27 +114,4 @@ public void uncaughtException(final Thread t, final Throwable e) {
}
}
}
-
- private class LoggingThread extends Thread {
- private final Set threads;
- private final Logger log;
-
- LoggingThread(final Set threads, final Logger log) {
- this.threads = threads;
- this.log = log;
- }
-
- @Override
- public void run() {
- log.info(threads.size());
- try {
- for (int i = 0; i < 64; i++) {
- log.info("First message.");
- log.info("Second message.");
- }
- } finally {
- threads.remove(this);
- }
- }
- }
}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/JsonLayoutTest.java b/log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/layout/JsonLayoutTest.java
similarity index 96%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/layout/JsonLayoutTest.java
rename to log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/layout/JsonLayoutTest.java
index dba5cf36b77..f8afb51c674 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/JsonLayoutTest.java
+++ b/log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/layout/JsonLayoutTest.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.layout;
+package org.apache.logging.log4j.jackson.json.layout;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -36,9 +36,11 @@
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.impl.Log4jLogEvent;
-import org.apache.logging.log4j.core.jackson.Log4jJsonObjectMapper;
+import org.apache.logging.log4j.core.layout.LogEventFixtures;
import org.apache.logging.log4j.core.lookup.JavaLookup;
import org.apache.logging.log4j.core.util.KeyValuePair;
+import org.apache.logging.log4j.jackson.AbstractJacksonLayout;
+import org.apache.logging.log4j.jackson.json.Log4jJsonObjectMapper;
import org.apache.logging.log4j.message.ObjectMessage;
import org.apache.logging.log4j.message.SimpleMessage;
import org.apache.logging.log4j.spi.AbstractLogger;
@@ -55,6 +57,18 @@
*/
@Category(Layouts.Json.class)
public class JsonLayoutTest {
+ private static class TestClass {
+ private int value;
+
+ public int getValue() {
+ return value;
+ }
+
+ public void setValue(final int value) {
+ this.value = value;
+ }
+ }
+
static ConfigurationFactory cf = new BasicConfigurationFactory();
private static final String DQUOTE = "\"";
@@ -123,6 +137,58 @@ private void checkPropertyNameAbsent(final String name, final boolean compact, f
assertFalse(str, str.contains(DQUOTE + name + DQUOTE + propSep));
}
+ private String prepareJsonForObjectMessageAsJsonObjectTests(final int value, final boolean objectMessageAsJsonObject) {
+ final TestClass testClass = new TestClass();
+ testClass.setValue(value);
+ // @formatter:off
+ final Log4jLogEvent expected = Log4jLogEvent.newBuilder()
+ .setLoggerName("a.B")
+ .setLoggerFqcn("f.q.c.n")
+ .setLevel(Level.DEBUG)
+ .setMessage(new ObjectMessage(testClass))
+ .setThreadName("threadName")
+ .setTimeMillis(1).build();
+ // @formatter:off
+ final AbstractJacksonLayout layout = JsonLayout.newBuilder()
+ .setCompact(true)
+ .setObjectMessageAsJsonObject(objectMessageAsJsonObject)
+ .build();
+ // @formatter:off
+ return layout.toSerializable(expected);
+ }
+
+ 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);
+ }
+
+ @Test
+ public void testAdditionalFields() throws Exception {
+ final AbstractJacksonLayout layout = JsonLayout.newBuilder()
+ .setLocationInfo(false)
+ .setProperties(false)
+ .setComplete(false)
+ .setCompact(true)
+ .setEventEol(false)
+ .setIncludeStacktrace(false)
+ .setAdditionalFields(new KeyValuePair[] {
+ new KeyValuePair("KEY1", "VALUE1"),
+ new KeyValuePair("KEY2", "${java:runtime}"), })
+ .setCharset(StandardCharsets.UTF_8)
+ .setConfiguration(ctx.getConfiguration())
+ .build();
+ final String str = layout.toSerializable(LogEventFixtures.createLogEvent());
+ assertTrue(str, str.contains("\"KEY1\":\"VALUE1\""));
+ assertTrue(str, str.contains("\"KEY2\":\"" + new JavaLookup().getRuntime() + "\""));
+ }
+
private void testAllFeatures(final boolean locationInfo, final boolean compact, final boolean eventEol,
final boolean includeContext, final boolean contextMapAslist, final boolean includeStacktrace)
throws Exception {
@@ -254,6 +320,31 @@ public void testEscapeLayout() throws Exception {
}
}
+ @Test
+ public void testExcludeStacktrace() throws Exception {
+ this.testAllFeatures(false, false, false, false, false, false);
+ }
+
+ @Test
+ public void testIncludeNullDelimiterFalse() throws Exception {
+ final AbstractJacksonLayout layout = JsonLayout.newBuilder()
+ .setCompact(true)
+ .setIncludeNullDelimiter(false)
+ .build();
+ final String str = layout.toSerializable(LogEventFixtures.createLogEvent());
+ assertFalse(str.endsWith("\0"));
+ }
+
+ @Test
+ public void testIncludeNullDelimiterTrue() throws Exception {
+ final AbstractJacksonLayout layout = JsonLayout.newBuilder()
+ .setCompact(true)
+ .setIncludeNullDelimiter(true)
+ .build();
+ final String str = layout.toSerializable(LogEventFixtures.createLogEvent());
+ assertTrue(str.endsWith("\0"));
+ }
+
/**
* Test case for MDC conversion pattern.
*/
@@ -348,36 +439,11 @@ public void testLayoutLoggerName() throws Exception {
assertEquals(expected, actual);
}
- @Test
- public void testAdditionalFields() throws Exception {
- final AbstractJacksonLayout layout = JsonLayout.newBuilder()
- .setLocationInfo(false)
- .setProperties(false)
- .setComplete(false)
- .setCompact(true)
- .setEventEol(false)
- .setIncludeStacktrace(false)
- .setAdditionalFields(new KeyValuePair[] {
- new KeyValuePair("KEY1", "VALUE1"),
- new KeyValuePair("KEY2", "${java:runtime}"), })
- .setCharset(StandardCharsets.UTF_8)
- .setConfiguration(ctx.getConfiguration())
- .build();
- final String str = layout.toSerializable(LogEventFixtures.createLogEvent());
- assertTrue(str, str.contains("\"KEY1\":\"VALUE1\""));
- assertTrue(str, str.contains("\"KEY2\":\"" + new JavaLookup().getRuntime() + "\""));
- }
-
@Test
public void testLocationOffCompactOffMdcOff() throws Exception {
this.testAllFeatures(false, false, false, false, false, true);
}
- @Test
- public void testLocationOnCompactOnMdcOn() throws Exception {
- this.testAllFeatures(true, true, false, true, false, true);
- }
-
@Test
public void testLocationOnCompactOnEventEolOnMdcOn() throws Exception {
this.testAllFeatures(true, true, true, true, false, true);
@@ -389,99 +455,35 @@ public void testLocationOnCompactOnEventEolOnMdcOnMdcAsList() throws Exception {
}
@Test
- public void testExcludeStacktrace() throws Exception {
- this.testAllFeatures(false, false, false, false, false, false);
- }
-
- @Test
- public void testStacktraceAsString() throws Exception {
- final String str = prepareJSONForStacktraceTests(true);
- assertTrue(str, str.contains("\"extendedStackTrace\":\"java.lang.NullPointerException"));
+ public void testLocationOnCompactOnMdcOn() throws Exception {
+ this.testAllFeatures(true, true, false, true, false, true);
}
@Test
- public void testStacktraceAsNonString() throws Exception {
- final String str = prepareJSONForStacktraceTests(false);
- assertTrue(str, str.contains("\"extendedStackTrace\":["));
+ public void testObjectMessageAsJsonObject() {
+ final String str = prepareJsonForObjectMessageAsJsonObjectTests(1234, true);
+ assertTrue(str, str.contains("\"message\":{\"value\":1234}"));
}
- 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);
- }
-
@Test
public void testObjectMessageAsJsonString() {
- final String str = prepareJSONForObjectMessageAsJsonObjectTests(1234, false);
+ final String str = prepareJsonForObjectMessageAsJsonObjectTests(1234, false);
assertTrue(str, str.contains("\"message\":\"" + this.getClass().getCanonicalName() + "$TestClass@"));
}
-
- @Test
- public void testObjectMessageAsJsonObject() {
- final String str = prepareJSONForObjectMessageAsJsonObjectTests(1234, true);
- assertTrue(str, str.contains("\"message\":{\"value\":1234}"));
- }
-
- private String prepareJSONForObjectMessageAsJsonObjectTests(final int value, final boolean objectMessageAsJsonObject) {
- final TestClass testClass = new TestClass();
- testClass.setValue(value);
- // @formatter:off
- final Log4jLogEvent expected = Log4jLogEvent.newBuilder()
- .setLoggerName("a.B")
- .setLoggerFqcn("f.q.c.n")
- .setLevel(Level.DEBUG)
- .setMessage(new ObjectMessage(testClass))
- .setThreadName("threadName")
- .setTimeMillis(1).build();
- // @formatter:off
- final AbstractJacksonLayout layout = JsonLayout.newBuilder()
- .setCompact(true)
- .setObjectMessageAsJsonObject(objectMessageAsJsonObject)
- .build();
- // @formatter:off
- return layout.toSerializable(expected);
- }
@Test
- public void testIncludeNullDelimiterTrue() throws Exception {
- final AbstractJacksonLayout layout = JsonLayout.newBuilder()
- .setCompact(true)
- .setIncludeNullDelimiter(true)
- .build();
- final String str = layout.toSerializable(LogEventFixtures.createLogEvent());
- assertTrue(str.endsWith("\0"));
+ public void testStacktraceAsNonString() throws Exception {
+ final String str = prepareJsonForStacktraceTests(false);
+ assertTrue(str, str.contains("\"extendedStackTrace\":["));
}
@Test
- public void testIncludeNullDelimiterFalse() throws Exception {
- final AbstractJacksonLayout layout = JsonLayout.newBuilder()
- .setCompact(true)
- .setIncludeNullDelimiter(false)
- .build();
- final String str = layout.toSerializable(LogEventFixtures.createLogEvent());
- assertFalse(str.endsWith("\0"));
+ public void testStacktraceAsString() throws Exception {
+ final String str = prepareJsonForStacktraceTests(true);
+ assertTrue(str, str.contains("\"extendedStackTrace\":\"java.lang.NullPointerException"));
}
-
- private String toPropertySeparator(final boolean compact) {
+
+ private String toPropertySeparator(final boolean compact) {
return compact ? ":" : " : ";
}
-
- private static class TestClass {
- private int value;
-
- public int getValue() {
- return value;
- }
-
- public void setValue(int value) {
- this.value = value;
- }
- }
}
diff --git a/log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/layout/ThrowableProxyJsonTest.java b/log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/layout/ThrowableProxyJsonTest.java
new file mode 100644
index 00000000000..c5b03551347
--- /dev/null
+++ b/log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/layout/ThrowableProxyJsonTest.java
@@ -0,0 +1,33 @@
+/*
+ * 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 java.io.IOException;
+
+import org.apache.logging.log4j.jackson.ThrowableProxyJacksonTest;
+import org.apache.logging.log4j.jackson.json.Log4jJsonObjectMapper;
+import org.junit.Test;
+
+public class ThrowableProxyJsonTest extends ThrowableProxyJacksonTest {
+
+ @Test
+ public void testIoContainerAsJson() throws IOException {
+ testIoContainer(new Log4jJsonObjectMapper());
+ }
+
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/parser/JsonLogEventParserTest.java b/log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/parser/JsonLogEventParserTest.java
similarity index 94%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/parser/JsonLogEventParserTest.java
rename to log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/parser/JsonLogEventParserTest.java
index 9683d636f95..a6b3cc771a5 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/parser/JsonLogEventParserTest.java
+++ b/log4j-layout-jackson-json/src/test/java/org/apache/logging/log4j/jackson/json/parser/JsonLogEventParserTest.java
@@ -14,17 +14,17 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.parser;
+package org.apache.logging.log4j.jackson.json.parser;
+
+import java.nio.charset.StandardCharsets;
import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.parser.AbstractLogEventParserTest;
+import org.apache.logging.log4j.core.parser.ParseException;
import org.junit.Before;
import org.junit.Test;
-import java.nio.charset.StandardCharsets;
-
-public class JsonLogEventParserTest extends LogEventParserTest {
-
- private JsonLogEventParser parser;
+public class JsonLogEventParserTest extends AbstractLogEventParserTest {
private static final String JSON = "{\n" +
" \"timeMillis\" : 1493121664118,\n" +
@@ -73,11 +73,31 @@ public class JsonLogEventParserTest extends LogEventParserTest {
" }\n" +
"}";
+ private JsonLogEventParser parser;
+
@Before
public void setup() {
parser = new JsonLogEventParser();
}
+ @Test
+ public void testByteArray() throws ParseException {
+ final LogEvent logEvent = parser.parseFrom(JSON.getBytes(StandardCharsets.UTF_8));
+ assertLogEvent(logEvent);
+ }
+
+ @Test
+ public void testByteArrayOffsetLength() throws ParseException {
+ final byte[] bytes = ("abc" + JSON + "def").getBytes(StandardCharsets.UTF_8);
+ final LogEvent logEvent = parser.parseFrom(bytes, 3, bytes.length - 6);
+ assertLogEvent(logEvent);
+ }
+
+ @Test
+ public void testEmptyObject() throws ParseException {
+ parser.parseFrom("{}");
+ }
+
@Test
public void testString() throws ParseException {
final LogEvent logEvent = parser.parseFrom(JSON);
@@ -89,6 +109,11 @@ public void testStringEmpty() throws ParseException {
parser.parseFrom("");
}
+ @Test
+ public void testStringIgnoreInvalidProperty() throws ParseException {
+ parser.parseFrom("{\"foo\":\"bar\"}");
+ }
+
@Test(expected = ParseException.class)
public void testStringInvalidJson() throws ParseException {
parser.parseFrom("foobar");
@@ -99,32 +124,9 @@ public void testStringJsonArray() throws ParseException {
parser.parseFrom("[]");
}
- @Test
- public void testEmptyObject() throws ParseException {
- parser.parseFrom("{}");
- }
-
@Test(expected = ParseException.class)
public void testStringWrongPropertyType() throws ParseException {
parser.parseFrom("{\"threadId\":\"foobar\"}");
}
- @Test
- public void testStringIgnoreInvalidProperty() throws ParseException {
- parser.parseFrom("{\"foo\":\"bar\"}");
- }
-
- @Test
- public void testByteArray() throws ParseException {
- final LogEvent logEvent = parser.parseFrom(JSON.getBytes(StandardCharsets.UTF_8));
- assertLogEvent(logEvent);
- }
-
- @Test
- public void testByteArrayOffsetLength() throws ParseException {
- final byte[] bytes = ("abc" + JSON + "def").getBytes(StandardCharsets.UTF_8);
- final LogEvent logEvent = parser.parseFrom(bytes, 3, bytes.length - 6);
- assertLogEvent(logEvent);
- }
-
}
diff --git a/log4j-layout-jackson-json/src/test/resources/log4j2-json-layout.xml b/log4j-layout-jackson-json/src/test/resources/log4j2-json-layout.xml
new file mode 100644
index 00000000000..c7af4e9561c
--- /dev/null
+++ b/log4j-layout-jackson-json/src/test/resources/log4j2-json-layout.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/Log4jXmlModule.java b/log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/Log4jXmlModule.java
similarity index 84%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/Log4jXmlModule.java
rename to log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/Log4jXmlModule.java
index 34f0f6870e6..0980f9435d1 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/Log4jXmlModule.java
+++ b/log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/Log4jXmlModule.java
@@ -14,10 +14,9 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.jackson.xml;
-import org.apache.logging.log4j.core.jackson.Initializers.SetupContextInitializer;
-import org.apache.logging.log4j.core.jackson.Initializers.SimpleModuleInitializer;
+import org.apache.logging.log4j.core.jackson.SimpleModuleInitializer;
import com.fasterxml.jackson.dataformat.xml.JacksonXmlModule;
@@ -45,6 +44,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, stacktraceAsString);
+ new XmlSetupContextInitializer().setupModule(context, includeStacktrace, stacktraceAsString);
}
}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/Log4jXmlObjectMapper.java b/log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/Log4jXmlObjectMapper.java
similarity index 97%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/Log4jXmlObjectMapper.java
rename to log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/Log4jXmlObjectMapper.java
index b390a3f279d..632b83fe4cf 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/Log4jXmlObjectMapper.java
+++ b/log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/Log4jXmlObjectMapper.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.jackson.xml;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
diff --git a/log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/XmlInstantMixIn.java b/log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/XmlInstantMixIn.java
new file mode 100644
index 00000000000..0e18154709c
--- /dev/null
+++ b/log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/XmlInstantMixIn.java
@@ -0,0 +1,56 @@
+/*
+ * 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.xml;
+
+import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.core.jackson.InstantMixIn;
+import org.apache.logging.log4j.core.time.Instant;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+
+/**
+ * Jackson mix-in for {@link Instant}.
+ *
+ * Consider this class private.
+ *
+ *
+ * @see Marker
+ */
+abstract class XmlInstantMixIn extends InstantMixIn {
+
+ @JsonCreator
+ protected XmlInstantMixIn(
+ // @formatter:off
+ @JsonProperty(ATTR_EPOCH_SECOND) final long epochSecond,
+ @JsonProperty(ATTR_NANO_OF_SECOND) final int nanoOfSecond)
+ // @formatter:on
+ {
+ super(epochSecond, nanoOfSecond);
+ }
+
+ @Override
+ @JacksonXmlProperty(localName = ATTR_EPOCH_SECOND, isAttribute = true)
+ protected abstract long getEpochSecond();
+
+ @Override
+ @JacksonXmlProperty(localName = ATTR_NANO_OF_SECOND, isAttribute = true)
+ protected abstract int getNanoOfSecond();
+
+}
diff --git a/log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/XmlLogEventWithContextListMixIn.java b/log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/XmlLogEventWithContextListMixIn.java
new file mode 100644
index 00000000000..771f955ec2b
--- /dev/null
+++ b/log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/XmlLogEventWithContextListMixIn.java
@@ -0,0 +1,50 @@
+/*
+ * 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.xml;
+
+import org.apache.logging.log4j.core.jackson.AbstractXmlLogEventMixIn;
+import org.apache.logging.log4j.core.jackson.ContextDataAsEntryListDeserializer;
+import org.apache.logging.log4j.core.jackson.ContextDataAsEntryListSerializer;
+import org.apache.logging.log4j.core.jackson.XmlConstants;
+import org.apache.logging.log4j.util.ReadOnlyStringMap;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+
+/**
+ *
+ */
+public abstract class XmlLogEventWithContextListMixIn extends AbstractXmlLogEventMixIn {
+
+ private static final long serialVersionUID = 1L;
+
+ @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_CONTEXT_MAP)
+ @JsonSerialize(using = ContextDataAsEntryListSerializer.class)
+ @JsonDeserialize(using = ContextDataAsEntryListDeserializer.class)
+ @Override
+ public abstract ReadOnlyStringMap getContextData();
+
+}
diff --git a/log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/XmlMarkerMixIn.java b/log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/XmlMarkerMixIn.java
new file mode 100644
index 00000000000..9fa0e8a56ec
--- /dev/null
+++ b/log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/XmlMarkerMixIn.java
@@ -0,0 +1,79 @@
+/*
+ * 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.xml;
+
+import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.core.jackson.MarkerMixIn;
+import org.apache.logging.log4j.core.jackson.XmlConstants;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+
+/**
+ * Jackson mix-in for {@link Marker}.
+ *
+ * If we want to deal with more than one {@link Marker} implementation then recode these annotations to include
+ * metadata.
+ *
+ *
+ * @see Marker
+ */
+// Alternate for multiple Marker implementation.
+// @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
+@JsonDeserialize(as = org.apache.logging.log4j.MarkerManager.Log4jMarker.class)
+abstract class XmlMarkerMixIn extends MarkerMixIn {
+ public static final String ATTR_NAME = "name";
+ private static final long serialVersionUID = 1L;
+
+ @JsonCreator
+ protected XmlMarkerMixIn(@JsonProperty(ATTR_NAME) final String name) {
+ super(name);
+ }
+
+ @Override
+ @JacksonXmlProperty(isAttribute = true)
+ public abstract String getName();
+
+ @Override
+ @JacksonXmlElementWrapper(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_PARENTS)
+ @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_MARKER)
+ public abstract Marker[] getParents();
+
+}
diff --git a/log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/XmlSetupContextInitializer.java b/log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/XmlSetupContextInitializer.java
new file mode 100644
index 00000000000..442f9abad02
--- /dev/null
+++ b/log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/XmlSetupContextInitializer.java
@@ -0,0 +1,42 @@
+package org.apache.logging.log4j.jackson.xml;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.impl.ExtendedStackTraceElement;
+import org.apache.logging.log4j.core.impl.ThrowableProxy;
+import org.apache.logging.log4j.core.jackson.ExtendedStackTraceElementMixIn;
+import org.apache.logging.log4j.core.jackson.LevelMixIn;
+import org.apache.logging.log4j.core.jackson.ThrowableProxyMixIn;
+import org.apache.logging.log4j.core.jackson.ThrowableProxyWithStacktraceAsStringMixIn;
+import org.apache.logging.log4j.core.jackson.ThrowableProxyWithoutStacktraceMixIn;
+import org.apache.logging.log4j.core.time.Instant;
+
+import com.fasterxml.jackson.databind.Module.SetupContext;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+
+/**
+ * Used to set up {@link SetupContext} from different {@link SimpleModule}s.
+ *
+ * Consider this class private.
+ *
+ */
+class XmlSetupContextInitializer {
+
+ public void setupModule(final SetupContext context, final boolean includeStacktrace,
+ final boolean stacktraceAsString) {
+ // JRE classes: we cannot edit those with Jackson annotations
+ context.setMixInAnnotations(StackTraceElement.class, XmlStackTraceElementMixIn.class);
+ // Log4j API classes: we do not want to edit those with Jackson annotations because the API module should not
+ // depend on Jackson.
+ context.setMixInAnnotations(Marker.class, XmlMarkerMixIn.class);
+ context.setMixInAnnotations(Level.class, LevelMixIn.class);
+ context.setMixInAnnotations(Instant.class, XmlInstantMixIn.class);
+ context.setMixInAnnotations(LogEvent.class, XmlLogEventWithContextListMixIn.class);
+ // 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
+ ? (stacktraceAsString ? ThrowableProxyWithStacktraceAsStringMixIn.class : ThrowableProxyMixIn.class)
+ : ThrowableProxyWithoutStacktraceMixIn.class);
+ }
+}
\ No newline at end of file
diff --git a/log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/XmlStackTraceElementMixIn.java b/log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/XmlStackTraceElementMixIn.java
new file mode 100644
index 00000000000..abdba98a8de
--- /dev/null
+++ b/log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/XmlStackTraceElementMixIn.java
@@ -0,0 +1,39 @@
+package org.apache.logging.log4j.jackson.xml;
+
+import org.apache.logging.log4j.core.jackson.StackTraceElementMixIn;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+
+abstract class XmlStackTraceElementMixIn extends StackTraceElementMixIn {
+
+ @JsonCreator
+ protected XmlStackTraceElementMixIn(
+ // @formatter:off
+ @JsonProperty(ATTR_CLASS) final String declaringClass,
+ @JsonProperty(ATTR_METHOD) final String methodName,
+ @JsonProperty(ATTR_FILE) final String fileName,
+ @JsonProperty(ATTR_LINE) final int lineNumber)
+ // @formatter:on
+ {
+ super(declaringClass, methodName, fileName, lineNumber);
+ }
+
+ @Override
+ @JacksonXmlProperty(localName = ATTR_CLASS, isAttribute = true)
+ protected abstract String getClassName();
+
+ @Override
+ @JacksonXmlProperty(localName = ATTR_FILE, isAttribute = true)
+ protected abstract String getFileName();
+
+ @Override
+ @JacksonXmlProperty(localName = ATTR_LINE, isAttribute = true)
+ protected abstract int getLineNumber();
+
+ @Override
+ @JacksonXmlProperty(localName = ATTR_METHOD, isAttribute = true)
+ protected abstract String getMethodName();
+
+}
diff --git a/log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/layout/Log4jXmlPrettyPrinter.java b/log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/layout/Log4jXmlPrettyPrinter.java
new file mode 100644
index 00000000000..24c5ef01c8f
--- /dev/null
+++ b/log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/layout/Log4jXmlPrettyPrinter.java
@@ -0,0 +1,41 @@
+package org.apache.logging.log4j.jackson.xml.layout;
+
+import javax.xml.stream.XMLStreamException;
+
+import org.codehaus.stax2.XMLStreamWriter2;
+
+import com.fasterxml.jackson.dataformat.xml.util.DefaultXmlPrettyPrinter;
+
+/**
+ * When <Event>s are written into a XML file; the "Event" object is not the root element, but an element named
+ * <Events> created using {@link XmlLayout#getHeader()} and {@link XmlLayout#getFooter()} methods.
+ *
+ * {@link com.fasterxml.jackson.dataformat.xml.util.DefaultXmlPrettyPrinter} is used to print the Event object into
+ * XML; hence it assumes <Event> tag as the root element, so it prints the <Event> tag without any
+ * indentation. To add an indentation to the <Event> tag; hence an additional indentation for any
+ * sub-elements, this class is written. As an additional task, to avoid the blank line printed after the ending
+ * </Event> tag, {@link #writePrologLinefeed(XMLStreamWriter2)} method is also overridden.
+ *
+ */
+class Log4jXmlPrettyPrinter extends DefaultXmlPrettyPrinter {
+
+ private static final long serialVersionUID = 1L;
+
+ Log4jXmlPrettyPrinter(final int nesting) {
+ _nesting = nesting;
+ }
+
+ /**
+ * Sets the nesting level to 1 rather than 0, so the "Event" tag will get indentation of next level below root.
+ */
+ @Override
+ public DefaultXmlPrettyPrinter createInstance() {
+ return new Log4jXmlPrettyPrinter(XmlJacksonFactory.DEFAULT_INDENT);
+ }
+
+ @Override
+ public void writePrologLinefeed(final XMLStreamWriter2 sw) throws XMLStreamException {
+ // nothing
+ }
+
+}
\ No newline at end of file
diff --git a/log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/layout/XmlJacksonFactory.java b/log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/layout/XmlJacksonFactory.java
new file mode 100644
index 00000000000..0289c7173cf
--- /dev/null
+++ b/log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/layout/XmlJacksonFactory.java
@@ -0,0 +1,54 @@
+package org.apache.logging.log4j.jackson.xml.layout;
+
+import org.apache.logging.log4j.core.jackson.AbstractJacksonFactory;
+import org.apache.logging.log4j.core.jackson.JsonConstants;
+import org.apache.logging.log4j.core.jackson.XmlConstants;
+import org.apache.logging.log4j.jackson.xml.Log4jXmlObjectMapper;
+
+import com.fasterxml.jackson.core.PrettyPrinter;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+class XmlJacksonFactory extends AbstractJacksonFactory {
+
+ static final int DEFAULT_INDENT = 1;
+
+ public XmlJacksonFactory(final boolean includeStacktrace, final boolean stacktraceAsString) {
+ super(includeStacktrace, stacktraceAsString);
+ }
+
+ @Override
+ protected String getPropertyNameForContextMap() {
+ return XmlConstants.ELT_CONTEXT_MAP;
+ }
+
+ @Override
+ protected String getPropertyNameForNanoTime() {
+ return JsonConstants.ELT_NANO_TIME;
+ }
+
+ @Override
+ protected String getPropertyNameForSource() {
+ return XmlConstants.ELT_SOURCE;
+ }
+
+ @Override
+ protected String getPropertyNameForStackTrace() {
+ return XmlConstants.ELT_EXTENDED_STACK_TRACE;
+ }
+
+ @Override
+ protected PrettyPrinter newCompactPrinter() {
+ // Yes, null is the proper answer.
+ return null;
+ }
+
+ @Override
+ protected ObjectMapper newObjectMapper() {
+ return new Log4jXmlObjectMapper(includeStacktrace, stacktraceAsString);
+ }
+
+ @Override
+ protected PrettyPrinter newPrettyPrinter() {
+ return new Log4jXmlPrettyPrinter(DEFAULT_INDENT);
+ }
+}
\ No newline at end of file
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/XmlLayout.java b/log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/layout/XmlLayout.java
similarity index 71%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/layout/XmlLayout.java
rename to log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/layout/XmlLayout.java
index b09add7a59f..c305c33e317 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/XmlLayout.java
+++ b/log4j-layout-jackson-xml/java/org/apache/logging/log4j/jackson/xml/layout/XmlLayout.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.layout;
+package org.apache.logging.log4j.jackson.xml.layout;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
@@ -22,13 +22,17 @@
import java.util.Map;
import org.apache.logging.log4j.core.Layout;
+import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.Node;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.core.jackson.AbstractJacksonLayout;
import org.apache.logging.log4j.core.jackson.XmlConstants;
import org.apache.logging.log4j.core.util.KeyValuePair;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+
/**
* Appends a series of {@code event} elements as defined in the log4j.dtd.
*
@@ -55,17 +59,15 @@
*
Additional Fields
*
* This property allows addition of custom fields into generated JSON.
- * {@code } inserts {@code bar} directly
- * into XML output. Supports Lookup expressions.
+ * {@code } inserts {@code bar} directly into XML
+ * output. Supports Lookup expressions.
*
*/
@Plugin(name = "XmlLayout", category = Node.CATEGORY, elementType = Layout.ELEMENT_TYPE, printObject = true)
public final class XmlLayout extends AbstractJacksonLayout {
- private static final String ROOT_TAG = "Events";
-
public static class Builder> extends AbstractJacksonLayout.Builder
- implements org.apache.logging.log4j.core.util.Builder {
+ implements org.apache.logging.log4j.core.util.Builder {
public Builder() {
super();
@@ -74,70 +76,86 @@ public Builder() {
@Override
public XmlLayout build() {
- return new XmlLayout(getConfiguration(), isLocationInfo(), isProperties(), isComplete(),
- isCompact(), getCharset(), isIncludeStacktrace(), isStacktraceAsString(),
- isIncludeNullDelimiter(), getAdditionalFields());
+ return new XmlLayout(getConfiguration(), isLocationInfo(), isProperties(), isComplete(), isCompact(),
+ getCharset(), isIncludeStacktrace(), isStacktraceAsString(), isIncludeNullDelimiter(),
+ getAdditionalFields());
+ }
+ }
+
+ @JacksonXmlRootElement(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_EVENT)
+ public static class XmlLogEventWithAdditionalFields extends LogEventWithAdditionalFields {
+
+ public XmlLogEventWithAdditionalFields(final Object logEvent, final Map additionalFields) {
+ super(logEvent, additionalFields);
}
+
}
+ private static final String ROOT_TAG = "Events";
+
/**
+ * Creates an XML Layout using the default settings.
+ *
+ * @return an XML Layout.
+ */
+ public static XmlLayout createDefaultLayout() {
+ return new XmlLayout(null, false, false, false, false, StandardCharsets.UTF_8, true, false, false, null);
+ }
+
+ /**
+ * Creates an XML Layout.
+ *
+ * @param locationInfo
+ * If "true", includes the location information in the generated XML.
+ * @param properties
+ * If "true", includes the thread context map in the generated XML.
+ * @param complete
+ * If "true", includes the XML header and footer, defaults to "false".
+ * @param compact
+ * If "true", does not use end-of-lines and indentation, defaults to "false".
+ * @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".
+ * @return An XML Layout.
+ *
* @deprecated Use {@link #newBuilder()} instead
*/
@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, false, false, null);
+ public static XmlLayout createLayout(final boolean locationInfo, final boolean properties, final boolean complete,
+ final boolean compact, final Charset charset, final boolean includeStacktrace) {
+ return new XmlLayout(null, locationInfo, properties, complete, compact, charset, includeStacktrace, false,
+ false, null);
}
- 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 KeyValuePair[] additionalFields) {
- super(config, new JacksonFactory.XML(includeStacktrace, stacktraceAsString).newWriter(
- locationInfo, properties, compact),
- charset, compact, complete, false, null, null, includeNullDelimiter,
- additionalFields);
+ @PluginBuilderFactory
+ public static > B newBuilder() {
+ return new Builder().asBuilder();
}
/**
- * Returns appropriate XML headers.
- *
- *
XML processing instruction
- *
XML root element
- *
- *
- * @return a byte array containing the header.
+ * @deprecated Use {@link #newBuilder()} instead
*/
- @Override
- public byte[] getHeader() {
- if (!complete) {
- return null;
- }
- final StringBuilder buf = new StringBuilder();
- buf.append("");
- buf.append(this.eol);
- // Make the log4j namespace the default namespace, no need to use more space with a namespace prefix.
- buf.append('<');
- buf.append(ROOT_TAG);
- buf.append(" xmlns=\"" + XmlConstants.XML_NAMESPACE + "\">");
- buf.append(this.eol);
- return buf.toString().getBytes(this.getCharset());
+ @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, false, false, null);
+ }
+
+ 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 KeyValuePair[] additionalFields) {
+ super(config,
+ new XmlJacksonFactory(includeStacktrace, stacktraceAsString).newWriter(locationInfo, properties,
+ compact),
+ charset, compact, complete, false, null, null, includeNullDelimiter, additionalFields);
}
- /**
- * Returns appropriate XML footer.
- *
- * @return a byte array containing the footer, closing the XML root element.
- */
@Override
- public byte[] getFooter() {
- if (!complete) {
- return null;
- }
- return getBytes("" + ROOT_TAG + '>' + this.eol);
+ protected LogEventWithAdditionalFields createLogEventWithAdditionalFields(final LogEvent event,
+ final Map additionalFieldsMap) {
+ return new XmlLogEventWithAdditionalFields(event, additionalFieldsMap);
}
/**
@@ -146,7 +164,7 @@ public byte[] getFooter() {
*
Key: "dtd" Value: "log4j-events.dtd"
*
Key: "version" Value: "2.0"
*
- *
+ *
* @return Map of content format keys supporting XmlLayout
*/
@Override
@@ -167,42 +185,42 @@ public String getContentType() {
}
/**
- * Creates an XML Layout.
- *
- * @param locationInfo If "true", includes the location information in the generated XML.
- * @param properties If "true", includes the thread context map in the generated XML.
- * @param complete If "true", includes the XML header and footer, defaults to "false".
- * @param compact If "true", does not use end-of-lines and indentation, defaults to "false".
- * @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".
- * @return An XML Layout.
+ * Returns appropriate XML footer.
*
- * @deprecated Use {@link #newBuilder()} instead
+ * @return a byte array containing the footer, closing the XML root element.
*/
- @Deprecated
- public static XmlLayout createLayout(
- final boolean locationInfo,
- final boolean properties,
- final boolean complete,
- final boolean compact,
- final Charset charset,
- final boolean includeStacktrace) {
- return new XmlLayout(null, locationInfo, properties, complete, compact, charset, includeStacktrace, false,
- false, null);
- }
-
- @PluginBuilderFactory
- public static > B newBuilder() {
- return new Builder().asBuilder();
+ @Override
+ public byte[] getFooter() {
+ if (!complete) {
+ return null;
+ }
+ return getBytes("" + ROOT_TAG + '>' + this.eol);
}
/**
- * Creates an XML Layout using the default settings.
+ * Returns appropriate XML headers.
+ *
+ *
+*/
+@JacksonXmlRootElement(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_EVENT)
+@JsonFilter(AbstractLogEventMixIn.JSON_FILTER_ID)
+@JsonPropertyOrder({
+ // @formatter:off
+ AbstractLogEventMixIn.ATTR_THREAD,
+ AbstractLogEventMixIn.ATTR_LEVEL,
+ AbstractLogEventMixIn.ATTR_LOGGER_NAME,
+ AbstractLogEventMixIn.ATTR_LOGGER_FQCN,
+ AbstractLogEventMixIn.ATTR_END_OF_BATCH,
+ XmlConstants.ELT_INSTANT,
+ XmlConstants.ELT_MARKER,
+ XmlConstants.ELT_MESSAGE,
+ AbstractLogEventXmlMixIn.ELT_THROWN,
+ XmlConstants.ELT_CONTEXT_MAP,
+ XmlConstants.ELT_CONTEXT_STACK,
+ XmlConstants.ELT_SOURCE})
+ // @formatter:on
+public abstract class AbstractLogEventXmlMixIn extends AbstractLogEventMixIn {
+
+ public static final String ELT_THROWN = "Thrown";
+
+ private static final long serialVersionUID = 1L;
+
+ @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_CONTEXT_MAP)
+ @JsonSerialize(using = ContextDataAsEntryListXmlSerializer.class)
+ @JsonDeserialize(using = ContextDataAsEntryListDeserializer.class)
+ @Override
+ public abstract ReadOnlyStringMap getContextData();
+
+ @JacksonXmlElementWrapper(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_CONTEXT_STACK)
+ @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_CONTEXT_STACK_ITEM)
+ @Override
+ public abstract ContextStack getContextStack();
+
+ @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_INSTANT)
+ @Override
+ public abstract Instant getInstant();
+
+ @JacksonXmlProperty(isAttribute = true)
+ @Override
+ public abstract Level getLevel();
+
+ @JacksonXmlProperty(isAttribute = true)
+ @Override
+ public abstract String getLoggerFqcn();
+
+ @JacksonXmlProperty(isAttribute = true)
+ @Override
+ public abstract String getLoggerName();
+
+ @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_MARKER)
+ @Override
+ public abstract Marker getMarker();
+
+ @JsonSerialize(using = MessageSerializer.class)
+ @JsonDeserialize(using = SimpleMessageDeserializer.class)
+ @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_MESSAGE)
+ @Override
+ public abstract Message getMessage();
+
+ @JsonDeserialize(using = Log4jStackTraceElementDeserializer.class)
+ @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_SOURCE)
+ @Override
+ public abstract StackTraceElement getSource();
+
+ @Override
+ @JacksonXmlProperty(isAttribute = true, localName = ATTR_THREAD_ID)
+ public abstract long getThreadId();
+
+ @Override
+ @JacksonXmlProperty(isAttribute = true, localName = ATTR_THREAD)
+ public abstract String getThreadName();
+
+ @Override
+ @JacksonXmlProperty(isAttribute = true, localName = ATTR_THREAD_PRIORITY)
+ public abstract int getThreadPriority();
+
+ @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_THROWN)
+ @Override
+ public abstract ThrowableProxy getThrownProxy();
+
+ @JacksonXmlProperty(isAttribute = true)
+ @Override
+ public abstract boolean isEndOfBatch();
+
+}
diff --git a/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/ContextDataAsEntryListXmlSerializer.java b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/ContextDataAsEntryListXmlSerializer.java
new file mode 100644
index 00000000000..b916c44e2a5
--- /dev/null
+++ b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/ContextDataAsEntryListXmlSerializer.java
@@ -0,0 +1,37 @@
+/*
+ * 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.xml;
+
+import org.apache.logging.log4j.jackson.ContextDataAsEntryListSerializer;
+import org.apache.logging.log4j.jackson.MapEntry;
+
+public class ContextDataAsEntryListXmlSerializer extends ContextDataAsEntryListSerializer {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected MapEntry createMapEntry(final String key, final String value) {
+ return new XmlMapEntry(key, value);
+ }
+
+ @Override
+ protected MapEntry[] createMapEntryArray(final int size) {
+ return new XmlMapEntry[size];
+ }
+
+}
diff --git a/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/ExtendedStackTraceElementXmlMixIn.java b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/ExtendedStackTraceElementXmlMixIn.java
new file mode 100644
index 00000000000..224ef40e4b2
--- /dev/null
+++ b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/ExtendedStackTraceElementXmlMixIn.java
@@ -0,0 +1,68 @@
+package org.apache.logging.log4j.jackson.xml;
+
+import org.apache.logging.log4j.core.impl.ExtendedClassInfo;
+import org.apache.logging.log4j.jackson.ExtendedStackTraceElementMixIn;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+
+public abstract class ExtendedStackTraceElementXmlMixIn extends ExtendedStackTraceElementMixIn {
+
+ private static final long serialVersionUID = 1L;
+
+ @JsonCreator
+ public ExtendedStackTraceElementXmlMixIn(
+ // @formatter:off
+ @JsonProperty(ATTR_CLASS) final String declaringClass,
+ @JsonProperty(ATTR_METHOD) final String methodName,
+ @JsonProperty(ATTR_FILE) final String fileName,
+ @JsonProperty(ATTR_LINE) final int lineNumber,
+ @JsonProperty(ATTR_EXACT) final boolean exact,
+ @JsonProperty(ATTR_LOCATION) final String location,
+ @JsonProperty(ATTR_VERSION) final String version
+ // @formatter:on
+ ) {
+ super(declaringClass, methodName, fileName, lineNumber, exact, location, version);
+ }
+
+ @Override
+ @JacksonXmlProperty(localName = ATTR_CLASS, isAttribute = true)
+ public abstract String getClassName();
+
+ @Override
+ @JacksonXmlProperty(isAttribute = true)
+ public abstract boolean getExact();
+
+ @Override
+ @JsonIgnore
+ public abstract ExtendedClassInfo getExtraClassInfo();
+
+ @Override
+ @JacksonXmlProperty(localName = ATTR_FILE, isAttribute = true)
+ public abstract String getFileName();
+
+ @Override
+ @JacksonXmlProperty(localName = ATTR_LINE, isAttribute = true)
+ public abstract int getLineNumber();
+
+ @Override
+ @JacksonXmlProperty(isAttribute = true)
+ public abstract String getLocation();
+
+ @Override
+ @JacksonXmlProperty(localName = ATTR_METHOD, isAttribute = true)
+ public abstract String getMethodName();
+
+ @JsonIgnore
+ abstract StackTraceElement getStackTraceElement();
+
+ @Override
+ @JacksonXmlProperty(isAttribute = true)
+ public abstract String getVersion();
+
+ @Override
+ @JsonIgnore
+ public abstract boolean isNativeMethod();
+}
diff --git a/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/InstantXmlMixIn.java b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/InstantXmlMixIn.java
new file mode 100644
index 00000000000..df5a5cee7ae
--- /dev/null
+++ b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/InstantXmlMixIn.java
@@ -0,0 +1,56 @@
+/*
+ * 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.xml;
+
+import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.core.time.Instant;
+import org.apache.logging.log4j.jackson.InstantMixIn;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+
+/**
+ * Jackson mix-in for {@link Instant}.
+ *
+ * Consider this class private.
+ *
+ *
+ * @see Marker
+ */
+abstract class InstantXmlMixIn extends InstantMixIn {
+
+ @JsonCreator
+ protected InstantXmlMixIn(
+ // @formatter:off
+ @JsonProperty(ATTR_EPOCH_SECOND) final long epochSecond,
+ @JsonProperty(ATTR_NANO_OF_SECOND) final int nanoOfSecond)
+ // @formatter:on
+ {
+ super(epochSecond, nanoOfSecond);
+ }
+
+ @Override
+ @JacksonXmlProperty(localName = ATTR_EPOCH_SECOND, isAttribute = true)
+ public abstract long getEpochSecond();
+
+ @Override
+ @JacksonXmlProperty(localName = ATTR_NANO_OF_SECOND, isAttribute = true)
+ public abstract int getNanoOfSecond();
+
+}
diff --git a/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/Log4jXmlModule.java b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/Log4jXmlModule.java
new file mode 100644
index 00000000000..76166b07f83
--- /dev/null
+++ b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/Log4jXmlModule.java
@@ -0,0 +1,52 @@
+/*
+ * 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.xml;
+
+import org.apache.logging.log4j.jackson.SimpleModuleInitializer;
+
+import com.fasterxml.jackson.dataformat.xml.JacksonXmlModule;
+
+/**
+ *
+ * Consider this class private.
+ *
+ *
+ * Extends Jackson's {@link JacksonXmlModule} for Log4j XML's specific needs.
+ *
+ */
+final class Log4jXmlModule extends JacksonXmlModule {
+
+ private static final long serialVersionUID = 1L;
+ private final boolean includeStacktrace;
+ private final boolean stacktraceAsString;
+
+ 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, false);
+ }
+
+ @Override
+ public void setupModule(final SetupContext context) {
+ // Calling super is a MUST!
+ super.setupModule(context);
+ new XmlSetupContextInitializer().setupModule(context, includeStacktrace, stacktraceAsString);
+ }
+}
diff --git a/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/Log4jXmlObjectMapper.java b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/Log4jXmlObjectMapper.java
new file mode 100644
index 00000000000..ec802f46050
--- /dev/null
+++ b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/Log4jXmlObjectMapper.java
@@ -0,0 +1,48 @@
+/*
+ * 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.xml;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.xml.XmlMapper;
+
+/**
+ * A Jackson XML {@link ObjectMapper} initialized for Log4j.
+ *
+ * Consider this class private.
+ *
+ */
+public class Log4jXmlObjectMapper extends XmlMapper {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Create a new instance using the {@code Log4jXmlModule}.
+ */
+ public Log4jXmlObjectMapper() {
+ this(true, false);
+ }
+
+ /**
+ * Create a new instance using the {@code Log4jXmlModule}.
+ */
+ public Log4jXmlObjectMapper(final boolean includeStacktrace, final boolean stacktraceAsString) {
+ super(new Log4jXmlModule(includeStacktrace, stacktraceAsString));
+ this.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
+ }
+
+}
diff --git a/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/LogEventWithContextListXmlMixIn.java b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/LogEventWithContextListXmlMixIn.java
new file mode 100644
index 00000000000..04f1d3d5820
--- /dev/null
+++ b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/LogEventWithContextListXmlMixIn.java
@@ -0,0 +1,48 @@
+/*
+ * 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.xml;
+
+import org.apache.logging.log4j.jackson.ContextDataAsEntryListDeserializer;
+import org.apache.logging.log4j.jackson.XmlConstants;
+import org.apache.logging.log4j.util.ReadOnlyStringMap;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+
+/**
+ *
+ */
+public abstract class LogEventWithContextListXmlMixIn extends AbstractLogEventXmlMixIn {
+
+ private static final long serialVersionUID = 1L;
+
+ @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_CONTEXT_MAP)
+ @JsonSerialize(using = ContextDataAsEntryListXmlSerializer.class)
+ @JsonDeserialize(using = ContextDataAsEntryListDeserializer.class)
+ @Override
+ public abstract ReadOnlyStringMap getContextData();
+
+}
diff --git a/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/MarkerXmlMixIn.java b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/MarkerXmlMixIn.java
new file mode 100644
index 00000000000..a101ed567ae
--- /dev/null
+++ b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/MarkerXmlMixIn.java
@@ -0,0 +1,79 @@
+/*
+ * 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.xml;
+
+import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.jackson.MarkerMixIn;
+import org.apache.logging.log4j.jackson.XmlConstants;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+
+/**
+ * Jackson mix-in for {@link Marker}.
+ *
+ * If we want to deal with more than one {@link Marker} implementation then recode these annotations to include
+ * metadata.
+ *
+ *
+ * @see Marker
+ */
+// Alternate for multiple Marker implementation.
+// @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
+@JsonDeserialize(as = org.apache.logging.log4j.MarkerManager.Log4jMarker.class)
+abstract class MarkerXmlMixIn extends MarkerMixIn {
+ public static final String ATTR_NAME = "name";
+ private static final long serialVersionUID = 1L;
+
+ @JsonCreator
+ protected MarkerXmlMixIn(@JsonProperty(ATTR_NAME) final String name) {
+ super(name);
+ }
+
+ @Override
+ @JacksonXmlProperty(isAttribute = true)
+ public abstract String getName();
+
+ @Override
+ @JacksonXmlElementWrapper(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_PARENTS)
+ @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_MARKER)
+ public abstract Marker[] getParents();
+
+}
diff --git a/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/StackTraceElementXmlMixIn.java b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/StackTraceElementXmlMixIn.java
new file mode 100644
index 00000000000..93a3a45676c
--- /dev/null
+++ b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/StackTraceElementXmlMixIn.java
@@ -0,0 +1,40 @@
+package org.apache.logging.log4j.jackson.xml;
+
+import org.apache.logging.log4j.jackson.StackTraceElementConstants;
+import org.apache.logging.log4j.jackson.StackTraceElementMixIn;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+
+abstract class StackTraceElementXmlMixIn extends StackTraceElementMixIn {
+
+ @JsonCreator
+ protected StackTraceElementXmlMixIn(
+ // @formatter:off
+ @JsonProperty(StackTraceElementConstants.ATTR_CLASS) final String declaringClass,
+ @JsonProperty(StackTraceElementConstants.ATTR_METHOD) final String methodName,
+ @JsonProperty(StackTraceElementConstants.ATTR_FILE) final String fileName,
+ @JsonProperty(StackTraceElementConstants.ATTR_LINE) final int lineNumber)
+ // @formatter:on
+ {
+ super(declaringClass, methodName, fileName, lineNumber);
+ }
+
+ @Override
+ @JacksonXmlProperty(localName = StackTraceElementConstants.ATTR_CLASS, isAttribute = true)
+ protected abstract String getClassName();
+
+ @Override
+ @JacksonXmlProperty(localName = StackTraceElementConstants.ATTR_FILE, isAttribute = true)
+ protected abstract String getFileName();
+
+ @Override
+ @JacksonXmlProperty(localName = StackTraceElementConstants.ATTR_LINE, isAttribute = true)
+ protected abstract int getLineNumber();
+
+ @Override
+ @JacksonXmlProperty(localName = StackTraceElementConstants.ATTR_METHOD, isAttribute = true)
+ protected abstract String getMethodName();
+
+}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ThrowableProxyWithStacktraceAsStringMixIn.java b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/ThrowableProxyWithStacktraceAsStringXmlMixIn.java
similarity index 84%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ThrowableProxyWithStacktraceAsStringMixIn.java
rename to log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/ThrowableProxyWithStacktraceAsStringXmlMixIn.java
index f169d35082d..9cc85c349f4 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ThrowableProxyWithStacktraceAsStringMixIn.java
+++ b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/ThrowableProxyWithStacktraceAsStringXmlMixIn.java
@@ -14,64 +14,63 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+
+package org.apache.logging.log4j.jackson.xml;
+
+import org.apache.logging.log4j.core.impl.ExtendedStackTraceElement;
+import org.apache.logging.log4j.core.impl.ThrowableProxy;
+import org.apache.logging.log4j.jackson.ThrowableProxyWithStacktraceAsStringMixIn;
+import org.apache.logging.log4j.jackson.XmlConstants;
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 {
+public abstract class ThrowableProxyWithStacktraceAsStringXmlMixIn extends 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;
+ @Override
@JsonIgnore
public abstract String getCauseStackTraceAsString();
- @JsonProperty(JsonConstants.ELT_EXTENDED_STACK_TRACE)
+ @Override
@JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_EXTENDED_STACK_TRACE)
public abstract String getExtendedStackTraceAsString();
+ @Override
@JsonIgnore
public abstract StackTraceElement[] getStackTrace();
- @JsonProperty(JsonConstants.ELT_SUPPRESSED)
+ @Override
@JacksonXmlElementWrapper(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_SUPPRESSED)
@JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_SUPPRESSED_ITEM)
public abstract ThrowableProxy[] getSuppressedProxies();
+ @Override
@JsonIgnore
public abstract String getSuppressedStackTrace();
+ @Override
@JsonIgnore
public abstract Throwable getThrowable();
diff --git a/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/ThrowableProxyWithoutStacktraceXmlMixIn.java b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/ThrowableProxyWithoutStacktraceXmlMixIn.java
new file mode 100644
index 00000000000..4ecffae243e
--- /dev/null
+++ b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/ThrowableProxyWithoutStacktraceXmlMixIn.java
@@ -0,0 +1,60 @@
+package org.apache.logging.log4j.jackson.xml;
+
+import org.apache.logging.log4j.core.impl.ExtendedStackTraceElement;
+import org.apache.logging.log4j.core.impl.ThrowableProxy;
+import org.apache.logging.log4j.jackson.ThrowableProxyWithoutStacktraceMixIn;
+import org.apache.logging.log4j.jackson.XmlConstants;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+
+public abstract class ThrowableProxyWithoutStacktraceXmlMixIn extends ThrowableProxyWithoutStacktraceMixIn {
+
+ @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_CAUSE)
+ private ThrowableProxyWithoutStacktraceMixIn causeProxy;
+
+ @JacksonXmlProperty(isAttribute = true)
+ private int commonElementCount;
+
+ @JsonIgnore
+ private ExtendedStackTraceElement[] extendedStackTrace;
+
+ @JacksonXmlProperty(isAttribute = true)
+ private String localizedMessage;
+
+ @JacksonXmlProperty(isAttribute = true)
+ private String message;
+
+ @JacksonXmlProperty(isAttribute = true)
+ private String name;
+
+ @JsonIgnore
+ private transient Throwable throwable;
+
+ @Override
+ @JsonIgnore
+ public abstract String getCauseStackTraceAsString();
+
+ @Override
+ @JsonIgnore
+ public abstract String getExtendedStackTraceAsString();
+
+ @Override
+ @JsonIgnore
+ public abstract StackTraceElement[] getStackTrace();
+
+ @Override
+ @JacksonXmlElementWrapper(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_SUPPRESSED)
+ @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_SUPPRESSED_ITEM)
+ public abstract ThrowableProxy[] getSuppressedProxies();
+
+ @Override
+ @JsonIgnore
+ public abstract String getSuppressedStackTrace();
+
+ @Override
+ @JsonIgnore
+ public abstract Throwable getThrowable();
+
+}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ThrowableProxyMixIn.java b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/ThrowableProxyXmlMixIn.java
similarity index 86%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ThrowableProxyMixIn.java
rename to log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/ThrowableProxyXmlMixIn.java
index a36c1b41858..b52f7f6be1c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ThrowableProxyMixIn.java
+++ b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/ThrowableProxyXmlMixIn.java
@@ -14,66 +14,64 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+
+package org.apache.logging.log4j.jackson.xml;
import org.apache.logging.log4j.core.impl.ExtendedStackTraceElement;
import org.apache.logging.log4j.core.impl.ThrowableProxy;
+import org.apache.logging.log4j.jackson.ThrowableProxyMixIn;
+import org.apache.logging.log4j.jackson.XmlConstants;
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;
-/**
- * Mix-in for {@link ThrowableProxy}.
- */
-abstract class ThrowableProxyMixIn {
+public abstract class ThrowableProxyXmlMixIn extends ThrowableProxyMixIn {
- @JsonProperty(JsonConstants.ELT_CAUSE)
@JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_CAUSE)
private ThrowableProxyMixIn causeProxy;
- @JsonProperty
@JacksonXmlProperty(isAttribute = true)
private int commonElementCount;
- @JsonProperty(JsonConstants.ELT_EXTENDED_STACK_TRACE)
@JacksonXmlElementWrapper(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_EXTENDED_STACK_TRACE)
@JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_EXTENDED_STACK_TRACE_ITEM)
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;
+ @Override
@JsonIgnore
public abstract String getCauseStackTraceAsString();
+ @Override
@JsonIgnore
public abstract String getExtendedStackTraceAsString();
+ @Override
@JsonIgnore
public abstract StackTraceElement[] getStackTrace();
- @JsonProperty(JsonConstants.ELT_SUPPRESSED)
+ @Override
@JacksonXmlElementWrapper(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_SUPPRESSED)
@JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_SUPPRESSED_ITEM)
public abstract ThrowableProxy[] getSuppressedProxies();
+ @Override
@JsonIgnore
public abstract String getSuppressedStackTrace();
+ @Override
@JsonIgnore
public abstract Throwable getThrowable();
diff --git a/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/XmlMapEntry.java b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/XmlMapEntry.java
new file mode 100644
index 00000000000..2500c11aa21
--- /dev/null
+++ b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/XmlMapEntry.java
@@ -0,0 +1,41 @@
+/*
+ * 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.xml;
+
+import org.apache.logging.log4j.jackson.MapEntry;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+
+@JsonPropertyOrder({ "key", "value" })
+class XmlMapEntry extends MapEntry {
+
+ @JacksonXmlProperty(isAttribute = true)
+ private String key;
+
+ @JacksonXmlProperty(isAttribute = true)
+ private String value;
+
+ @JsonCreator
+ public XmlMapEntry(@JsonProperty("key") final String key, @JsonProperty("value") final String value) {
+ super(key, value);
+ }
+
+}
\ No newline at end of file
diff --git a/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/XmlSetupContextInitializer.java b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/XmlSetupContextInitializer.java
new file mode 100644
index 00000000000..4cc5124d922
--- /dev/null
+++ b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/XmlSetupContextInitializer.java
@@ -0,0 +1,38 @@
+package org.apache.logging.log4j.jackson.xml;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.impl.ExtendedStackTraceElement;
+import org.apache.logging.log4j.core.impl.ThrowableProxy;
+import org.apache.logging.log4j.core.time.Instant;
+import org.apache.logging.log4j.jackson.LevelMixIn;
+
+import com.fasterxml.jackson.databind.Module.SetupContext;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+
+/**
+ * Used to set up {@link SetupContext} from different {@link SimpleModule}s.
+ *
+ * Consider this class private.
+ *
+ */
+class XmlSetupContextInitializer {
+
+ public void setupModule(final SetupContext context, final boolean includeStacktrace,
+ final boolean stacktraceAsString) {
+ // JRE classes: we cannot edit those with Jackson annotations
+ context.setMixInAnnotations(StackTraceElement.class, StackTraceElementXmlMixIn.class);
+ // Log4j API classes: we do not want to edit those with Jackson annotations because the API module should not
+ // depend on Jackson.
+ context.setMixInAnnotations(Marker.class, MarkerXmlMixIn.class);
+ context.setMixInAnnotations(Level.class, LevelMixIn.class);
+ context.setMixInAnnotations(Instant.class, InstantXmlMixIn.class);
+ context.setMixInAnnotations(LogEvent.class, LogEventWithContextListXmlMixIn.class);
+ // Log4j Core classes: we do not want to bring in Jackson at runtime if we do not have to.
+ context.setMixInAnnotations(ExtendedStackTraceElement.class, ExtendedStackTraceElementXmlMixIn.class);
+ context.setMixInAnnotations(ThrowableProxy.class, includeStacktrace
+ ? (stacktraceAsString ? ThrowableProxyWithStacktraceAsStringXmlMixIn.class : ThrowableProxyXmlMixIn.class)
+ : ThrowableProxyWithoutStacktraceXmlMixIn.class);
+ }
+}
\ No newline at end of file
diff --git a/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/layout/Log4jXmlPrettyPrinter.java b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/layout/Log4jXmlPrettyPrinter.java
new file mode 100644
index 00000000000..69568614bf9
--- /dev/null
+++ b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/layout/Log4jXmlPrettyPrinter.java
@@ -0,0 +1,41 @@
+package org.apache.logging.log4j.jackson.xml.layout;
+
+import javax.xml.stream.XMLStreamException;
+
+import org.codehaus.stax2.XMLStreamWriter2;
+
+import com.fasterxml.jackson.dataformat.xml.util.DefaultXmlPrettyPrinter;
+
+/**
+ * When <Event>s are written into a XML file; the "Event" object is not the root element, but an element named
+ * <Events> created using {@link XmlLayout#getHeader()} and {@link XmlLayout#getFooter()} methods.
+ *
+ * {@link com.fasterxml.jackson.dataformat.xml.util.DefaultXmlPrettyPrinter} is used to print the Event object into
+ * XML; hence it assumes <Event> tag as the root element, so it prints the <Event> tag without any
+ * indentation. To add an indentation to the <Event> tag; hence an additional indentation for any
+ * sub-elements, this class is written. As an additional task, to avoid the blank line printed after the ending
+ * </Event> tag, the {@code #writePrologLinefeed(XMLStreamWriter2)} method is also overridden.
+ *
+ */
+class Log4jXmlPrettyPrinter extends DefaultXmlPrettyPrinter {
+
+ private static final long serialVersionUID = 1L;
+
+ Log4jXmlPrettyPrinter(final int nesting) {
+ _nesting = nesting;
+ }
+
+ /**
+ * Sets the nesting level to 1 rather than 0, so the "Event" tag will get indentation of next level below root.
+ */
+ @Override
+ public DefaultXmlPrettyPrinter createInstance() {
+ return new Log4jXmlPrettyPrinter(XmlJacksonFactory.DEFAULT_INDENT);
+ }
+
+ @Override
+ public void writePrologLinefeed(final XMLStreamWriter2 sw) throws XMLStreamException {
+ // nothing
+ }
+
+}
\ No newline at end of file
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
new file mode 100644
index 00000000000..0cfba5bf92a
--- /dev/null
+++ b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/layout/XmlJacksonFactory.java
@@ -0,0 +1,54 @@
+package org.apache.logging.log4j.jackson.xml.layout;
+
+import org.apache.logging.log4j.jackson.AbstractJacksonFactory;
+import org.apache.logging.log4j.jackson.JsonConstants;
+import org.apache.logging.log4j.jackson.XmlConstants;
+import org.apache.logging.log4j.jackson.xml.Log4jXmlObjectMapper;
+
+import com.fasterxml.jackson.core.PrettyPrinter;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+class XmlJacksonFactory extends AbstractJacksonFactory {
+
+ static final int DEFAULT_INDENT = 1;
+
+ public XmlJacksonFactory(final boolean includeStacktrace, final boolean stacktraceAsString) {
+ super(includeStacktrace, stacktraceAsString);
+ }
+
+ @Override
+ protected String getPropertyNameForContextMap() {
+ return XmlConstants.ELT_CONTEXT_MAP;
+ }
+
+ @Override
+ protected String getPropertyNameForNanoTime() {
+ return JsonConstants.ELT_NANO_TIME;
+ }
+
+ @Override
+ protected String getPropertyNameForSource() {
+ return XmlConstants.ELT_SOURCE;
+ }
+
+ @Override
+ protected String getPropertyNameForStackTrace() {
+ return XmlConstants.ELT_EXTENDED_STACK_TRACE;
+ }
+
+ @Override
+ protected PrettyPrinter newCompactPrinter() {
+ // Yes, null is the proper answer.
+ return null;
+ }
+
+ @Override
+ protected ObjectMapper newObjectMapper() {
+ return new Log4jXmlObjectMapper(includeStacktrace, stacktraceAsString);
+ }
+
+ @Override
+ protected PrettyPrinter newPrettyPrinter() {
+ return new Log4jXmlPrettyPrinter(DEFAULT_INDENT);
+ }
+}
\ No newline at end of file
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
new file mode 100644
index 00000000000..6d723b0dfd2
--- /dev/null
+++ b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/layout/XmlLayout.java
@@ -0,0 +1,226 @@
+/*
+ * 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.xml.layout;
+
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.logging.log4j.core.Layout;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.config.Node;
+import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.core.util.KeyValuePair;
+import org.apache.logging.log4j.jackson.AbstractJacksonLayout;
+import org.apache.logging.log4j.jackson.XmlConstants;
+
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+
+/**
+ * Appends a series of {@code event} elements as defined in the log4j.dtd.
+ *
+ *
Complete well-formed XML vs. fragment XML
+ *
+ * If you configure {@code complete="true"}, the appender outputs a well-formed XML document where the default namespace
+ * is the log4j namespace {@value XmlConstants#XML_NAMESPACE}. By default, with {@code complete="false"}, you should
+ * include the output as an external entity in a separate file to form a well-formed XML document.
+ *
+ *
+ * If {@code complete="false"}, the appender does not write the XML processing instruction and the root element.
+ *
+ *
Encoding
+ *
+ * Appenders using this layout should have their {@code charset} set to {@code UTF-8} or {@code UTF-16}, otherwise
+ * events containing non-ASCII characters could result in corrupted log files.
+ *
+ *
Pretty vs. compact XML
+ *
+ * By default, the XML layout is not compact (compact = not "pretty") with {@code compact="false"}, which means the
+ * appender uses end-of-line characters and indents lines to format the XML. If {@code compact="true"}, then no
+ * end-of-line or indentation is used. Message content may contain, of course, end-of-lines.
+ *
+ *
Additional Fields
+ *
+ * This property allows addition of custom fields into generated JSON.
+ * {@code } inserts {@code bar} directly into XML
+ * output. Supports Lookup expressions.
+ *
+ */
+@Plugin(name = "XmlLayout", category = Node.CATEGORY, elementType = Layout.ELEMENT_TYPE, printObject = true)
+public final class XmlLayout extends AbstractJacksonLayout {
+
+ public static class Builder> extends AbstractJacksonLayout.Builder
+ implements org.apache.logging.log4j.core.util.Builder {
+
+ public Builder() {
+ super();
+ setCharset(StandardCharsets.UTF_8);
+ }
+
+ @Override
+ public XmlLayout build() {
+ return new XmlLayout(getConfiguration(), isLocationInfo(), isProperties(), isComplete(), isCompact(),
+ getCharset(), isIncludeStacktrace(), isStacktraceAsString(), isIncludeNullDelimiter(),
+ getAdditionalFields());
+ }
+ }
+
+ @JacksonXmlRootElement(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_EVENT)
+ public static class XmlLogEventWithAdditionalFields extends LogEventWithAdditionalFields {
+
+ public XmlLogEventWithAdditionalFields(final Object logEvent, final Map additionalFields) {
+ super(logEvent, additionalFields);
+ }
+
+ }
+
+ private static final String ROOT_TAG = "Events";
+
+ /**
+ * Creates an XML Layout using the default settings.
+ *
+ * @return an XML Layout.
+ */
+ public static XmlLayout createDefaultLayout() {
+ return new XmlLayout(null, false, false, false, false, StandardCharsets.UTF_8, true, false, false, null);
+ }
+
+ /**
+ * Creates an XML Layout.
+ *
+ * @param locationInfo
+ * If "true", includes the location information in the generated XML.
+ * @param properties
+ * If "true", includes the thread context map in the generated XML.
+ * @param complete
+ * If "true", includes the XML header and footer, defaults to "false".
+ * @param compact
+ * If "true", does not use end-of-lines and indentation, defaults to "false".
+ * @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".
+ * @return An XML Layout.
+ *
+ * @deprecated Use {@link #newBuilder()} instead
+ */
+ @Deprecated
+ public static XmlLayout createLayout(final boolean locationInfo, final boolean properties, final boolean complete,
+ final boolean compact, final Charset charset, final boolean includeStacktrace) {
+ return new XmlLayout(null, locationInfo, properties, complete, compact, charset, includeStacktrace, false,
+ false, null);
+ }
+
+ @PluginBuilderFactory
+ public static > B newBuilder() {
+ return new Builder().asBuilder();
+ }
+
+ /**
+ * @deprecated Use {@link #newBuilder()} instead
+ */
+ @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, false, false, null);
+ }
+
+ 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 KeyValuePair[] additionalFields) {
+ super(config,
+ new XmlJacksonFactory(includeStacktrace, stacktraceAsString).newWriter(locationInfo, properties,
+ compact),
+ charset, compact, complete, false, null, null, includeNullDelimiter, additionalFields);
+ }
+
+ @Override
+ protected LogEventWithAdditionalFields createLogEventWithAdditionalFields(final LogEvent event,
+ final Map additionalFieldsMap) {
+ return new XmlLogEventWithAdditionalFields(event, additionalFieldsMap);
+ }
+
+ /**
+ * Gets this XmlLayout's content format. Specified by:
+ *
+ *
Key: "dtd" Value: "log4j-events.dtd"
+ *
Key: "version" Value: "2.0"
+ *
+ *
+ * @return Map of content format keys supporting XmlLayout
+ */
+ @Override
+ public Map getContentFormat() {
+ final Map result = new HashMap<>();
+ // result.put("dtd", "log4j-events.dtd");
+ result.put("xsd", "log4j-events.xsd");
+ result.put("version", "2.0");
+ return result;
+ }
+
+ /**
+ * @return The content type.
+ */
+ @Override
+ public String getContentType() {
+ return "text/xml; charset=" + this.getCharset();
+ }
+
+ /**
+ * Returns appropriate XML footer.
+ *
+ * @return a byte array containing the footer, closing the XML root element.
+ */
+ @Override
+ public byte[] getFooter() {
+ if (!complete) {
+ return null;
+ }
+ return getBytes("" + ROOT_TAG + '>' + this.eol);
+ }
+
+ /**
+ * Returns appropriate XML headers.
+ *
+ *
+ */
+class YamlSetupContextInitializer {
+
+ public 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.
+ context.setMixInAnnotations(Marker.class, MarkerMixIn.class);
+ context.setMixInAnnotations(Level.class, LevelMixIn.class);
+ context.setMixInAnnotations(Instant.class, InstantMixIn.class);
+ context.setMixInAnnotations(LogEvent.class, LogEventJsonMixIn.class); // different ThreadContext handling
+ // 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
+ ? (stacktraceAsString ? ThrowableProxyWithStacktraceAsStringMixIn.class : ThrowableProxyMixIn.class)
+ : ThrowableProxyWithoutStacktraceMixIn.class);
+ }
+
+}
\ No newline at end of file
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
new file mode 100644
index 00000000000..856a201fe2d
--- /dev/null
+++ b/log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/layout/YamlConstants.java
@@ -0,0 +1,35 @@
+/*
+ * 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.yaml.layout;
+
+public class YamlConstants {
+
+ static final String EVENT = "event";
+ static final String ELT_CAUSE = "cause";
+ static final String ELT_CONTEXT_MAP = "contextMap";
+ static final String ELT_CONTEXT_STACK = "contextStack";
+ static final String ELT_MARKER = "marker";
+ static final String ELT_PARENTS = "parents";
+ static final String ELT_SOURCE = "source";
+ static final String ELT_SUPPRESSED = "suppressed";
+ static final String ELT_THROWN = "thrown";
+ static final String ELT_MESSAGE = "message";
+ static final String ELT_EXTENDED_STACK_TRACE = "extendedStackTrace";
+ static final String ELT_NANO_TIME = "nanoTime";
+ static final String ELT_INSTANT = "instant";
+}
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
new file mode 100644
index 00000000000..e32041adfe2
--- /dev/null
+++ b/log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/layout/YamlJacksonFactory.java
@@ -0,0 +1,68 @@
+/*
+ * 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.yaml.layout;
+
+import org.apache.logging.log4j.jackson.AbstractJacksonFactory;
+import org.apache.logging.log4j.jackson.yaml.Log4jYamlObjectMapper;
+
+import com.fasterxml.jackson.core.PrettyPrinter;
+import com.fasterxml.jackson.core.util.DefaultPrettyPrinter;
+import com.fasterxml.jackson.core.util.MinimalPrettyPrinter;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+class YamlJacksonFactory extends AbstractJacksonFactory {
+
+ public YamlJacksonFactory(final boolean includeStacktrace, final boolean stacktraceAsString) {
+ super(includeStacktrace, stacktraceAsString);
+ }
+
+ @Override
+ protected String getPropertyNameForContextMap() {
+ return YamlConstants.ELT_CONTEXT_MAP;
+ }
+
+ @Override
+ protected String getPropertyNameForNanoTime() {
+ return YamlConstants.ELT_NANO_TIME;
+ }
+
+ @Override
+ protected String getPropertyNameForSource() {
+ return YamlConstants.ELT_SOURCE;
+ }
+
+ @Override
+ protected String getPropertyNameForStackTrace() {
+ return YamlConstants.ELT_EXTENDED_STACK_TRACE;
+ }
+
+ @Override
+ protected PrettyPrinter newCompactPrinter() {
+ return new MinimalPrettyPrinter();
+ }
+
+ @Override
+ protected ObjectMapper newObjectMapper() {
+ return new Log4jYamlObjectMapper(false, includeStacktrace, stacktraceAsString);
+ }
+
+ @Override
+ protected PrettyPrinter newPrettyPrinter() {
+ return new DefaultPrettyPrinter();
+ }
+}
\ No newline at end of file
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/YamlLayout.java b/log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/layout/YamlLayout.java
similarity index 68%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/layout/YamlLayout.java
rename to log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/layout/YamlLayout.java
index 1d8576f2ea9..418ef9a0c7c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/YamlLayout.java
+++ b/log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/layout/YamlLayout.java
@@ -14,7 +14,8 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.layout;
+
+package org.apache.logging.log4j.jackson.yaml.layout;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
@@ -22,14 +23,21 @@
import java.util.Map;
import org.apache.logging.log4j.core.Layout;
+import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.DefaultConfiguration;
import org.apache.logging.log4j.core.config.Node;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.core.util.KeyValuePair;
+import org.apache.logging.log4j.jackson.AbstractJacksonLayout;
import org.apache.logging.log4j.util.Strings;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonUnwrapped;
+
/**
* Appends a series of YAML events as strings serialized as bytes.
*
@@ -41,21 +49,15 @@
*
Additional Fields
*
* This property allows addition of custom fields into generated JSON.
- * {@code } inserts {@code foo: "bar"} directly
- * into YAML output. Supports Lookup expressions.
+ * {@code } inserts {@code foo: "bar"} directly into YAML
+ * output. Supports Lookup expressions.
*
+ */
+@JsonFilter(AbstractLogEventMixIn.JSON_FILTER_ID)
+public abstract class AbstractLogEventMixIn implements LogEvent {
+
+ public static final String ATTR_END_OF_BATCH = "endOfBatch";
+ public static final String ATTR_LEVEL = "level";
+ public static final String ATTR_LOGGER_FQCN = "loggerFqcn";
+ public static final String ATTR_LOGGER_NAME = "loggerName";
+ public static final String ATTR_MARKER = "marker";
+ public static final String ATTR_THREAD = "thread";
+ public static final String ATTR_THREAD_ID = "threadId";
+ public static final String ATTR_THREAD_PRIORITY = "threadPriority";
+ public static final String ELT_MESSAGE = "message";
+ public static final String JSON_FILTER_ID = "org.apache.logging.log4j.core.impl.Log4jLogEvent";
+
+ private static final long serialVersionUID = 1L;
+
+ @Deprecated
+ @Override
+ @JsonIgnore
+ public abstract Map getContextMap();
+
+ @JsonSerialize(using = MessageSerializer.class)
+ @JsonDeserialize(using = SimpleMessageDeserializer.class)
+ @Override
+ public abstract Message getMessage();
+
+ @JsonIgnore
+ @Override
+ public abstract Throwable getThrown();
+
+ @JsonIgnore // ignore from 2.11.0
+ @Override
+ public abstract long getTimeMillis();
+
+ @JsonIgnore
+ @Override
+ public abstract boolean isIncludeLocation();
+
+ @Override
+ public abstract void setEndOfBatch(boolean endOfBatch);
+
+ @Override
+ public abstract void setIncludeLocation(boolean locationRequired);
+
+}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ContextDataAsEntryListDeserializer.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ContextDataAsEntryListDeserializer.java
similarity index 88%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ContextDataAsEntryListDeserializer.java
rename to log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ContextDataAsEntryListDeserializer.java
index 85dd21e19f6..6efee4f37aa 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ContextDataAsEntryListDeserializer.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ContextDataAsEntryListDeserializer.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.jackson;
import java.io.IOException;
import java.util.List;
@@ -43,12 +43,12 @@ public class ContextDataAsEntryListDeserializer extends StdDeserializer list = jp.readValueAs(new TypeReference>() {
- // empty
+ // do nothing
});
- final StringMap contextData = new ContextDataFactory().createContextData();
+ final StringMap contextData = ContextDataFactory.createContextData();
for (final MapEntry mapEntry : list) {
contextData.putValue(mapEntry.getKey(), mapEntry.getValue());
}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ContextDataAsEntryListSerializer.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ContextDataAsEntryListSerializer.java
similarity index 77%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ContextDataAsEntryListSerializer.java
rename to log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ContextDataAsEntryListSerializer.java
index ccf17ff287a..d3c7551e57f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ContextDataAsEntryListSerializer.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ContextDataAsEntryListSerializer.java
@@ -14,13 +14,14 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+
+package org.apache.logging.log4j.jackson;
import java.io.IOException;
import java.util.Map;
-import org.apache.logging.log4j.util.ReadOnlyStringMap;
import org.apache.logging.log4j.util.BiConsumer;
+import org.apache.logging.log4j.util.ReadOnlyStringMap;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonGenerator;
@@ -40,17 +41,25 @@ protected ContextDataAsEntryListSerializer() {
super(Map.class, false);
}
+ protected MapEntry createMapEntry(final String key, final String value) {
+ return new MapEntry(key, value);
+ }
+
+ protected MapEntry[] createMapEntryArray(final int size) {
+ return new MapEntry[size];
+ }
+
@Override
- public void serialize(final ReadOnlyStringMap contextData, final JsonGenerator jgen, final SerializerProvider provider)
- throws IOException, JsonGenerationException {
+ public void serialize(final ReadOnlyStringMap contextData, final JsonGenerator jgen,
+ final SerializerProvider provider) throws IOException, JsonGenerationException {
- final MapEntry[] pairs = new MapEntry[contextData.size()];
+ final MapEntry[] pairs = createMapEntryArray(contextData.size());
contextData.forEach(new BiConsumer() {
int i = 0;
@Override
public void accept(final String key, final Object value) {
- pairs[i++] = new MapEntry(key, String.valueOf(value));
+ pairs[i++] = createMapEntry(key, String.valueOf(value));
}
});
jgen.writeObject(pairs);
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ContextDataDeserializer.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ContextDataDeserializer.java
similarity index 97%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ContextDataDeserializer.java
rename to log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ContextDataDeserializer.java
index 3a9a13e248b..9d6843ad791 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ContextDataDeserializer.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ContextDataDeserializer.java
@@ -15,7 +15,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.jackson;
import java.io.IOException;
import java.util.Map;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ContextDataSerializer.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ContextDataSerializer.java
similarity index 98%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ContextDataSerializer.java
rename to log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ContextDataSerializer.java
index 8808d3d699f..245e436a547 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ContextDataSerializer.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ContextDataSerializer.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.jackson;
import java.io.IOException;
import java.util.Map;
@@ -36,19 +36,6 @@ public class ContextDataSerializer extends StdSerializer {
private static final long serialVersionUID = 1L;
- protected ContextDataSerializer() {
- super(Map.class, false);
- }
-
- @Override
- public void serialize(final ReadOnlyStringMap contextData, final JsonGenerator jgen,
- final SerializerProvider provider) throws IOException, JsonGenerationException {
-
- jgen.writeStartObject();
- contextData.forEach(WRITE_STRING_FIELD_INTO, jgen);
- jgen.writeEndObject();
- }
-
private static final TriConsumer WRITE_STRING_FIELD_INTO =
new TriConsumer() {
@@ -61,4 +48,17 @@ public void accept(final String key, final Object value, final JsonGenerator jso
}
}
};
+
+ protected ContextDataSerializer() {
+ super(Map.class, false);
+ }
+
+ @Override
+ public void serialize(final ReadOnlyStringMap contextData, final JsonGenerator jgen,
+ final SerializerProvider provider) throws IOException, JsonGenerationException {
+
+ jgen.writeStartObject();
+ contextData.forEach(WRITE_STRING_FIELD_INTO, jgen);
+ jgen.writeEndObject();
+ }
}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ExtendedStackTraceElementMixIn.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ExtendedStackTraceElementMixIn.java
similarity index 52%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ExtendedStackTraceElementMixIn.java
rename to log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ExtendedStackTraceElementMixIn.java
index 84df3d60750..2642e420a17 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ExtendedStackTraceElementMixIn.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ExtendedStackTraceElementMixIn.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.jackson;
import java.io.Serializable;
@@ -25,63 +25,73 @@
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
/**
* Mix-in for {@link ExtendedStackTraceElement}.
*/
-@JsonPropertyOrder({ "class", "method", "file", "line", "exact", "location", "version" })
-abstract class ExtendedStackTraceElementMixIn implements Serializable {
+@JsonPropertyOrder({
+ //@formatter:off
+ ExtendedStackTraceElementMixIn.ATTR_CLASS,
+ ExtendedStackTraceElementMixIn.ATTR_METHOD,
+ ExtendedStackTraceElementMixIn.ATTR_FILE,
+ ExtendedStackTraceElementMixIn.ATTR_LINE,
+ ExtendedStackTraceElementMixIn.ATTR_EXACT,
+ ExtendedStackTraceElementMixIn.ATTR_LOCATION,
+ ExtendedStackTraceElementMixIn.ATTR_VERSION
+ //@formatter:on
+})
+public abstract class ExtendedStackTraceElementMixIn implements Serializable {
+
+ protected static final String ATTR_CLASS = StackTraceElementConstants.ATTR_CLASS;
+ protected static final String ATTR_METHOD = StackTraceElementConstants.ATTR_METHOD;
+ protected static final String ATTR_FILE = StackTraceElementConstants.ATTR_FILE;
+ protected static final String ATTR_LINE = StackTraceElementConstants.ATTR_LINE;
+ protected static final String ATTR_EXACT = "exact";
+ protected static final String ATTR_LOCATION = "location";
+ protected static final String ATTR_VERSION = "version";
private static final long serialVersionUID = 1L;
@JsonCreator
public ExtendedStackTraceElementMixIn(
- // @formatter:off
- @JsonProperty("class") final String declaringClass,
- @JsonProperty("method") final String methodName,
- @JsonProperty("file") final String fileName,
- @JsonProperty("line") final int lineNumber,
- @JsonProperty("exact") final boolean exact,
- @JsonProperty("location") final String location,
- @JsonProperty("version") final String version
- // @formatter:on
+ // @formatter:off
+ @JsonProperty(ATTR_CLASS) final String declaringClass,
+ @JsonProperty(ATTR_METHOD) final String methodName,
+ @JsonProperty(ATTR_FILE) final String fileName,
+ @JsonProperty(ATTR_LINE) final int lineNumber,
+ @JsonProperty(ATTR_EXACT) final boolean exact,
+ @JsonProperty(ATTR_LOCATION) final String location,
+ @JsonProperty(ATTR_VERSION) final String version
+ // @formatter:on
) {
// empty
}
- @JsonProperty("class")
- @JacksonXmlProperty(localName = "class", isAttribute = true)
+ @JsonProperty(ATTR_CLASS)
public abstract String getClassName();
- @JsonProperty
- @JacksonXmlProperty(isAttribute = true)
+ @JsonProperty(ATTR_EXACT)
public abstract boolean getExact();
@JsonIgnore
public abstract ExtendedClassInfo getExtraClassInfo();
- @JsonProperty("file")
- @JacksonXmlProperty(localName = "file", isAttribute = true)
+ @JsonProperty(ATTR_FILE)
public abstract String getFileName();
- @JsonProperty("line")
- @JacksonXmlProperty(localName = "line", isAttribute = true)
+ @JsonProperty(ATTR_LINE)
public abstract int getLineNumber();
- @JsonProperty
- @JacksonXmlProperty(isAttribute = true)
+ @JsonProperty(ATTR_LOCATION)
public abstract String getLocation();
- @JsonProperty("method")
- @JacksonXmlProperty(localName = "method", isAttribute = true)
+ @JsonProperty(ATTR_METHOD)
public abstract String getMethodName();
-
+
@JsonIgnore
abstract StackTraceElement getStackTraceElement();
- @JsonProperty
- @JacksonXmlProperty(isAttribute = true)
+ @JsonProperty(ATTR_VERSION)
public abstract String getVersion();
@JsonIgnore
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/InstantMixIn.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/InstantMixIn.java
similarity index 68%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/InstantMixIn.java
rename to log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/InstantMixIn.java
index 216534b0f4d..16a3bb5b4d3 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/InstantMixIn.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/InstantMixIn.java
@@ -14,40 +14,42 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.jackson;
+
+import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.core.time.Instant;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
-import org.apache.logging.log4j.Marker;
-import org.apache.logging.log4j.core.time.Instant;
/**
* Jackson mix-in for {@link Instant}.
*
* Consider this class private.
*
+ *
* @see Marker
*/
@JsonIgnoreProperties({ "epochMillisecond", "nanoOfMillisecond" })
-abstract class InstantMixIn {
+public abstract class InstantMixIn {
+
+ protected static final String ATTR_NANO_OF_SECOND = "nanoOfSecond";
+ protected static final String ATTR_EPOCH_SECOND = "epochSecond";
@JsonCreator
- InstantMixIn(
- // @formatter:off
- @JsonProperty("epochSecond") final long epochSecond,
- @JsonProperty("nanoOfSecond") final int nanoOfSecond)
+ protected InstantMixIn(
+ // @formatter:off
+ @JsonProperty(ATTR_EPOCH_SECOND) final long epochSecond,
+ @JsonProperty(ATTR_NANO_OF_SECOND) final int nanoOfSecond)
// @formatter:on
{
// empty
}
- @JsonProperty("epochSecond")
- @JacksonXmlProperty(localName = "epochSecond", isAttribute = true)
- abstract long getEpochSecond();
+ @JsonProperty(ATTR_EPOCH_SECOND)
+ public abstract long getEpochSecond();
- @JsonProperty("nanoOfSecond")
- @JacksonXmlProperty(localName = "nanoOfSecond", isAttribute = true)
- abstract int getNanoOfSecond();
+ @JsonProperty(ATTR_NANO_OF_SECOND)
+ public abstract int getNanoOfSecond();
}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/JsonConstants.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/JsonConstants.java
similarity index 94%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/JsonConstants.java
rename to log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/JsonConstants.java
index bb9898d95c0..1db6f5287d5 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/JsonConstants.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/JsonConstants.java
@@ -14,13 +14,14 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.jackson;
/**
* Keeps constants separate from any class that may depend on third party jars.
*/
public final class JsonConstants {
public static final String ELT_CAUSE = "cause";
+ public static final String ELT_EVENT = "event";
public static final String ELT_CONTEXT_MAP = "contextMap";
public static final String ELT_CONTEXT_STACK = "contextStack";
public static final String ELT_MARKER = "marker";
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/LevelMixIn.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/LevelMixIn.java
similarity index 94%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/LevelMixIn.java
rename to log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/LevelMixIn.java
index bb252c87f53..c11d22ea424 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/LevelMixIn.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/LevelMixIn.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.jackson;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Marker;
@@ -31,7 +31,7 @@
* @see Marker
*/
@JsonIgnoreProperties({ "name", "declaringClass", "standardLevel" })
-abstract class LevelMixIn {
+public abstract class LevelMixIn {
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static Level getLevel(final String name) {
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ListOfMapEntryDeserializer.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ListOfMapEntryDeserializer.java
similarity index 97%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ListOfMapEntryDeserializer.java
rename to log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ListOfMapEntryDeserializer.java
index 0a7281ed327..4a1199d8c9c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ListOfMapEntryDeserializer.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ListOfMapEntryDeserializer.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.jackson;
import java.io.IOException;
import java.util.HashMap;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ListOfMapEntrySerializer.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ListOfMapEntrySerializer.java
similarity index 88%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ListOfMapEntrySerializer.java
rename to log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ListOfMapEntrySerializer.java
index 02f47a2f67e..48a99110047 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ListOfMapEntrySerializer.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ListOfMapEntrySerializer.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.jackson;
import java.io.IOException;
import java.util.Map;
@@ -39,11 +39,15 @@ protected ListOfMapEntrySerializer() {
super(Map.class, false);
}
+ protected MapEntry[] createMapEntryArray(final Set> entrySet) {
+ return new MapEntry[entrySet.size()];
+ }
+
@Override
public void serialize(final Map map, final JsonGenerator jgen, final SerializerProvider provider)
throws IOException, JsonGenerationException {
final Set> entrySet = map.entrySet();
- final MapEntry[] pairs = new MapEntry[entrySet.size()];
+ final MapEntry[] pairs = createMapEntryArray(entrySet);
int i = 0;
for (final Entry entry : entrySet) {
pairs[i++] = new MapEntry(entry.getKey(), entry.getValue());
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/Log4jStackTraceElementDeserializer.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/Log4jStackTraceElementDeserializer.java
similarity index 98%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/Log4jStackTraceElementDeserializer.java
rename to log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/Log4jStackTraceElementDeserializer.java
index 936ace19d2d..7d03805915b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/Log4jStackTraceElementDeserializer.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/Log4jStackTraceElementDeserializer.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.jackson;
import java.io.IOException;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/LogEventJsonMixIn.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/LogEventJsonMixIn.java
similarity index 61%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/LogEventJsonMixIn.java
rename to log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/LogEventJsonMixIn.java
index bbb024de965..e9607bd4c54 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/LogEventJsonMixIn.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/LogEventJsonMixIn.java
@@ -14,18 +14,18 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.jackson;
import java.util.Map;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.ThreadContext.ContextStack;
-import org.apache.logging.log4j.core.time.Instant;
-import org.apache.logging.log4j.util.ReadOnlyStringMap;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.impl.ThrowableProxy;
+import org.apache.logging.log4j.core.time.Instant;
import org.apache.logging.log4j.message.Message;
+import org.apache.logging.log4j.util.ReadOnlyStringMap;
import com.fasterxml.jackson.annotation.JsonFilter;
import com.fasterxml.jackson.annotation.JsonIgnore;
@@ -34,88 +34,87 @@
import com.fasterxml.jackson.annotation.JsonRootName;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
-@JsonRootName(XmlConstants.ELT_EVENT)
-@JacksonXmlRootElement(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_EVENT)
+@JsonRootName(JsonConstants.ELT_EVENT)
@JsonFilter("org.apache.logging.log4j.core.impl.Log4jLogEvent")
-@JsonPropertyOrder({ "timeMillis", XmlConstants.ELT_INSTANT, "threadName", "level", "loggerName", "marker", "message", "thrown", XmlConstants.ELT_CONTEXT_MAP,
- JsonConstants.ELT_CONTEXT_STACK, "loggerFQCN", "Source", "endOfBatch" })
-abstract class LogEventJsonMixIn implements LogEvent {
+@JsonPropertyOrder({
+ // @formatter:off
+ "timeMillis",
+ JsonConstants.ELT_INSTANT,
+ "threadName",
+ "level",
+ "loggerName",
+ "marker",
+ "message",
+ "thrown",
+ JsonConstants.ELT_CONTEXT_MAP,
+ JsonConstants.ELT_CONTEXT_STACK,
+ "loggerFQCN",
+ "Source",
+ "endOfBatch" })
+ // @formatter:on
+/**
+ * As of Jackson 2.9.4, if we extend AbstractLogEventMixIn, then the {@link ObjectMessage} serializer
+ * {@code ObjectMessageSerializer} does not get invoked. Either a bug in Jackson or in our set up code.
+ */
+public abstract class LogEventJsonMixIn /* extends AbstractLogEventMixIn */ implements LogEvent {
private static final long serialVersionUID = 1L;
-// @JsonProperty(JsonConstants.ELT_CONTEXT_MAP)
-// @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_CONTEXT_MAP)
-// @JsonSerialize(using = MapSerializer.class)
-// @JsonDeserialize(using = MapDeserializer.class)
- @Override
- @JsonIgnore
-// @JsonProperty(JsonConstants.ELT_CONTEXT_MAP)
-// @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_CONTEXT_MAP)
- public abstract Map getContextMap();
-
@JsonProperty(JsonConstants.ELT_CONTEXT_MAP)
- @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_CONTEXT_MAP)
@JsonSerialize(using = ContextDataSerializer.class)
@JsonDeserialize(using = ContextDataDeserializer.class)
- //@JsonIgnore
@Override
public abstract ReadOnlyStringMap getContextData();
+ @Override
+ @JsonIgnore
+ public abstract Map getContextMap();
+
@JsonProperty(JsonConstants.ELT_CONTEXT_STACK)
- @JacksonXmlElementWrapper(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_CONTEXT_STACK)
- @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_CONTEXT_STACK_ITEM)
@Override
public abstract ContextStack getContextStack();
+ @JsonProperty(JsonConstants.ELT_INSTANT)
+ @Override
+ public abstract Instant getInstant();
+
@JsonProperty()
- @JacksonXmlProperty(isAttribute = true)
@Override
public abstract Level getLevel();
@JsonProperty()
- @JacksonXmlProperty(isAttribute = true)
@Override
public abstract String getLoggerFqcn();
@JsonProperty()
- @JacksonXmlProperty(isAttribute = true)
@Override
public abstract String getLoggerName();
@JsonProperty(JsonConstants.ELT_MARKER)
- @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_MARKER)
@Override
public abstract Marker getMarker();
@JsonProperty(JsonConstants.ELT_MESSAGE)
@JsonDeserialize(using = SimpleMessageDeserializer.class)
- @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_MESSAGE)
@Override
public abstract Message getMessage();
@JsonProperty(JsonConstants.ELT_SOURCE)
@JsonDeserialize(using = Log4jStackTraceElementDeserializer.class)
- @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_SOURCE)
@Override
public abstract StackTraceElement getSource();
@Override
@JsonProperty("threadId")
- @JacksonXmlProperty(isAttribute = true, localName = "threadId")
public abstract long getThreadId();
@Override
@JsonProperty("thread")
- @JacksonXmlProperty(isAttribute = true, localName = "thread")
public abstract String getThreadName();
@Override
@JsonProperty("threadPriority")
- @JacksonXmlProperty(isAttribute = true, localName = "threadPriority")
public abstract int getThreadPriority();
@JsonIgnore
@@ -123,23 +122,14 @@ abstract class LogEventJsonMixIn implements LogEvent {
public abstract Throwable getThrown();
@JsonProperty(JsonConstants.ELT_THROWN)
- @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_THROWN)
@Override
public abstract ThrowableProxy getThrownProxy();
@JsonIgnore // ignore from 2.11
-// @JsonProperty()
-// @JacksonXmlProperty(isAttribute = true)
@Override
public abstract long getTimeMillis();
- @JsonProperty(JsonConstants.ELT_INSTANT)
- @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_INSTANT)
- @Override
- public abstract Instant getInstant();
-
@JsonProperty()
- @JacksonXmlProperty(isAttribute = true)
@Override
public abstract boolean isEndOfBatch();
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/LogEventWithContextListMixIn.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/LogEventWithContextListMixIn.java
similarity index 68%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/LogEventWithContextListMixIn.java
rename to log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/LogEventWithContextListMixIn.java
index 12b61fa7962..cd0639bcf41 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/LogEventWithContextListMixIn.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/LogEventWithContextListMixIn.java
@@ -14,18 +14,18 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.jackson;
import java.util.Map;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.ThreadContext.ContextStack;
-import org.apache.logging.log4j.core.time.Instant;
-import org.apache.logging.log4j.util.ReadOnlyStringMap;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.impl.ThrowableProxy;
+import org.apache.logging.log4j.core.time.Instant;
import org.apache.logging.log4j.message.Message;
+import org.apache.logging.log4j.util.ReadOnlyStringMap;
import com.fasterxml.jackson.annotation.JsonFilter;
import com.fasterxml.jackson.annotation.JsonIgnore;
@@ -34,12 +34,8 @@
import com.fasterxml.jackson.annotation.JsonRootName;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
@JsonRootName(XmlConstants.ELT_EVENT)
-@JacksonXmlRootElement(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_EVENT)
@JsonFilter("org.apache.logging.log4j.core.impl.Log4jLogEvent")
@JsonPropertyOrder({ "timeMillis", XmlConstants.ELT_INSTANT, "threadName", "level", "loggerName", "marker", "message", "thrown", XmlConstants.ELT_CONTEXT_MAP,
JsonConstants.ELT_CONTEXT_STACK, "loggerFQCN", "Source", "endOfBatch" })
@@ -47,74 +43,62 @@ abstract class LogEventWithContextListMixIn implements LogEvent {
private static final long serialVersionUID = 1L;
-// @JsonProperty(JsonConstants.ELT_CONTEXT_MAP)
-// @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_CONTEXT_MAP)
-// @JsonSerialize(using = ListOfMapEntrySerializer.class)
-// @JsonDeserialize(using = ListOfMapEntryDeserializer.class)
- @Override
- @JsonIgnore
- public abstract Map getContextMap();
-
@JsonProperty(JsonConstants.ELT_CONTEXT_MAP)
- @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_CONTEXT_MAP)
@JsonSerialize(using = ContextDataAsEntryListSerializer.class)
@JsonDeserialize(using = ContextDataAsEntryListDeserializer.class)
// @JsonIgnore
@Override
public abstract ReadOnlyStringMap getContextData();
+ @Override
+ @JsonIgnore
+ public abstract Map getContextMap();
+
@JsonProperty(JsonConstants.ELT_CONTEXT_STACK)
- @JacksonXmlElementWrapper(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_CONTEXT_STACK)
- @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_CONTEXT_STACK_ITEM)
@Override
public abstract ContextStack getContextStack();
+ @JsonProperty(JsonConstants.ELT_INSTANT)
+ @Override
+ public abstract Instant getInstant();
+
@JsonProperty()
- @JacksonXmlProperty(isAttribute = true)
@Override
public abstract Level getLevel();
@JsonProperty()
- @JacksonXmlProperty(isAttribute = true)
@Override
public abstract String getLoggerFqcn();
@JsonProperty()
- @JacksonXmlProperty(isAttribute = true)
@Override
public abstract String getLoggerName();
@JsonProperty(JsonConstants.ELT_MARKER)
- @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_MARKER)
@Override
public abstract Marker getMarker();
@JsonProperty(JsonConstants.ELT_MESSAGE)
@JsonSerialize(using = MessageSerializer.class)
@JsonDeserialize(using = SimpleMessageDeserializer.class)
- @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_MESSAGE)
@Override
public abstract Message getMessage();
@JsonProperty(JsonConstants.ELT_SOURCE)
@JsonDeserialize(using = Log4jStackTraceElementDeserializer.class)
- @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_SOURCE)
@Override
public abstract StackTraceElement getSource();
@Override
@JsonProperty("threadId")
- @JacksonXmlProperty(isAttribute = true, localName = "threadId")
public abstract long getThreadId();
@Override
@JsonProperty("thread")
- @JacksonXmlProperty(isAttribute = true, localName = "thread")
public abstract String getThreadName();
@Override
@JsonProperty("threadPriority")
- @JacksonXmlProperty(isAttribute = true, localName = "threadPriority")
public abstract int getThreadPriority();
@JsonIgnore
@@ -122,23 +106,14 @@ abstract class LogEventWithContextListMixIn implements LogEvent {
public abstract Throwable getThrown();
@JsonProperty(JsonConstants.ELT_THROWN)
- @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_THROWN)
@Override
public abstract ThrowableProxy getThrownProxy();
@JsonIgnore // ignore from 2.11
-// @JsonProperty()
-// @JacksonXmlProperty(isAttribute = true)
@Override
public abstract long getTimeMillis();
- @JsonProperty(JsonConstants.ELT_INSTANT)
- @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_INSTANT)
- @Override
- public abstract Instant getInstant();
-
@JsonProperty()
- @JacksonXmlProperty(isAttribute = true)
@Override
public abstract boolean isEndOfBatch();
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/MapEntry.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/MapEntry.java
similarity index 87%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/MapEntry.java
rename to log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/MapEntry.java
index 239b084982a..fc021809b75 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/MapEntry.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/MapEntry.java
@@ -14,33 +14,32 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+
+package org.apache.logging.log4j.jackson;
import org.apache.logging.log4j.util.Strings;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
/**
*
* Consider this class private.
*
*
- * Used to represent map entries in a generic fashion because the default Jackson behavior uses the key as the element tag. Using the key as
- * an element/property name would mean that you cannot have a generic JSON/XML schema for all log event.
+ * Used to represent map entries in a generic fashion because the default Jackson behavior uses the key as the element
+ * tag. Using the key as an element/property name would mean that you cannot have a generic JSON/XML schema for all log
+ * event.
*
*/
@JsonPropertyOrder({ "key", "value" })
-final class MapEntry {
+public class MapEntry {
@JsonProperty
- @JacksonXmlProperty(isAttribute = true)
private String key;
@JsonProperty
- @JacksonXmlProperty(isAttribute = true)
private String value;
@JsonCreator
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/MarkerMixIn.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/MarkerMixIn.java
similarity index 79%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/MarkerMixIn.java
rename to log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/MarkerMixIn.java
index 950c2c8e412..45bbcc38f91 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/MarkerMixIn.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/MarkerMixIn.java
@@ -14,15 +14,13 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.jackson;
import org.apache.logging.log4j.Marker;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
/**
* Jackson mix-in for {@link Marker}.
@@ -48,29 +46,26 @@
</Parents>
</Marker>
*
- *
+ *
* @see Marker
*/
// Alternate for multiple Marker implementation.
// @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
@JsonDeserialize(as = org.apache.logging.log4j.MarkerManager.Log4jMarker.class)
-abstract class MarkerMixIn implements Marker {
+public abstract class MarkerMixIn implements Marker {
private static final long serialVersionUID = 1L;
@JsonCreator
- MarkerMixIn(@JsonProperty("name") final String name) {
+ public MarkerMixIn(@JsonProperty("name") final String name) {
// empty
}
@Override
@JsonProperty("name")
- @JacksonXmlProperty(isAttribute = true)
public abstract String getName();
@Override
@JsonProperty(JsonConstants.ELT_PARENTS)
- @JacksonXmlElementWrapper(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_PARENTS)
- @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_MARKER)
public abstract Marker[] getParents();
}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/MessageSerializer.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/MessageSerializer.java
similarity index 90%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/MessageSerializer.java
rename to log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/MessageSerializer.java
index 3c19672faf8..faff2daf883 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/MessageSerializer.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/MessageSerializer.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.jackson;
import java.io.IOException;
@@ -30,11 +30,11 @@
* Consider this class private.
*
*/
-final class MessageSerializer extends StdScalarSerializer {
+public final class MessageSerializer extends StdScalarSerializer {
private static final long serialVersionUID = 1L;
- MessageSerializer() {
+ public MessageSerializer() {
super(Message.class);
}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/MutableThreadContextStackDeserializer.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/MutableThreadContextStackDeserializer.java
similarity index 97%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/MutableThreadContextStackDeserializer.java
rename to log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/MutableThreadContextStackDeserializer.java
index 4d4a530dd9e..b98edb530b6 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/MutableThreadContextStackDeserializer.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/MutableThreadContextStackDeserializer.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.jackson;
import java.io.IOException;
import java.util.List;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ObjectMessageSerializer.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ObjectMessageSerializer.java
similarity index 86%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ObjectMessageSerializer.java
rename to log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ObjectMessageSerializer.java
index 8bbfe0b1518..3cb9af25789 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ObjectMessageSerializer.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ObjectMessageSerializer.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.jackson;
import java.io.IOException;
@@ -39,9 +39,9 @@ final class ObjectMessageSerializer extends StdScalarSerializer {
}
@Override
- public void serialize(final ObjectMessage value, final JsonGenerator jgen, final SerializerProvider provider) throws IOException,
- JsonGenerationException {
- jgen.writeObject(value.getParameter());
+ public void serialize(final ObjectMessage value, final JsonGenerator jsonGenerator,
+ final SerializerProvider serializerProvider) throws IOException, JsonGenerationException {
+ jsonGenerator.writeObject(value.getParameter());
}
}
diff --git a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/SetupContextInitializer.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/SetupContextInitializer.java
new file mode 100644
index 00000000000..3d73d932906
--- /dev/null
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/SetupContextInitializer.java
@@ -0,0 +1,38 @@
+package org.apache.logging.log4j.jackson;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.impl.ExtendedStackTraceElement;
+import org.apache.logging.log4j.core.impl.ThrowableProxy;
+import org.apache.logging.log4j.core.time.Instant;
+
+import com.fasterxml.jackson.databind.Module.SetupContext;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+
+/**
+ * Used to set up {@link SetupContext} from different {@link SimpleModule}s.
+ *
+ * Consider this class private.
+ *
+ */
+public class SetupContextInitializer {
+
+ public 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.
+ context.setMixInAnnotations(Marker.class, MarkerMixIn.class);
+ context.setMixInAnnotations(Level.class, LevelMixIn.class);
+ context.setMixInAnnotations(Instant.class, InstantMixIn.class);
+ context.setMixInAnnotations(LogEvent.class, LogEventWithContextListMixIn.class);
+ // 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
+ ? (stacktraceAsString ? ThrowableProxyWithStacktraceAsStringMixIn.class : ThrowableProxyMixIn.class)
+ : ThrowableProxyWithoutStacktraceMixIn.class);
+ }
+
+}
\ No newline at end of file
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/SimpleMessageDeserializer.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/SimpleMessageDeserializer.java
similarity index 83%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/SimpleMessageDeserializer.java
rename to log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/SimpleMessageDeserializer.java
index f269590306f..2ab948cf791 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/SimpleMessageDeserializer.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/SimpleMessageDeserializer.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.jackson;
import java.io.IOException;
@@ -39,9 +39,9 @@ public final class SimpleMessageDeserializer extends StdScalarDeserializer
+ * Consider this class private.
+ *
+ */
+public class SimpleModuleInitializer {
+ public void initialize(final SimpleModule simpleModule, final boolean objectMessageAsJsonObject) {
+ // Workaround because mix-ins do not work for classes that already have a built-in deserializer.
+ // See Jackson issue 429.
+ simpleModule.addDeserializer(StackTraceElement.class, new Log4jStackTraceElementDeserializer());
+ simpleModule.addDeserializer(ContextStack.class, new MutableThreadContextStackDeserializer());
+ if (objectMessageAsJsonObject) {
+ simpleModule.addSerializer(ObjectMessage.class, new ObjectMessageSerializer());
+ }
+ simpleModule.addSerializer(Message.class, new MessageSerializer());
+ }
+}
\ No newline at end of file
diff --git a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/StackTraceElementConstants.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/StackTraceElementConstants.java
new file mode 100644
index 00000000000..0f0f0250486
--- /dev/null
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/StackTraceElementConstants.java
@@ -0,0 +1,30 @@
+/*
+ * 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;
+
+/**
+ * Defines constants use for naming stack trace elements.
+ */
+public class StackTraceElementConstants {
+
+ public static final String ATTR_CLASS = "class";
+ public static final String ATTR_FILE = "file";
+ public static final String ATTR_LINE = "line";
+ public static final String ATTR_METHOD = "method";
+
+}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/StackTraceElementMixIn.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/StackTraceElementMixIn.java
similarity index 54%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/StackTraceElementMixIn.java
rename to log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/StackTraceElementMixIn.java
index 9a3b0223f80..b3bff92aed9 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/StackTraceElementMixIn.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/StackTraceElementMixIn.java
@@ -14,49 +14,46 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+
+package org.apache.logging.log4j.jackson;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
/**
* Jackson mix-in for {@link StackTraceElement}.
*
* Consider this class private.
*
- *
+ *
* @see StackTraceElement
*/
@JsonIgnoreProperties("nativeMethod")
-abstract class StackTraceElementMixIn {
+public abstract class StackTraceElementMixIn {
+
@JsonCreator
- StackTraceElementMixIn(
- // @formatter:off
- @JsonProperty("class") final String declaringClass,
- @JsonProperty("method") final String methodName,
- @JsonProperty("file") final String fileName,
- @JsonProperty("line") final int lineNumber)
- // @formatter:on
+ protected StackTraceElementMixIn(
+ // @formatter:off
+ @JsonProperty(StackTraceElementConstants.ATTR_CLASS) final String declaringClass,
+ @JsonProperty(StackTraceElementConstants.ATTR_METHOD) final String methodName,
+ @JsonProperty(StackTraceElementConstants.ATTR_FILE) final String fileName,
+ @JsonProperty(StackTraceElementConstants.ATTR_LINE) final int lineNumber)
+ // @formatter:on
{
// empty
}
- @JsonProperty("class")
- @JacksonXmlProperty(localName = "class", isAttribute = true)
- abstract String getClassName();
+ @JsonProperty(StackTraceElementConstants.ATTR_CLASS)
+ protected abstract String getClassName();
- @JsonProperty("file")
- @JacksonXmlProperty(localName = "file", isAttribute = true)
- abstract String getFileName();
+ @JsonProperty(StackTraceElementConstants.ATTR_FILE)
+ protected abstract String getFileName();
- @JsonProperty("line")
- @JacksonXmlProperty(localName = "line", isAttribute = true)
- abstract int getLineNumber();
+ @JsonProperty(StackTraceElementConstants.ATTR_LINE)
+ protected abstract int getLineNumber();
- @JsonProperty("method")
- @JacksonXmlProperty(localName = "method", isAttribute = true)
- abstract String getMethodName();
+ @JsonProperty(StackTraceElementConstants.ATTR_METHOD)
+ protected abstract String getMethodName();
}
diff --git a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ThrowableProxyMixIn.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ThrowableProxyMixIn.java
new file mode 100644
index 00000000000..7116c8099c1
--- /dev/null
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ThrowableProxyMixIn.java
@@ -0,0 +1,70 @@
+/*
+ * 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;
+
+import org.apache.logging.log4j.core.impl.ExtendedStackTraceElement;
+import org.apache.logging.log4j.core.impl.ThrowableProxy;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * Mix-in for {@link ThrowableProxy}.
+ */
+public abstract class ThrowableProxyMixIn {
+
+ @JsonProperty(JsonConstants.ELT_CAUSE)
+ private ThrowableProxyMixIn causeProxy;
+
+ @JsonProperty
+ private int commonElementCount;
+
+ @JsonProperty(JsonConstants.ELT_EXTENDED_STACK_TRACE)
+ private ExtendedStackTraceElement[] extendedStackTrace;
+
+ @JsonProperty
+ private String localizedMessage;
+
+ @JsonProperty
+ private String message;
+
+ @JsonProperty
+ private String name;
+
+ @JsonIgnore
+ private transient Throwable throwable;
+
+ @JsonIgnore
+ public abstract String getCauseStackTraceAsString();
+
+ @JsonIgnore
+ public abstract String getExtendedStackTraceAsString();
+
+ @JsonIgnore
+ public abstract StackTraceElement[] getStackTrace();
+
+ @JsonProperty(JsonConstants.ELT_SUPPRESSED)
+ public abstract ThrowableProxy[] getSuppressedProxies();
+
+ @JsonIgnore
+ public abstract String getSuppressedStackTrace();
+
+ @JsonIgnore
+ public abstract Throwable getThrowable();
+
+}
diff --git a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ThrowableProxyWithStacktraceAsStringMixIn.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ThrowableProxyWithStacktraceAsStringMixIn.java
new file mode 100644
index 00000000000..e73a108433c
--- /dev/null
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ThrowableProxyWithStacktraceAsStringMixIn.java
@@ -0,0 +1,70 @@
+/*
+ * 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;
+
+import org.apache.logging.log4j.core.impl.ExtendedStackTraceElement;
+import org.apache.logging.log4j.core.impl.ThrowableProxy;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * Mix-in for {@link org.apache.logging.log4j.core.impl.ThrowableProxy}.
+ */
+public abstract class ThrowableProxyWithStacktraceAsStringMixIn {
+
+ @JsonProperty(JsonConstants.ELT_CAUSE)
+ private ThrowableProxyWithStacktraceAsStringMixIn causeProxy;
+
+ @JsonProperty
+ private int commonElementCount;
+
+ @JsonIgnore
+ private ExtendedStackTraceElement[] extendedStackTrace;
+
+ @JsonProperty
+ private String localizedMessage;
+
+ @JsonProperty
+ private String message;
+
+ @JsonProperty
+ 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)
+ public abstract ThrowableProxy[] getSuppressedProxies();
+
+ @JsonIgnore
+ public abstract String getSuppressedStackTrace();
+
+ @JsonIgnore
+ public abstract Throwable getThrowable();
+
+}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ThrowableProxyWithoutStacktraceMixIn.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ThrowableProxyWithoutStacktraceMixIn.java
similarity index 72%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ThrowableProxyWithoutStacktraceMixIn.java
rename to log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ThrowableProxyWithoutStacktraceMixIn.java
index 264bef8bbd2..b80c89ce952 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ThrowableProxyWithoutStacktraceMixIn.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ThrowableProxyWithoutStacktraceMixIn.java
@@ -14,41 +14,35 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.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;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
/**
* Mix-in for {@link ThrowableProxy}.
*/
-abstract class ThrowableProxyWithoutStacktraceMixIn {
+public abstract class ThrowableProxyWithoutStacktraceMixIn {
@JsonProperty(JsonConstants.ELT_CAUSE)
- @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = XmlConstants.ELT_CAUSE)
private ThrowableProxyWithoutStacktraceMixIn 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
@@ -64,8 +58,6 @@ abstract class ThrowableProxyWithoutStacktraceMixIn {
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
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/XmlConstants.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/XmlConstants.java
similarity index 97%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/XmlConstants.java
rename to log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/XmlConstants.java
index 08714402a6e..10dc37d46c7 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/XmlConstants.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/XmlConstants.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.jackson;
/**
* Keeps constants separate from any class that may depend on third party jars.
diff --git a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/layout/AbstractJacksonLayout.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/layout/AbstractJacksonLayout.java
new file mode 100644
index 00000000000..a468c1e2990
--- /dev/null
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/layout/AbstractJacksonLayout.java
@@ -0,0 +1,378 @@
+/*
+ * 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.
+ */
+
+/*
+ * 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.layout;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.nio.charset.Charset;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.core.config.plugins.PluginElement;
+import org.apache.logging.log4j.core.impl.MutableLogEvent;
+import org.apache.logging.log4j.core.layout.AbstractStringLayout;
+import org.apache.logging.log4j.core.lookup.StrSubstitutor;
+import org.apache.logging.log4j.core.util.KeyValuePair;
+import org.apache.logging.log4j.core.util.StringBuilderWriter;
+import org.apache.logging.log4j.jackson.XmlConstants;
+import org.apache.logging.log4j.util.Strings;
+
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.annotation.JsonUnwrapped;
+import com.fasterxml.jackson.core.JsonGenerationException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectWriter;
+
+abstract class AbstractJacksonLayout extends AbstractStringLayout {
+
+ public static abstract class Builder> extends AbstractStringLayout.Builder {
+
+ @PluginBuilderAttribute
+ private boolean eventEol;
+
+ @PluginBuilderAttribute
+ private boolean compact;
+
+ @PluginBuilderAttribute
+ private boolean complete;
+
+ @PluginBuilderAttribute
+ private boolean locationInfo;
+
+ @PluginBuilderAttribute
+ private boolean properties;
+
+ @PluginBuilderAttribute
+ private boolean includeStacktrace = true;
+
+ @PluginBuilderAttribute
+ private boolean stacktraceAsString = false;
+
+ @PluginBuilderAttribute
+ private boolean includeNullDelimiter = false;
+
+ @PluginElement("AdditionalField")
+ private KeyValuePair[] additionalFields;
+
+ public KeyValuePair[] getAdditionalFields() {
+ return additionalFields;
+ }
+
+ public boolean getEventEol() {
+ return eventEol;
+ }
+
+ public boolean isCompact() {
+ return compact;
+ }
+
+ public boolean isComplete() {
+ return complete;
+ }
+
+ public boolean isIncludeNullDelimiter() {
+ return includeNullDelimiter;
+ }
+
+ /**
+ * If "true", includes the stacktrace of any Throwable in the generated data, defaults to "true".
+ *
+ * @return If "true", includes the stacktrace of any Throwable in the generated data, defaults to "true".
+ */
+ public boolean isIncludeStacktrace() {
+ return includeStacktrace;
+ }
+
+ public boolean isLocationInfo() {
+ return locationInfo;
+ }
+
+ public boolean isProperties() {
+ return properties;
+ }
+
+ public boolean isStacktraceAsString() {
+ return stacktraceAsString;
+ }
+
+ /**
+ * Additional fields to set on each log event.
+ *
+ * @return this builder
+ */
+ public B setAdditionalFields(final KeyValuePair[] additionalFields) {
+ this.additionalFields = additionalFields;
+ return asBuilder();
+ }
+
+ public B setCompact(final boolean compact) {
+ this.compact = compact;
+ return asBuilder();
+ }
+
+ public B setComplete(final boolean complete) {
+ this.complete = complete;
+ return asBuilder();
+ }
+
+ public B setEventEol(final boolean eventEol) {
+ this.eventEol = eventEol;
+ return asBuilder();
+ }
+
+ /**
+ * Whether to include NULL byte as delimiter after each event (optional, default to false).
+ *
+ * @return this builder
+ */
+ public B setIncludeNullDelimiter(final boolean includeNullDelimiter) {
+ this.includeNullDelimiter = includeNullDelimiter;
+ return asBuilder();
+ }
+
+ /**
+ * If "true", includes the stacktrace of any Throwable in the generated JSON, defaults to "true".
+ *
+ * @param includeStacktrace
+ * If "true", includes the stacktrace of any Throwable in the generated JSON, defaults to "true".
+ * @return this builder
+ */
+ public B setIncludeStacktrace(final boolean includeStacktrace) {
+ this.includeStacktrace = includeStacktrace;
+ return asBuilder();
+ }
+
+ public B setLocationInfo(final boolean locationInfo) {
+ this.locationInfo = locationInfo;
+ return asBuilder();
+ }
+
+ public B setProperties(final boolean properties) {
+ this.properties = properties;
+ return asBuilder();
+ }
+
+ /**
+ * Whether to format the stacktrace as a string, and not a nested object (optional, defaults to false).
+ *
+ * @return this builder
+ */
+ public B setStacktraceAsString(final boolean stacktraceAsString) {
+ this.stacktraceAsString = stacktraceAsString;
+ return asBuilder();
+ }
+
+ protected String toStringOrNull(final byte[] header) {
+ return header == null ? null : new String(header, Charset.defaultCharset());
+ }
+ }
+ @JsonRootName(XmlConstants.ELT_EVENT)
+ public static class LogEventWrapperWithAdditionalFields {
+
+ private final Object logEvent;
+ private final Map additionalFields;
+
+ public LogEventWrapperWithAdditionalFields(final Object logEvent, final Map additionalFields) {
+ this.logEvent = logEvent;
+ this.additionalFields = additionalFields;
+ }
+
+ @JsonAnyGetter
+ @SuppressWarnings("unused")
+ public Map getAdditionalFields() {
+ return additionalFields;
+ }
+
+ @JsonUnwrapped
+ public Object getLogEvent() {
+ return logEvent;
+ }
+ }
+
+ protected static class ResolvableKeyValuePair {
+
+ final String key;
+ final String value;
+ final boolean valueNeedsLookup;
+
+ ResolvableKeyValuePair(final KeyValuePair pair) {
+ this.key = pair.getKey();
+ this.value = pair.getValue();
+ this.valueNeedsLookup = AbstractJacksonLayout.valueNeedsLookup(this.value);
+ }
+ }
+
+ protected static final String DEFAULT_EOL = "\r\n";
+
+ protected static final String COMPACT_EOL = Strings.EMPTY;
+ private static LogEvent convertMutableToLog4jEvent(final LogEvent event) {
+ // TODO Jackson-based layouts have certain filters set up for Log4jLogEvent.
+ // TODO Need to set up the same filters for MutableLogEvent but don't know how...
+ // This is a workaround.
+ return event instanceof MutableLogEvent ? ((MutableLogEvent) event).createMemento() : event;
+ }
+ private static ResolvableKeyValuePair[] prepareAdditionalFields(final Configuration config,
+ final KeyValuePair[] additionalFields) {
+ if (additionalFields == null || additionalFields.length == 0) {
+ // No fields set
+ return new ResolvableKeyValuePair[0];
+ }
+
+ // Convert to specific class which already determines whether values needs lookup during serialization
+ final ResolvableKeyValuePair[] resolvableFields = new ResolvableKeyValuePair[additionalFields.length];
+
+ for (int i = 0; i < additionalFields.length; i++) {
+ final ResolvableKeyValuePair resolvable = resolvableFields[i] = new ResolvableKeyValuePair(additionalFields[i]);
+
+ // Validate
+ if (config == null && resolvable.valueNeedsLookup) {
+ throw new IllegalArgumentException(
+ "configuration needs to be set when there are additional fields with variables");
+ }
+ }
+
+ return resolvableFields;
+ }
+ protected static boolean valueNeedsLookup(final String value) {
+ return value != null && value.contains("${");
+ }
+ protected final String eol;
+ protected final ObjectWriter objectWriter;
+
+ protected final boolean compact;
+
+ protected final boolean complete;
+
+ protected final boolean includeNullDelimiter;
+
+ protected final ResolvableKeyValuePair[] additionalFields;
+
+ @Deprecated
+ protected AbstractJacksonLayout(final Configuration config, final ObjectWriter objectWriter, final Charset charset,
+ final boolean compact, final boolean complete, final boolean eventEol, final Serializer headerSerializer,
+ final Serializer footerSerializer) {
+ this(config, objectWriter, charset, compact, complete, eventEol, headerSerializer, footerSerializer, false);
+ }
+
+ @Deprecated
+ protected AbstractJacksonLayout(final Configuration config, final ObjectWriter objectWriter, final Charset charset,
+ final boolean compact, final boolean complete, final boolean eventEol, final Serializer headerSerializer,
+ final Serializer footerSerializer, final boolean includeNullDelimiter) {
+ this(config, objectWriter, charset, compact, complete, eventEol, headerSerializer, footerSerializer,
+ includeNullDelimiter, null);
+ }
+
+ protected AbstractJacksonLayout(final Configuration config, final ObjectWriter objectWriter, final Charset charset,
+ final boolean compact, final boolean complete, final boolean eventEol, final Serializer headerSerializer,
+ final Serializer footerSerializer, final boolean includeNullDelimiter,
+ final KeyValuePair[] additionalFields) {
+ super(config, charset, headerSerializer, footerSerializer);
+ this.objectWriter = objectWriter;
+ this.compact = compact;
+ this.complete = complete;
+ this.eol = compact && !eventEol ? COMPACT_EOL : DEFAULT_EOL;
+ this.includeNullDelimiter = includeNullDelimiter;
+ this.additionalFields = prepareAdditionalFields(config, additionalFields);
+ }
+
+ protected LogEventWrapperWithAdditionalFields createLogEventWrapperWithAdditionalFields(final LogEvent event,
+ final Map additionalFieldsMap) {
+ return new LogEventWrapperWithAdditionalFields(event, additionalFieldsMap);
+ }
+
+ private Map resolveAdditionalFields(final LogEvent logEvent) {
+ // Note: LinkedHashMap retains order
+ final Map additionalFieldsMap = new LinkedHashMap<>(additionalFields.length);
+ final StrSubstitutor strSubstitutor = configuration.getStrSubstitutor();
+
+ // Go over each field
+ for (final ResolvableKeyValuePair pair : additionalFields) {
+ if (pair.valueNeedsLookup) {
+ // Resolve value
+ additionalFieldsMap.put(pair.key, strSubstitutor.replace(logEvent, pair.value));
+ } else {
+ // Plain text value
+ additionalFieldsMap.put(pair.key, pair.value);
+ }
+ }
+
+ return additionalFieldsMap;
+ }
+
+ /**
+ * Formats a {@link org.apache.logging.log4j.core.LogEvent}.
+ *
+ * @param event
+ * The LogEvent.
+ * @return The XML representation of the LogEvent.
+ */
+ @Override
+ public String toSerializable(final LogEvent event) {
+ final StringBuilderWriter writer = new StringBuilderWriter();
+ try {
+ toSerializable(event, writer);
+ return writer.toString();
+ } catch (final IOException e) {
+ // Should this be an ISE or IAE?
+ LOGGER.error(e);
+ return Strings.EMPTY;
+ }
+ }
+
+ public void toSerializable(final LogEvent event, final Writer writer)
+ throws JsonGenerationException, JsonMappingException, IOException {
+ objectWriter.writeValue(writer, wrapLogEvent(convertMutableToLog4jEvent(event)));
+ writer.write(eol);
+ if (includeNullDelimiter) {
+ writer.write('\0');
+ }
+ markEvent();
+ }
+
+ protected Object wrapLogEvent(final LogEvent event) {
+ if (additionalFields.length > 0) {
+ // Construct map for serialization - note that we are intentionally using original LogEvent
+ final Map additionalFieldsMap = resolveAdditionalFields(event);
+ // This class combines LogEvent with AdditionalFields during serialization
+ return createLogEventWrapperWithAdditionalFields(event, additionalFieldsMap);
+ }
+ // No additional fields, return original object
+ return event;
+ }
+}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/package-info.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/package-info.java
similarity index 95%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/package-info.java
rename to log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/package-info.java
index 585da42b8a1..3b5c435fe9a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/package-info.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/package-info.java
@@ -18,4 +18,4 @@
* Classes and interfaces for serializing and deserializing Log4j 2 log events to XML and JSON using the Jackson
* library.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.jackson;
diff --git a/log4j-layout-jackson/src/site/manual/index.md b/log4j-layout-jackson/src/site/manual/index.md
new file mode 100644
index 00000000000..b1d22b6bbfa
--- /dev/null
+++ b/log4j-layout-jackson/src/site/manual/index.md
@@ -0,0 +1,33 @@
+
+
+
+# Apache Log4j Layout for Jackson module
+
+As of Log4j 3.0.0, common code for layouts based on Jackson have moved from the existing module logj-core to the new modules log4j-layout-jackson.
+
+## Requirements
+
+This module was introduced in Log4j 2.11.0 and requires Jackson.
+
+Some features may require optional
+[dependencies](../runtime-dependencies.html). These dependencies are specified in the
+documentation for those features.
+
+Some Log4j features require external dependencies.
+See the [Dependency Tree](dependencies.html#Dependency_Tree)
+for the exact list of JAR files needed for these features.
diff --git a/log4j-layout-jackson/src/site/site.xml b/log4j-layout-jackson/src/site/site.xml
new file mode 100644
index 00000000000..6d4cddc0b14
--- /dev/null
+++ b/log4j-layout-jackson/src/site/site.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/MarkerMixInTest.java b/log4j-layout-jackson/src/test/java/org/apache/logging/log4j/jackson/AbstractMarkerMixInTest.java
similarity index 95%
rename from log4j-core/src/test/java/org/apache/logging/log4j/MarkerMixInTest.java
rename to log4j-layout-jackson/src/test/java/org/apache/logging/log4j/jackson/AbstractMarkerMixInTest.java
index d8bbae8088f..acfae965489 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/MarkerMixInTest.java
+++ b/log4j-layout-jackson/src/test/java/org/apache/logging/log4j/jackson/AbstractMarkerMixInTest.java
@@ -14,29 +14,34 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j;
+package org.apache.logging.log4j.jackson;
import java.io.IOException;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.ObjectReader;
-import com.fasterxml.jackson.databind.ObjectWriter;
+import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.MarkerManager;
import org.apache.logging.log4j.MarkerManager.Log4jMarker;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectReader;
+import com.fasterxml.jackson.databind.ObjectWriter;
+
/**
* Tests {@link MarkerMixIn}.
*
* This class is in this package to let {@link Log4jMarker} have the least visibility.
*/
-public abstract class MarkerMixInTest {
+public abstract class AbstractMarkerMixInTest {
private ObjectReader reader;
private ObjectWriter writer;
+ protected abstract ObjectMapper newObjectMapper();
+
@Before
public void setUp() {
final ObjectMapper log4jObjectMapper = newObjectMapper();
@@ -45,8 +50,6 @@ public void setUp() {
MarkerManager.clear();
}
- protected abstract ObjectMapper newObjectMapper();
-
@Test
public void testNameOnly() throws IOException {
final Marker expected = MarkerManager.getMarker("A");
@@ -67,17 +70,6 @@ public void testOneParent() throws IOException {
Assert.assertEquals(expected, actual);
}
- /**
- * @param expected
- * @return
- * @throws JsonProcessingException
- */
- private String writeValueAsString(final Marker expected) throws JsonProcessingException {
- final String str = writer.writeValueAsString(expected);
- // System.out.println(str);
- return str;
- }
-
@Test
public void testTwoParents() throws IOException {
final Marker expected = MarkerManager.getMarker("A");
@@ -91,4 +83,15 @@ public void testTwoParents() throws IOException {
final Marker actual = reader.readValue(str);
Assert.assertEquals(expected, actual);
}
+
+ /**
+ * @param expected
+ * @return
+ * @throws JsonProcessingException
+ */
+ private String writeValueAsString(final Marker expected) throws JsonProcessingException {
+ final String str = writer.writeValueAsString(expected);
+ // System.out.println(str);
+ return str;
+ }
}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/jackson/LevelMixInTest.java b/log4j-layout-jackson/src/test/java/org/apache/logging/log4j/jackson/LevelMixInTest.java
similarity index 98%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/jackson/LevelMixInTest.java
rename to log4j-layout-jackson/src/test/java/org/apache/logging/log4j/jackson/LevelMixInTest.java
index acff4b422a1..0cdcb365cea 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/jackson/LevelMixInTest.java
+++ b/log4j-layout-jackson/src/test/java/org/apache/logging/log4j/jackson/LevelMixInTest.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.jackson;
+package org.apache.logging.log4j.jackson;
import java.io.IOException;
@@ -23,12 +23,12 @@
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
+import org.junit.experimental.categories.Category;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectReader;
import com.fasterxml.jackson.databind.ObjectWriter;
-import org.junit.experimental.categories.Category;
/**
* Tests {@link LevelMixIn}.
@@ -76,6 +76,8 @@ public int hashCode() {
private ObjectWriter writer;
+ protected abstract ObjectMapper newObjectMapper();
+
@Before
public void setUp() {
log4jObjectMapper = newObjectMapper();
@@ -83,8 +85,6 @@ public void setUp() {
reader = log4jObjectMapper.readerFor(Level.class);
}
- protected abstract ObjectMapper newObjectMapper();
-
@Test
public void testContainer() throws IOException {
final Fixture expected = new Fixture();
diff --git a/log4j-layout-jackson/src/test/java/org/apache/logging/log4j/jackson/ThrowableProxyJacksonTest.java b/log4j-layout-jackson/src/test/java/org/apache/logging/log4j/jackson/ThrowableProxyJacksonTest.java
new file mode 100644
index 00000000000..ee077118071
--- /dev/null
+++ b/log4j-layout-jackson/src/test/java/org/apache/logging/log4j/jackson/ThrowableProxyJacksonTest.java
@@ -0,0 +1,51 @@
+/*
+ * 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;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+
+import org.apache.logging.log4j.core.impl.ThrowableProxy;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ *
+ */
+public class ThrowableProxyJacksonTest {
+
+ static class Fixture {
+ @JsonProperty
+ ThrowableProxy proxy = new ThrowableProxy(new IOException("test"));
+ }
+
+ protected void testIoContainer(final ObjectMapper objectMapper) throws IOException {
+ final Fixture expected = new Fixture();
+ final String s = objectMapper.writeValueAsString(expected);
+ final Fixture actual = objectMapper.readValue(s, Fixture.class);
+ assertEquals(expected.proxy.getName(), actual.proxy.getName());
+ assertEquals(expected.proxy.getMessage(), actual.proxy.getMessage());
+ assertEquals(expected.proxy.getLocalizedMessage(), actual.proxy.getLocalizedMessage());
+ assertEquals(expected.proxy.getCommonElementCount(), actual.proxy.getCommonElementCount());
+ assertArrayEquals(expected.proxy.getExtendedStackTrace(), actual.proxy.getExtendedStackTrace());
+ assertEquals(expected.proxy, actual.proxy);
+ }
+
+}
diff --git a/pom.xml b/pom.xml
index 2c8f327be80..ff8c1b9ed7d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1341,6 +1341,10 @@
log4j-apilog4j-core-java9log4j-core
+ log4j-layout-jackson
+ log4j-layout-jackson-json
+ log4j-layout-jackson-xml
+ log4j-layout-jackson-yamllog4j-core-itslog4j-1.2-apilog4j-slf4j-impl
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index d3f9420d1d8..edb22bc0e71 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -61,6 +61,9 @@
org.apache.logging.log4j.core.lookup.EnvironmentLookup may throw NPE.
+
+ Move Jackson-based layouts to their own modules: JSON, XML, and YAML.
+
From dbfedf7dbd89e189ac264beb9a0400fe6c3680d3 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Mon, 19 Feb 2018 19:14:44 -0700
Subject: [PATCH 0059/2347] [LOG4J2-2082] Update Apache Flume from 1.7.0 to
1.8.0.
---
pom.xml | 2 +-
src/changes/changes.xml | 3 +++
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index ff8c1b9ed7d..b5f0a4765dd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -183,7 +183,7 @@
1.9.132.9.43.2.18.RELEASE
- 1.7.0
+ 1.8.03.3.71.2.102.14.3
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index edb22bc0e71..c279e0188ca 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -64,6 +64,9 @@
Move Jackson-based layouts to their own modules: JSON, XML, and YAML.
+
+ Update Apache Flume from 1.7.0 to 1.8.0.
+
From 233d9e230338f884c93b86ce88ebb580df335b2b Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Mon, 19 Feb 2018 22:53:32 -0700
Subject: [PATCH 0060/2347] [LOG4J2-2079] Update Conversant Disruptor from
1.12.10 to 1.12.11.
---
log4j-core-its/pom.xml | 1 -
log4j-core/pom.xml | 1 -
log4j-perf/pom.xml | 1 -
pom.xml | 6 ++----
src/changes/changes.xml | 3 +++
5 files changed, 5 insertions(+), 7 deletions(-)
diff --git a/log4j-core-its/pom.xml b/log4j-core-its/pom.xml
index 513fce383aa..fc258183d29 100644
--- a/log4j-core-its/pom.xml
+++ b/log4j-core-its/pom.xml
@@ -83,7 +83,6 @@
com.conversantmediadisruptor
- jdk7true
diff --git a/log4j-core/pom.xml b/log4j-core/pom.xml
index 196e4e55e49..b0813d4309c 100644
--- a/log4j-core/pom.xml
+++ b/log4j-core/pom.xml
@@ -61,7 +61,6 @@
com.conversantmediadisruptor
- jdk7true
diff --git a/log4j-perf/pom.xml b/log4j-perf/pom.xml
index 02e3162780d..3fb9af972b9 100644
--- a/log4j-perf/pom.xml
+++ b/log4j-perf/pom.xml
@@ -103,7 +103,6 @@
com.conversantmediadisruptor
- jdk7org.jctools
diff --git a/pom.xml b/pom.xml
index b5f0a4765dd..82218cfe779 100644
--- a/pom.xml
+++ b/pom.xml
@@ -183,9 +183,9 @@
1.9.132.9.43.2.18.RELEASE
- 1.8.0
+ 1.8.03.3.7
- 1.2.10
+ 1.2.112.14.33.6.13.7.0
@@ -627,8 +627,6 @@
com.conversantmediadisruptor${conversantDisruptorVersion}
-
- jdk7org.jctools
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index c279e0188ca..50e621e97ee 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -67,6 +67,9 @@
Update Apache Flume from 1.7.0 to 1.8.0.
+
+ Update Conversant Disruptor from 1.12.10 to 1.12.11.
+
From 46129b61bb07b6f4c57689d13ea197a919726aad Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Mon, 19 Feb 2018 22:58:55 -0700
Subject: [PATCH 0061/2347] Update HttpAppenderTest from Wiremock 2.14.0 to
2.15.0.
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 82218cfe779..b3abcddc042 100644
--- a/pom.xml
+++ b/pom.xml
@@ -783,7 +783,7 @@
com.github.tomakehurstwiremocktest
- 2.14.0
+ 2.15.0
From 7be2a2849e563cea241916449a8dae4e1d35e42d Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Mon, 19 Feb 2018 23:31:58 -0700
Subject: [PATCH 0062/2347] [LOG4J2-2258] Update LMAX Disruptor from 3.3.7 to
3.3.8.
---
pom.xml | 2 +-
src/changes/changes.xml | 3 +++
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index b3abcddc042..efccb368025 100644
--- a/pom.xml
+++ b/pom.xml
@@ -184,7 +184,7 @@
2.9.43.2.18.RELEASE1.8.0
- 3.3.7
+ 3.3.81.2.112.14.33.6.1
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 50e621e97ee..2e7ed2dc43a 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -70,6 +70,9 @@
Update Conversant Disruptor from 1.12.10 to 1.12.11.
+
+ Update LMAX Disruptor from 3.3.7 to 3.3.8.
+
From 53889cbf0f6b8b8c784323887628773019742208 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Mon, 19 Feb 2018 23:36:49 -0700
Subject: [PATCH 0063/2347] [LOG4J2-2083] Update Eclipse javax.persistence from
2.1.1 to 2.2.0.
---
pom.xml | 2 +-
src/changes/changes.xml | 3 +++
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index efccb368025..d93c578c380 100644
--- a/pom.xml
+++ b/pom.xml
@@ -221,7 +221,7 @@
Site Documentation1.2
- 2.1.1
+ 2.2.06.0.05.14.5
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 2e7ed2dc43a..00521890f83 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -73,6 +73,9 @@
Update LMAX Disruptor from 3.3.7 to 3.3.8.
+
+ Update Eclipse javax.persistence from 2.1.1 to 2.2.0.
+
From d6099e19d3e9d35d8cb5c43fa2afe266ec8104f9 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Mon, 19 Feb 2018 23:38:17 -0700
Subject: [PATCH 0064/2347] [LOG4J2-2083] Update build to expect Java 8 sources
and generate Java 8 byte codes.
---
src/changes/changes.xml | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 00521890f83..349f0cd94c0 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -76,6 +76,9 @@
Update Eclipse javax.persistence from 2.1.1 to 2.2.0.
+
+ Update build to expect Java 8 sources and generate Java 8 byte codes.
+
From 038c8586134dd4450485aa22dcfa797bbd703fe6 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Tue, 20 Feb 2018 07:24:08 -0700
Subject: [PATCH 0065/2347] Update MongoDB tests from Maven plugin
de.flapdoodle.embed.mongo 2.0.1 to 2.0.3.
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index d93c578c380..9d52bf29c25 100644
--- a/pom.xml
+++ b/pom.xml
@@ -828,7 +828,7 @@
de.flapdoodle.embedde.flapdoodle.embed.mongo
- 2.0.1
+ 2.0.3test
From b738b99eecafff9fc5efb9d90181e6d4ab9fd6a2 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Tue, 20 Feb 2018 07:59:58 -0700
Subject: [PATCH 0066/2347] [LOG4J2-2259] Update MongoDB 3 module from driver
3.6.1 to 3.6.3.
---
pom.xml | 2 +-
src/changes/changes.xml | 3 +++
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 9d52bf29c25..aba849b28e0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -187,7 +187,7 @@
3.3.81.2.112.14.3
- 3.6.1
+ 3.6.33.7.03.83.1.0-RC7
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 349f0cd94c0..c3c80b1440e 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -79,6 +79,9 @@
Update build to expect Java 8 sources and generate Java 8 byte codes.
+
+ Update MongoDB 3 module from driver 3.6.1 to 3.6.3.
+
From 49031a563812916334a4fa0078151b97a94be298 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Tue, 20 Feb 2018 08:53:28 -0700
Subject: [PATCH 0067/2347] [LOG4J2-2260] [SMTP] Update javax.mail from 1.6.0
to 1.6.1.
---
pom.xml | 2 +-
src/changes/changes.xml | 3 +++
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index aba849b28e0..e8f05b6062a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -589,7 +589,7 @@
com.sun.mailjavax.mail
- 1.6.0
+ 1.6.1org.jboss.spec.javax.jms
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index c3c80b1440e..27e4d1b8509 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -82,6 +82,9 @@
Update MongoDB 3 module from driver 3.6.1 to 3.6.3.
+
+ [SMTP] Update javax.mail from 1.6.0 to 1.6.1.
+
From f87466976326a2ff930673fb297f07448fa45f2b Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Tue, 20 Feb 2018 08:58:13 -0700
Subject: [PATCH 0068/2347] Update release notes from 2.11.0.
---
src/changes/changes.xml | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 27e4d1b8509..9ccb40208f0 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -239,6 +239,12 @@
Update Apache Commons Compress from 1.15 to 1.16.1.
+
+ Update MongoDB 3 module from driver 3.6.1 to 3.6.3.
+
+
+ [SMTP] Update javax.mail from 1.6.0 to 1.6.1.
+
From 2e8ac7a8bfe51b4c0363c2bc254e10e3462700aa Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Tue, 20 Feb 2018 09:01:55 -0700
Subject: [PATCH 0069/2347] [LOG4J2-2261] Update JMS tests from Apache ActiveMQ
5.14.5 (Java 7) to 5.15.3 (Java 8.)
---
pom.xml | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index e8f05b6062a..b91193dd30b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -223,8 +223,7 @@
1.22.2.06.0.0
-
- 5.14.5
+ 5.15.3info1.2.1
From 28128128fc12084546d7e6e230617ca8e586a6da Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Tue, 20 Feb 2018 09:05:44 -0700
Subject: [PATCH 0070/2347] Update GelfLayout from Json-Unit 1.28.1 to 1.28.2.
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index b91193dd30b..1dd44dbbf95 100644
--- a/pom.xml
+++ b/pom.xml
@@ -756,7 +756,7 @@
net.javacrumbs.json-unitjson-unit
- 1.28.1
+ 1.28.2test
From 190136c61126cabad23cb6c453bd372f920d14e0 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Tue, 20 Feb 2018 09:13:09 -0700
Subject: [PATCH 0071/2347] [LOG4J2-2262] Update JDBC and JPA tests from hsqldb
2.3.5 (Java 7) to 2.4.0 (Javav 8.)
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 1dd44dbbf95..07cccf6dfe8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -715,7 +715,7 @@
org.eclipse.persistenceorg.eclipse.persistence.jpa
- 2.6.5
+ 2.7.1org.eclipse.persistence
From 60e96d7c1e3720cc1b21057a2d03e82a61055eef Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Tue, 20 Feb 2018 09:22:36 -0700
Subject: [PATCH 0072/2347] [LOG4J2-2262] Update JDBC and JPA tests from hsqldb
2.3.5 (Java 7) to 2.4.0 (Java 8.)
---
pom.xml | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 07cccf6dfe8..e1ee3d2ce99 100644
--- a/pom.xml
+++ b/pom.xml
@@ -704,8 +704,7 @@
org.hsqldbhsqldb
- 2.3.5
-
+ 2.4.0com.h2database
From ae7f1256ca5bfcf923f790a5ef78bad9298e5a18 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Tue, 20 Feb 2018 09:31:56 -0700
Subject: [PATCH 0073/2347] [LOG4J2-2264] Update JAnsi from 1.16 to 1.17.
---
pom.xml | 2 +-
src/changes/changes.xml | 6 ++++++
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index e1ee3d2ce99..d8b8675ada7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -404,7 +404,7 @@
org.fusesource.jansijansi
- 1.16
+ 1.17true
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 9ccb40208f0..3b5d1d560e6 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -245,6 +245,9 @@
[SMTP] Update javax.mail from 1.6.0 to 1.6.1.
+
+ Update JAnsi from 1.16 to 1.17.
+
@@ -377,6 +380,9 @@
Jackson dependencies for 2.9.2 incorrectly bring in jackson-annotations 2.9.0 instead of 2.9.2.
+
+ Update JAnsi from 1.16 to 1.17.
+
From b562b07177efb0f4b7f3bf5b55c2b123414f6743 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Sun, 25 Feb 2018 11:05:08 -0700
Subject: [PATCH 0074/2347] [LOG4J2-2270] Strings::join, when called with
[null] returns "null" instead of EMPTY. I implemented a different fix than
the one proposed in the PR.
---
.../apache/logging/log4j/util/Strings.java | 2 +-
.../logging/log4j/util/StringsTest.java | 19 +++++++++++++++++++
src/changes/changes.xml | 5 ++++-
3 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/Strings.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/Strings.java
index f6608d61f65..c369a4ee51e 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/Strings.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/Strings.java
@@ -216,7 +216,7 @@ public static String join(final Iterator> iterator, final char separator) {
}
final Object first = iterator.next();
if (!iterator.hasNext()) {
- return Objects.toString(first);
+ return Objects.toString(first, EMPTY);
}
// two or more elements
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/StringsTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/StringsTest.java
index d5167391d21..162d1621fa4 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/util/StringsTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/StringsTest.java
@@ -20,6 +20,9 @@
import org.junit.Assert;
import org.junit.Test;
+import java.util.Arrays;
+import java.util.Iterator;
+
public class StringsTest {
/**
@@ -31,6 +34,22 @@ public void testEMPTY() {
Assert.assertEquals(0, Strings.EMPTY.length());
}
+ @Test
+ public void testJoin() {
+ Assert.assertEquals(null, Strings.join((Iterable>) null, '.'));
+ Assert.assertEquals(null, Strings.join((Iterator>) null, '.'));
+ Assert.assertEquals("", Strings.join((Arrays.asList()), '.'));
+
+ Assert.assertEquals("a", Strings.join(Arrays.asList("a"), '.'));
+ Assert.assertEquals("a.b", Strings.join(Arrays.asList("a", "b"), '.'));
+ Assert.assertEquals("a.b.c", Strings.join(Arrays.asList("a", "b", "c"), '.'));
+
+ Assert.assertEquals("", Strings.join(Arrays.asList((String) null), ':'));
+ Assert.assertEquals(":", Strings.join(Arrays.asList(null, null), ':'));
+ Assert.assertEquals("a:", Strings.join(Arrays.asList("a", null), ':'));
+ Assert.assertEquals(":b", Strings.join(Arrays.asList(null, "b"), ':'));
+ }
+
@Test
public void testQuote() {
Assert.assertEquals("'Q'", Strings.quote("Q"));
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 3b5d1d560e6..f0a538aaa1c 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -58,7 +58,7 @@
Move JDBC code to a new module log4j-jdbc.
-
+
org.apache.logging.log4j.core.lookup.EnvironmentLookup may throw NPE.
@@ -85,6 +85,9 @@
[SMTP] Update javax.mail from 1.6.0 to 1.6.1.
+
+ Strings::join, when called with [null] returns "null" instead of EMPTY.
+
From 0b222b7f2366b7d38e303d1a36f424e814bfcbf5 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Sun, 25 Feb 2018 11:05:39 -0700
Subject: [PATCH 0075/2347] [LOG4J2-2270] Strings::join, when called with
[null] returns "null" instead of EMPTY. I implemented a different fix than
the one proposed in the PR.
---
src/changes/changes.xml | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index f0a538aaa1c..ae9015cb337 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -251,6 +251,9 @@
Update JAnsi from 1.16 to 1.17.
+
+ Strings::join, when called with [null] returns "null" instead of EMPTY.
+
From 33fe01a2ada89fccd3165e33b172163eb0c58b58 Mon Sep 17 00:00:00 2001
From: Ralph Goers
Date: Sun, 25 Feb 2018 21:17:08 -0700
Subject: [PATCH 0076/2347] LOG4J2-2271 - Move module-info.class to
META-INF/versions/9 directory.
---
log4j-api-java9/src/assembly/java9.xml | 8 --------
src/changes/changes.xml | 3 +++
2 files changed, 3 insertions(+), 8 deletions(-)
diff --git a/log4j-api-java9/src/assembly/java9.xml b/log4j-api-java9/src/assembly/java9.xml
index 3e595612db4..41a0da0699d 100644
--- a/log4j-api-java9/src/assembly/java9.xml
+++ b/log4j-api-java9/src/assembly/java9.xml
@@ -32,7 +32,6 @@
**/*.class
- module-info.class**/Dummy.class**/spi/Provider.class**/util/PropertySource.class
@@ -40,12 +39,5 @@
**/message/ThreadDumpMessage$ThreadInfoFactory.class
-
- ${project.build.outputDirectory}
- /classes
-
- module-info.class
-
-
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index ae9015cb337..3f964969573 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -90,6 +90,9 @@
+
+ Move module-info.class to META-INF/versions/9 directory.
+
Incorrect automatics module name header was being included in manifests.
From 967bb0f71155aa00acadbd95362a90832bed69f6 Mon Sep 17 00:00:00 2001
From: Carter Kozak
Date: Tue, 13 Feb 2018 11:28:17 -0500
Subject: [PATCH 0077/2347] LOG4J2-2252 Reusable LogEvents should pass along
the original format string
This allows custom layouts to group logged messages parameterized
values without creating new single-use messages for each event.
This slightly modifies the getFormat implementation of some
message types to avoid doing unnecessary work to load the
format string.
---
.../log4j/message/ReusableObjectMessage.java | 2 +-
.../log4j/message/ReusableSimpleMessage.java | 2 +-
.../logging/log4j/message/SimpleMessage.java | 5 ++--
.../message/ReusableObjectMessageTest.java | 4 +--
.../message/ReusableSimpleMessageTest.java | 2 +-
.../log4j/core/async/RingBufferLogEvent.java | 5 +++-
.../log4j/core/impl/MutableLogEvent.java | 5 +++-
.../log4j/core/impl/MutableLogEventTest.java | 28 +++++++++++++++++++
8 files changed, 44 insertions(+), 9 deletions(-)
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java
index c4ffa22c105..ff2d58f02f8 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java
@@ -55,7 +55,7 @@ public void formatTo(final StringBuilder buffer) {
*/
@Override
public String getFormat() {
- return getFormattedMessage();
+ return obj instanceof String ? (String) obj : null;
}
/**
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableSimpleMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableSimpleMessage.java
index 905b694d30e..90c8bc0bd98 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableSimpleMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableSimpleMessage.java
@@ -43,7 +43,7 @@ public String getFormattedMessage() {
@Override
public String getFormat() {
- return getFormattedMessage();
+ return charSequence instanceof String ? (String) charSequence : null;
}
@Override
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/SimpleMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/SimpleMessage.java
index 8a2fc7219ea..d33f3b9bfdc 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/SimpleMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/SimpleMessage.java
@@ -16,10 +16,11 @@
*/
package org.apache.logging.log4j.message;
+import org.apache.logging.log4j.util.StringBuilderFormattable;
+
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
-import org.apache.logging.log4j.util.StringBuilderFormattable;
/**
* The simplest possible implementation of Message. It just returns the String given as the constructor argument.
@@ -75,7 +76,7 @@ public void formatTo(final StringBuilder buffer) {
*/
@Override
public String getFormat() {
- return getFormattedMessage();
+ return message;
}
/**
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableObjectMessageTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableObjectMessageTest.java
index d4f87a7dd8e..614d54c08cc 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableObjectMessageTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableObjectMessageTest.java
@@ -49,8 +49,8 @@ public void testGetFormattedMessage_ReturnsLatestSetString() throws Exception {
}
@Test
- public void testGetFormat_InitiallyNullString() throws Exception {
- assertEquals("null", new ReusableObjectMessage().getFormat());
+ public void testGetFormat_InitiallyNull() throws Exception {
+ assertNull(new ReusableObjectMessage().getFormat());
}
@Test
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableSimpleMessageTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableSimpleMessageTest.java
index 3a56b643175..1070a532cb4 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableSimpleMessageTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableSimpleMessageTest.java
@@ -50,7 +50,7 @@ public void testGetFormattedMessage_ReturnsLatestSetString() throws Exception {
@Test
public void testGetFormat_InitiallyStringNull() throws Exception {
- assertEquals("null", new ReusableSimpleMessage().getFormat());
+ assertNull(new ReusableSimpleMessage().getFormat());
}
@Test
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEvent.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEvent.java
index 0a2964df412..b18a3753e17 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEvent.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEvent.java
@@ -83,6 +83,7 @@ public RingBufferLogEvent newInstance() {
private String threadName;
private String loggerName;
private Message message;
+ private String messageFormat;
private StringBuilder messageText;
private Object[] parameters;
private transient Throwable thrown;
@@ -135,6 +136,7 @@ private void setMessage(final Message msg) {
if (msg instanceof ReusableMessage) {
final ReusableMessage reusable = (ReusableMessage) msg;
reusable.formatTo(getMessageTextForWriting());
+ messageFormat = reusable.getFormat();
if (parameters != null) {
parameters = reusable.swapParameters(parameters);
parameterCount = reusable.getParameterCount();
@@ -235,7 +237,7 @@ public String getFormattedMessage() {
*/
@Override
public String getFormat() {
- return null;
+ return messageFormat;
}
/**
@@ -402,6 +404,7 @@ public void clear() {
this.fqcn = null;
this.level = null;
this.message = null;
+ this.messageFormat = null;
this.thrown = null;
this.thrownProxy = null;
this.contextStack = null;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/MutableLogEvent.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/MutableLogEvent.java
index b427c4a272d..52688bc303a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/MutableLogEvent.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/MutableLogEvent.java
@@ -56,6 +56,7 @@ public class MutableLogEvent implements LogEvent, ReusableMessage {
private String threadName;
private String loggerName;
private Message message;
+ private String messageFormat;
private StringBuilder messageText;
private Object[] parameters;
private Throwable thrown;
@@ -126,6 +127,7 @@ public void clear() {
level = null;
loggerName = null;
message = null;
+ messageFormat = null;
thrown = null;
thrownProxy = null;
source = null;
@@ -211,6 +213,7 @@ public void setMessage(final Message msg) {
if (msg instanceof ReusableMessage) {
final ReusableMessage reusable = (ReusableMessage) msg;
reusable.formatTo(getMessageTextForWriting());
+ this.messageFormat = msg.getFormat();
if (parameters != null) {
parameters = reusable.swapParameters(parameters);
parameterCount = reusable.getParameterCount();
@@ -243,7 +246,7 @@ public String getFormattedMessage() {
*/
@Override
public String getFormat() {
- return null;
+ return messageFormat;
}
/**
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/MutableLogEventTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/MutableLogEventTest.java
index 1e4c8ccdf41..2bee6fb573e 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/MutableLogEventTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/MutableLogEventTest.java
@@ -28,7 +28,9 @@
import org.apache.logging.log4j.MarkerManager;
import org.apache.logging.log4j.ThreadContext;
import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.message.ParameterizedMessage;
+import org.apache.logging.log4j.message.ReusableMessageFactory;
import org.apache.logging.log4j.message.SimpleMessage;
import org.apache.logging.log4j.util.FilteredObjectInputStream;
import org.apache.logging.log4j.util.SortedArrayStringMap;
@@ -112,6 +114,32 @@ public void testInitFromCopiesAllFields() {
assertEquals("millis", source.getTimeMillis(), mutable.getTimeMillis());
}
+ @Test
+ public void testInitFromReusableCopiesFormatString() {
+ Message message = ReusableMessageFactory.INSTANCE.newMessage("msg in a {}", "bottle");
+ final Log4jLogEvent source = Log4jLogEvent.newBuilder() //
+ .setContextData(CONTEXT_DATA) //
+ .setContextStack(STACK) //
+ .setEndOfBatch(true) //
+ .setIncludeLocation(true) //
+ .setLevel(Level.FATAL) //
+ .setLoggerFqcn("a.b.c.d.e") //
+ .setLoggerName("my name is Logger") //
+ .setMarker(MarkerManager.getMarker("on your marks")) //
+ .setMessage(message) //
+ .setNanoTime(1234567) //
+ .setSource(new StackTraceElement("myclass", "mymethod", "myfile", 123)) //
+ .setThreadId(100).setThreadName("threadname").setThreadPriority(10) //
+ .setThrown(new RuntimeException("run")) //
+ .setTimeMillis(987654321)
+ .build();
+ final MutableLogEvent mutable = new MutableLogEvent();
+ mutable.initFrom(source);
+ assertEquals("format", "msg in a {}", mutable.getFormat());
+ assertEquals("formatted", "msg in a bottle", mutable.getFormattedMessage());
+ assertEquals("parameters", new String[] {"bottle"}, mutable.getParameters());
+ }
+
@Test
public void testClear() {
final MutableLogEvent mutable = new MutableLogEvent();
From 41648dfa16a7176860e3af30b483e85775c48b9d Mon Sep 17 00:00:00 2001
From: Carter Kozak
Date: Wed, 14 Feb 2018 14:48:00 -0500
Subject: [PATCH 0078/2347] LOG4J2-2253 Added
ParameterVisitableMessage.forEachParameter
This method allows us to iterate over parameters in a
ParameterVisitableMessage without array creation.
---
.../log4j/message/ParameterConsumer.java | 26 ++++++++++++++++
.../message/ParameterVisitableMessage.java | 30 +++++++++++++++++++
.../log4j/message/ReusableObjectMessage.java | 7 ++++-
.../message/ReusableParameterizedMessage.java | 10 ++++++-
.../log4j/message/ReusableSimpleMessage.java | 6 +++-
.../ReusableParameterizedMessageTest.java | 22 ++++++++++++++
.../log4j/core/async/RingBufferLogEvent.java | 17 +++++++----
.../log4j/core/impl/MutableLogEvent.java | 11 ++++++-
.../core/async/RingBufferLogEventTest.java | 12 ++++++++
9 files changed, 131 insertions(+), 10 deletions(-)
create mode 100644 log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterConsumer.java
create mode 100644 log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterVisitableMessage.java
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterConsumer.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterConsumer.java
new file mode 100644
index 00000000000..ff8c148e112
--- /dev/null
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterConsumer.java
@@ -0,0 +1,26 @@
+package org.apache.logging.log4j.message;
+
+/**
+ * An operation that accepts two input arguments and returns no result.
+ *
+ *
+ * The third parameter lets callers pass in a stateful object to be modified with the key-value pairs,
+ * so the ParameterConsumer implementation itself can be stateless and potentially reusable.
+ *
+ *
+ * @param state data
+ * @see ReusableMessage
+ * @since 2.11
+ */
+public interface ParameterConsumer {
+
+ /**
+ * Performs an operation given the specified arguments.
+ *
+ * @param parameter the parameter
+ * @param parameterIndex Index of the parameter
+ * @param state
+ */
+ void accept(Object parameter, short parameterIndex, S state);
+
+}
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterVisitableMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterVisitableMessage.java
new file mode 100644
index 00000000000..5cb62283992
--- /dev/null
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterVisitableMessage.java
@@ -0,0 +1,30 @@
+package org.apache.logging.log4j.message;
+
+import org.apache.logging.log4j.util.PerformanceSensitive;
+
+/**
+ * Allows message parameters to be iterated over without any allocation
+ * or memory copies.
+ *
+ * @since 2.11
+ */
+@PerformanceSensitive("allocation")
+public interface ParameterVisitableMessage extends Message {
+
+ /**
+ * Performs the given action for each parameter until all values
+ * have been processed or the action throws an exception.
+ *
+ * The second parameter lets callers pass in a stateful object to be modified with the key-value pairs,
+ * so the TriConsumer implementation itself can be stateless and potentially reusable.
+ *
+ *
+ * @param action The action to be performed for each key-value pair in this collection
+ * @param state the object to be passed as the third parameter to each invocation on the
+ * specified ParameterConsumer.
+ * @param type of the third parameter
+ * @since 2.11
+ */
+ void forEachParameter(ParameterConsumer action, S state);
+
+}
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java
index c4ffa22c105..603381f31d5 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java
@@ -24,7 +24,7 @@
* @since 2.6
*/
@PerformanceSensitive("allocation")
-public class ReusableObjectMessage implements ReusableMessage {
+public class ReusableObjectMessage implements ReusableMessage, ParameterVisitableMessage {
private static final long serialVersionUID = 6922476812535519960L;
private transient Object obj;
@@ -112,6 +112,11 @@ public short getParameterCount() {
return 0;
}
+ @Override
+ public void forEachParameter(ParameterConsumer action, S state) {
+ action.accept(obj, (short) 0, state);
+ }
+
@Override
public Message memento() {
return new ObjectMessage(obj);
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java
index daf299482c8..55a079cc8f4 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java
@@ -30,7 +30,7 @@
* @since 2.6
*/
@PerformanceSensitive("allocation")
-public class ReusableParameterizedMessage implements ReusableMessage {
+public class ReusableParameterizedMessage implements ReusableMessage, ParameterVisitableMessage {
private static final int MIN_BUILDER_SIZE = 512;
private static final int MAX_PARMS = 10;
@@ -104,6 +104,14 @@ public short getParameterCount() {
return (short) argCount;
}
+ @Override
+ public void forEachParameter(ParameterConsumer action, S state) {
+ Object[] parameters = getParams();
+ for (short i = 0; i < argCount; i++) {
+ action.accept(parameters[i], i, state);
+ }
+ }
+
@Override
public Message memento() {
return new ParameterizedMessage(messagePattern, getTrimmedParams());
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableSimpleMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableSimpleMessage.java
index 905b694d30e..03c290ab579 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableSimpleMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableSimpleMessage.java
@@ -23,7 +23,7 @@
* @since 2.6
*/
@PerformanceSensitive("allocation")
-public class ReusableSimpleMessage implements ReusableMessage, CharSequence {
+public class ReusableSimpleMessage implements ReusableMessage, CharSequence, ParameterVisitableMessage {
private static final long serialVersionUID = -9199974506498249809L;
private static Object[] EMPTY_PARAMS = new Object[0];
private CharSequence charSequence;
@@ -80,6 +80,10 @@ public short getParameterCount() {
return 0;
}
+ @Override
+ public void forEachParameter(ParameterConsumer action, S state) {
+ }
+
@Override
public Message memento() {
return new SimpleMessage(charSequence);
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableParameterizedMessageTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableParameterizedMessageTest.java
index b25735c17af..38f157dce33 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableParameterizedMessageTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableParameterizedMessageTest.java
@@ -19,6 +19,9 @@
import org.apache.logging.log4j.junit.Mutable;
import org.junit.Test;
+import java.util.LinkedList;
+import java.util.List;
+
import static org.junit.Assert.*;
/**
@@ -144,4 +147,23 @@ public void testThrowable() {
msg.set(testMsg, "msgs", EXCEPTION2);
assertSame(EXCEPTION2, msg.getThrowable());
}
+
+ @Test
+ public void testParameterConsumer() {
+ final String testMsg = "Test message {}";
+ final ReusableParameterizedMessage msg = new ReusableParameterizedMessage();
+ final Throwable EXCEPTION1 = new IllegalAccessError("#1");
+ msg.set(testMsg, "msg", EXCEPTION1);
+ List
-
+
Move module-info.class to META-INF/versions/9 directory.
From b712cb7b419e5d665ee4935101a947f933ab749d Mon Sep 17 00:00:00 2001
From: rpopma
Date: Mon, 26 Feb 2018 19:42:22 +0900
Subject: [PATCH 0081/2347] LOG4J2-2253 (change log) Add API to enable
iterating over message parameters without creating temporary objects
Closes #150
(cherry picked from commit 73306cd)
---
src/changes/changes.xml | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index db9db2f6623..10081d52fd4 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -90,6 +90,9 @@
+
+ Add API to enable iterating over message parameters without creating temporary objects.
+
Move module-info.class to META-INF/versions/9 directory.
From c8261a5b1997c121f9416d693e60dac050c2719f Mon Sep 17 00:00:00 2001
From: "Bruno P. Kinoshita"
Date: Tue, 27 Feb 2018 16:11:43 +1300
Subject: [PATCH 0082/2347] Fix typo in documentation
Hello, found while updating a legacy project from log4j1 to log4j2, and reading the docs (which are great, by the way, a life saver. Thanks!)
---
src/site/xdoc/manual/customconfig.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/site/xdoc/manual/customconfig.xml b/src/site/xdoc/manual/customconfig.xml
index 8b1b8bdd6fe..e57af39415b 100644
--- a/src/site/xdoc/manual/customconfig.xml
+++ b/src/site/xdoc/manual/customconfig.xml
@@ -210,7 +210,7 @@ builder.add( builder.newLogger( "TestLogger", Level.DEBUG )
builder.add( builder.newRootLogger( Level.DEBUG )
.add( builder.newAppenderRef( "rolling" ) ) );
-LoggerContext ctx = Configurator.intitialize(builder.build());
+LoggerContext ctx = Configurator.initialize(builder.build());
]]>
From 5b5bd912043222b1b0c94683bcba98eede54c97c Mon Sep 17 00:00:00 2001
From: rpopma
Date: Tue, 27 Feb 2018 12:17:43 +0900
Subject: [PATCH 0083/2347] LOG4J2-2252 (change log) Reusable LogEvents now
pass the original format string to downstream components like layouts and
filters.
Closes #148
(cherry picked from commit e4d9b0d)
---
src/changes/changes.xml | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 10081d52fd4..4e3cc99a3e5 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -90,6 +90,9 @@
+
+ Reusable LogEvents now pass the original format string to downstream components like layouts and filters.
+
Add API to enable iterating over message parameters without creating temporary objects.
From 73191e1ccfd35e444634d3150fdaad029f1e10e9 Mon Sep 17 00:00:00 2001
From: Carter Kozak
Date: Mon, 26 Feb 2018 21:39:12 -0800
Subject: [PATCH 0084/2347] LOG4J2-2253 Update ParameterConsumer index type
from short to int
Originally ParameterVisitable was built for ReusableMessage which
provides a "short getParameterCount()" method. Now that the
interface isn't bound to ReusableMessage it might as well use
integer.
---
.../org/apache/logging/log4j/message/ParameterConsumer.java | 2 +-
.../org/apache/logging/log4j/message/ReusableObjectMessage.java | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterConsumer.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterConsumer.java
index ff8c148e112..8b81e1a4358 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterConsumer.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterConsumer.java
@@ -21,6 +21,6 @@ public interface ParameterConsumer {
* @param parameterIndex Index of the parameter
* @param state
*/
- void accept(Object parameter, short parameterIndex, S state);
+ void accept(Object parameter, int parameterIndex, S state);
}
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java
index b973e5a34af..c272ab78db7 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java
@@ -114,7 +114,7 @@ public short getParameterCount() {
@Override
public void forEachParameter(ParameterConsumer action, S state) {
- action.accept(obj, (short) 0, state);
+ action.accept(obj, 0, state);
}
@Override
From 31c41c0c6d270402185f92289972a78ecdf62e17 Mon Sep 17 00:00:00 2001
From: Carter Kozak
Date: Mon, 26 Feb 2018 21:46:10 -0800
Subject: [PATCH 0085/2347] LOG4J2-2253 Update tests
Closes #156
Closes #157
---
.../logging/log4j/message/ReusableParameterizedMessageTest.java | 2 +-
.../apache/logging/log4j/core/async/RingBufferLogEventTest.java | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableParameterizedMessageTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableParameterizedMessageTest.java
index 38f157dce33..d16beb327c9 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableParameterizedMessageTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableParameterizedMessageTest.java
@@ -160,7 +160,7 @@ public void testParameterConsumer() {
final List actual = new LinkedList<>();
msg.forEachParameter(new ParameterConsumer() {
@Override
- public void accept(Object parameter, short parameterIndex, Void state) {
+ public void accept(Object parameter, int parameterIndex, Void state) {
actual.add(parameter);
}
}, null);
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/RingBufferLogEventTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/RingBufferLogEventTest.java
index fdc03d45d4e..1d349216488 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/RingBufferLogEventTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/RingBufferLogEventTest.java
@@ -196,7 +196,7 @@ public void testForEachParameterNothingSet() {
final RingBufferLogEvent evt = new RingBufferLogEvent();
evt.forEachParameter(new ParameterConsumer() {
@Override
- public void accept(Object parameter, short parameterIndex, Void state) {
+ public void accept(Object parameter, int parameterIndex, Void state) {
fail("Should not have been called");
}
}, null);
From 5b9957b926314a08af6944da15fc7ef73de3ed06 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Wed, 28 Feb 2018 17:22:53 -0700
Subject: [PATCH 0086/2347] [LOG4J2-2276] ConcurrentModificationException from
org.apache.logging.log4j.status.StatusLogger.<clinit>(StatusLogger.java:71).
---
.../util/SystemPropertiesPropertySource.java | 19 ++++-
.../SystemPropertiesPropertySourceTest.java | 74 +++++++++++++++++++
src/changes/changes.xml | 8 +-
3 files changed, 96 insertions(+), 5 deletions(-)
create mode 100644 log4j-api/src/test/java/org/apache/logging/log4j/util/SystemPropertiesPropertySourceTest.java
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/SystemPropertiesPropertySource.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/SystemPropertiesPropertySource.java
index af10fb00c44..627b968b59a 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/SystemPropertiesPropertySource.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/SystemPropertiesPropertySource.java
@@ -16,7 +16,8 @@
*/
package org.apache.logging.log4j.util;
-import java.util.Map;
+import java.util.Objects;
+import java.util.Properties;
/**
* PropertySource backed by the current system properties. Other than having a higher priority over normal properties,
@@ -26,17 +27,27 @@
*/
public class SystemPropertiesPropertySource implements PropertySource {
+ private static final int DEFAULT_PRIORITY = 100;
private static final String PREFIX = "log4j2.";
@Override
public int getPriority() {
- return 100;
+ return DEFAULT_PRIORITY;
}
@Override
public void forEach(final BiConsumer action) {
- for (final Map.Entry entry : System.getProperties().entrySet()) {
- action.accept(((String) entry.getKey()), ((String) entry.getValue()));
+ final Properties properties = System.getProperties();
+ // Lock properties only long enough to get a thread-safe SAFE snapshot of its current keys, an array.
+ final Object[] keySet;
+ synchronized (properties) {
+ keySet = properties.keySet().toArray();
+ }
+ // Then traverse for an unknown amount of time.
+ // Some keys may now be absent, in which case, the value is null.
+ for (final Object key : keySet) {
+ final String keyStr = Objects.toString(key, null);
+ action.accept(keyStr, properties.getProperty(keyStr));
}
}
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/SystemPropertiesPropertySourceTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/SystemPropertiesPropertySourceTest.java
new file mode 100644
index 00000000000..8fa41c7619e
--- /dev/null
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/SystemPropertiesPropertySourceTest.java
@@ -0,0 +1,74 @@
+package org.apache.logging.log4j.util;
+
+import java.util.Properties;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+import org.junit.Test;
+
+/*
+ * 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.
+ */
+
+/**
+ * Tests https://issues.apache.org/jira/browse/LOG4J2-2276.
+ */
+public class SystemPropertiesPropertySourceTest {
+
+ private static final int ITERATIONS = 10000;
+
+ /**
+ * Tests avoiding a ConcurrentModificationException. For example:
+ *
+ *
+ * java.util.ConcurrentModificationException
+ * at java.util.Hashtable$Enumerator.next(Hashtable.java:1167)
+ * at org.apache.logging.log4j.util.SystemPropertiesPropertySource.forEach(SystemPropertiesPropertySource.java:38)
+ * at org.apache.logging.log4j.util.SystemPropertiesPropertySourceTest.testMultiThreadedAccess(SystemPropertiesPropertySourceTest.java:47)
+ *
+ * @throws InterruptedException
+ * @throws ExecutionException
+ */
+ @Test
+ public void testMultiThreadedAccess() throws InterruptedException, ExecutionException {
+ ExecutorService threadPool = Executors.newSingleThreadExecutor();
+ try {
+ Future> future = threadPool.submit(new Runnable() {
+
+ @Override
+ public void run() {
+ final Properties properties = System.getProperties();
+ for (int i = 0; i < ITERATIONS; i++) {
+ properties.setProperty("FOO_" + i, "BAR");
+ }
+ }
+ });
+ for (int i = 0; i < ITERATIONS; i++)
+ new SystemPropertiesPropertySource().forEach(new BiConsumer() {
+ @Override
+ public void accept(final String key, final String value) {
+ // nothing
+ }
+ });
+ future.get();
+ } finally {
+ threadPool.shutdown();
+ }
+ }
+
+}
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 63183b67d0d..4a9ec5b64e6 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -87,6 +87,9 @@
Strings::join, when called with [null] returns "null" instead of EMPTY.
+
+
+ ConcurrentModificationException from org.apache.logging.log4j.status.StatusLogger.<clinit>(StatusLogger.java:71).
@@ -265,7 +268,10 @@
Strings::join, when called with [null] returns "null" instead of EMPTY.
-
+
+
+ ConcurrentModificationException from org.apache.logging.log4j.status.StatusLogger.<clinit>(StatusLogger.java:71).
+
From 3795f16769b4ebe33b37c6543fe5f6a2e8d53243 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Wed, 28 Feb 2018 17:33:27 -0700
Subject: [PATCH 0087/2347] Update @since tags for 2.11.0 since there will not
be a 2.10.1.
---
.../logging/log4j/core/appender/db/AbstractDatabaseManager.java | 2 +-
.../apache/logging/log4j/core/appender/nosql/NoSqlAppender.java | 2 +-
.../logging/log4j/core/pattern/EndOfBatchPatternConverter.java | 2 +-
.../logging/log4j/core/pattern/LoggerFqcnPatternConverter.java | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/AbstractDatabaseManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/AbstractDatabaseManager.java
index 7624c5e82c8..0350543ffc6 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/AbstractDatabaseManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/AbstractDatabaseManager.java
@@ -185,7 +185,7 @@ public final synchronized void flush() {
* This method manages buffering and writing of events.
*
* @param event The event to write to the database.
- * @deprecated since 2.10.1 Use {@link #write(LogEvent, Serializable)}.
+ * @deprecated since 2.11.0 Use {@link #write(LogEvent, Serializable)}.
*/
@Deprecated
public final synchronized void write(final LogEvent event) {
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/nosql/NoSqlAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/nosql/NoSqlAppender.java
index aae28ffaaf4..0d23a2ac22c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/nosql/NoSqlAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/nosql/NoSqlAppender.java
@@ -123,7 +123,7 @@ public B setProvider(NoSqlProvider> provider) {
* @param provider
* The NoSQL provider that provides connections to the chosen NoSQL database.
* @return a new NoSQL appender.
- * @deprecated since 2.10.1; use {@link Builder}.
+ * @deprecated since 2.11.0; use {@link Builder}.
*/
@SuppressWarnings("resource")
@Deprecated
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EndOfBatchPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EndOfBatchPatternConverter.java
index a2f95fde1a0..bf627680fb5 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EndOfBatchPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EndOfBatchPatternConverter.java
@@ -23,7 +23,7 @@
/**
* Formats the EndOfBatch.
*
- * @since 2.10.1
+ * @since 2.11.0
*/
@Plugin(name = "EndOfBatchPatternConverter", category = PatternConverter.CATEGORY)
@ConverterKeys({ "endOfBatch" })
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LoggerFqcnPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LoggerFqcnPatternConverter.java
index 9eb429606b7..cba32c96180 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LoggerFqcnPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LoggerFqcnPatternConverter.java
@@ -23,7 +23,7 @@
/**
* Formats the Logger FQCN.
*
- * @since 2.10.1
+ * @since 2.11.0
*/
@Plugin(name = "LoggerFqcnPatternConverter", category = PatternConverter.CATEGORY)
@ConverterKeys({ "fqcn" })
From f2789da8f5a441718bfb56be8d90870cad628dbe Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Thu, 1 Mar 2018 08:32:05 -0700
Subject: [PATCH 0088/2347] [LOG4J2-2274] Allow EnvironmentPropertySource to
run with a SecurityManager that rejects environment variable access.
---
.../log4j/util/EnvironmentPropertySource.java | 25 ++++--
...mentPropertySourceSecurityManagerTest.java | 76 +++++++++++++++++++
src/changes/changes.xml | 6 ++
3 files changed, 100 insertions(+), 7 deletions(-)
create mode 100644 log4j-core/src/test/java/org/apache/logging/log4j/util/EnvironmentPropertySourceSecurityManagerTest.java
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/EnvironmentPropertySource.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/EnvironmentPropertySource.java
index af8c23e20fa..40aa76bb16f 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/EnvironmentPropertySource.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/EnvironmentPropertySource.java
@@ -19,24 +19,35 @@
import java.util.Map;
/**
- * PropertySource implementation that uses environment variables as a source. All environment variables must begin
- * with {@code LOG4J_} so as not to conflict with other variables. Normalized environment variables follow a scheme
- * like this: {@code log4j2.fooBarProperty} would normalize to {@code LOG4J_FOO_BAR_PROPERTY}.
+ * PropertySource implementation that uses environment variables as a source. All environment variables must begin with
+ * {@code LOG4J_} so as not to conflict with other variables. Normalized environment variables follow a scheme like
+ * this: {@code log4j2.fooBarProperty} would normalize to {@code LOG4J_FOO_BAR_PROPERTY}.
*
* @since 2.10.0
*/
public class EnvironmentPropertySource implements PropertySource {
+
+ private static final String PREFIX = "LOG4J_";
+ private static final int DEFAULT_PRIORITY = -100;
+
@Override
public int getPriority() {
- return -100;
+ return DEFAULT_PRIORITY;
}
@Override
public void forEach(final BiConsumer action) {
- for (final Map.Entry entry : System.getenv().entrySet()) {
+ final Map getenv;
+ try {
+ getenv = System.getenv();
+ } catch (SecurityException e) {
+ // There is no status logger yet.
+ return;
+ }
+ for (final Map.Entry entry : getenv.entrySet()) {
final String key = entry.getKey();
- if (key.startsWith("LOG4J_")) {
- action.accept(key.substring(6), entry.getValue());
+ if (key.startsWith(PREFIX)) {
+ action.accept(key.substring(PREFIX.length()), entry.getValue());
}
}
}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/util/EnvironmentPropertySourceSecurityManagerTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/util/EnvironmentPropertySourceSecurityManagerTest.java
new file mode 100644
index 00000000000..f85d640a2f1
--- /dev/null
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/util/EnvironmentPropertySourceSecurityManagerTest.java
@@ -0,0 +1,76 @@
+/*
+ * 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.util;
+
+import java.security.Permission;
+
+import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Tests https://issues.apache.org/jira/browse/LOG4J2-2274.
+ *
+ * @see EnvironmentPropertySource
+ * @see SecurityManager
+ * @see System#setSecurityManager(SecurityManager)
+ */
+public class EnvironmentPropertySourceSecurityManagerTest {
+
+ /**
+ * Always throws a SecurityException for any environment variables permission check.
+ */
+ private class TestSecurityManager extends SecurityManager {
+ @Override
+ public void checkPermission(Permission permission) {
+ if ("getenv.*".equals(permission.getName())) {
+ throw new SecurityException();
+ }
+ }
+ }
+
+ /**
+ * Makes sure we do not blow up with exception below due to a security manager rejecting environment variable access
+ * in {@link EnvironmentPropertySource}.
+ *
+ *
+ * java.lang.NoClassDefFoundError: Could not initialize class org.apache.logging.log4j.util.PropertiesUtil
+ * at org.apache.logging.log4j.status.StatusLogger.(StatusLogger.java:78)
+ * at org.apache.logging.log4j.core.AbstractLifeCycle.(AbstractLifeCycle.java:38)
+ * at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
+ * at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
+ * at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
+ * at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
+ * at org.apache.logging.log4j.core.config.builder.impl.DefaultConfigurationBuilder.build(DefaultConfigurationBuilder.java:172)
+ * at org.apache.logging.log4j.core.config.builder.impl.DefaultConfigurationBuilder.build(DefaultConfigurationBuilder.java:161)
+ * at org.apache.logging.log4j.core.config.builder.impl.DefaultConfigurationBuilder.build(DefaultConfigurationBuilder.java:1)
+ * at org.apache.logging.log4j.util.EnvironmentPropertySourceSecurityManagerTest.test(EnvironmentPropertySourceSecurityManagerTest.java:55)
+ *
+ */
+ @Test
+ public void test() {
+ try {
+ SecurityManager securityManager = new TestSecurityManager();
+ System.setSecurityManager(securityManager);
+ } catch (SecurityException se) {
+ // The SecurityManager is already set
+ }
+
+ Assert.assertNotNull(ConfigurationBuilderFactory.newConfigurationBuilder().build());
+ }
+}
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 4a9ec5b64e6..b8c739ee2bf 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -91,6 +91,9 @@
ConcurrentModificationException from org.apache.logging.log4j.status.StatusLogger.<clinit>(StatusLogger.java:71).
+
+ Allow EnvironmentPropertySource to run with a SecurityManager that rejects environment variable access.
+
@@ -272,6 +275,9 @@
ConcurrentModificationException from org.apache.logging.log4j.status.StatusLogger.<clinit>(StatusLogger.java:71).
+
+ Allow EnvironmentPropertySource to run with a SecurityManager that rejects environment variable access.
+
From beadd21ddc3b1e903193ee9b45a12e583c53dad2 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Thu, 1 Mar 2018 11:04:52 -0700
Subject: [PATCH 0089/2347] [LOG4J2-2279] Allow SystemPropertiesPropertySource
to run with a SecurityManager that rejects system property access.
---
.../log4j/util/EnvironmentPropertySource.java | 77 +++++++++--------
.../util/SystemPropertiesPropertySource.java | 66 ++++++++------
.../log4j/junit/SecurityManagerTestRule.java | 70 +++++++++++++++
...onmentPropertySourceSecurityManagerIT.java | 78 +++++++++++++++++
...tyFilePropertySourceSecurityManagerIT.java | 79 +++++++++++++++++
...ertiesPropertySourceSecurityManagerIT.java | 86 +++++++++++++++++++
...mentPropertySourceSecurityManagerTest.java | 76 ----------------
7 files changed, 393 insertions(+), 139 deletions(-)
create mode 100644 log4j-api/src/test/java/org/apache/logging/log4j/junit/SecurityManagerTestRule.java
create mode 100644 log4j-api/src/test/java/org/apache/logging/log4j/util/EnvironmentPropertySourceSecurityManagerIT.java
create mode 100644 log4j-api/src/test/java/org/apache/logging/log4j/util/PropertyFilePropertySourceSecurityManagerIT.java
create mode 100644 log4j-api/src/test/java/org/apache/logging/log4j/util/SystemPropertiesPropertySourceSecurityManagerIT.java
delete mode 100644 log4j-core/src/test/java/org/apache/logging/log4j/util/EnvironmentPropertySourceSecurityManagerTest.java
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/EnvironmentPropertySource.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/EnvironmentPropertySource.java
index 40aa76bb16f..f2ef0df9986 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/EnvironmentPropertySource.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/EnvironmentPropertySource.java
@@ -19,48 +19,53 @@
import java.util.Map;
/**
- * PropertySource implementation that uses environment variables as a source. All environment variables must begin with
- * {@code LOG4J_} so as not to conflict with other variables. Normalized environment variables follow a scheme like
- * this: {@code log4j2.fooBarProperty} would normalize to {@code LOG4J_FOO_BAR_PROPERTY}.
+ * PropertySource implementation that uses environment variables as a source.
+ * All environment variables must begin with {@code LOG4J_} so as not to
+ * conflict with other variables. Normalized environment variables follow a
+ * scheme like this: {@code log4j2.fooBarProperty} would normalize to
+ * {@code LOG4J_FOO_BAR_PROPERTY}.
*
* @since 2.10.0
*/
public class EnvironmentPropertySource implements PropertySource {
- private static final String PREFIX = "LOG4J_";
- private static final int DEFAULT_PRIORITY = -100;
+ private static final String PREFIX = "LOG4J_";
+ private static final int DEFAULT_PRIORITY = -100;
- @Override
- public int getPriority() {
- return DEFAULT_PRIORITY;
- }
+ @Override
+ public int getPriority() {
+ return DEFAULT_PRIORITY;
+ }
- @Override
- public void forEach(final BiConsumer action) {
- final Map getenv;
- try {
- getenv = System.getenv();
- } catch (SecurityException e) {
- // There is no status logger yet.
- return;
- }
- for (final Map.Entry entry : getenv.entrySet()) {
- final String key = entry.getKey();
- if (key.startsWith(PREFIX)) {
- action.accept(key.substring(PREFIX.length()), entry.getValue());
- }
- }
- }
+ @Override
+ public void forEach(final BiConsumer action) {
+ final Map getenv;
+ try {
+ getenv = System.getenv();
+ } catch (final SecurityException e) {
+ // There is no status logger yet.
+ LowLevelLogUtil.logException(
+ "The system environment variables are not available to Log4j due to security restrictions: " + e,
+ e);
+ return;
+ }
+ for (final Map.Entry entry : getenv.entrySet()) {
+ final String key = entry.getKey();
+ if (key.startsWith(PREFIX)) {
+ action.accept(key.substring(PREFIX.length()), entry.getValue());
+ }
+ }
+ }
- @Override
- public CharSequence getNormalForm(final Iterable extends CharSequence> tokens) {
- final StringBuilder sb = new StringBuilder("LOG4J");
- for (final CharSequence token : tokens) {
- sb.append('_');
- for (int i = 0; i < token.length(); i++) {
- sb.append(Character.toUpperCase(token.charAt(i)));
- }
- }
- return sb.toString();
- }
+ @Override
+ public CharSequence getNormalForm(final Iterable extends CharSequence> tokens) {
+ final StringBuilder sb = new StringBuilder("LOG4J");
+ for (final CharSequence token : tokens) {
+ sb.append('_');
+ for (int i = 0; i < token.length(); i++) {
+ sb.append(Character.toUpperCase(token.charAt(i)));
+ }
+ }
+ return sb.toString();
+ }
}
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/SystemPropertiesPropertySource.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/SystemPropertiesPropertySource.java
index 627b968b59a..2509cd1e195 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/SystemPropertiesPropertySource.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/SystemPropertiesPropertySource.java
@@ -20,40 +20,52 @@
import java.util.Properties;
/**
- * PropertySource backed by the current system properties. Other than having a higher priority over normal properties,
- * this follows the same rules as {@link PropertiesPropertySource}.
+ * PropertySource backed by the current system properties. Other than having a
+ * higher priority over normal properties, this follows the same rules as
+ * {@link PropertiesPropertySource}.
*
* @since 2.10.0
*/
public class SystemPropertiesPropertySource implements PropertySource {
- private static final int DEFAULT_PRIORITY = 100;
- private static final String PREFIX = "log4j2.";
+ private static final int DEFAULT_PRIORITY = 100;
+ private static final String PREFIX = "log4j2.";
- @Override
- public int getPriority() {
- return DEFAULT_PRIORITY;
- }
+ @Override
+ public int getPriority() {
+ return DEFAULT_PRIORITY;
+ }
- @Override
- public void forEach(final BiConsumer action) {
- final Properties properties = System.getProperties();
- // Lock properties only long enough to get a thread-safe SAFE snapshot of its current keys, an array.
- final Object[] keySet;
- synchronized (properties) {
- keySet = properties.keySet().toArray();
- }
- // Then traverse for an unknown amount of time.
- // Some keys may now be absent, in which case, the value is null.
- for (final Object key : keySet) {
- final String keyStr = Objects.toString(key, null);
- action.accept(keyStr, properties.getProperty(keyStr));
- }
- }
+ @Override
+ public void forEach(final BiConsumer action) {
+ Properties properties;
+ try {
+ properties = System.getProperties();
+ } catch (final SecurityException e) {
+ // (1) There is no status logger.
+ // (2) LowLevelLogUtil also consults system properties ("line.separator") to
+ // open a BufferedWriter, so this may fail as well. Just having a hard reference
+ // in this code to LowLevelLogUtil would cause a problem.
+ // (3) We could log to System.err (nah) or just be quiet as we do now.
+ return;
+ }
+ // Lock properties only long enough to get a thread-safe SAFE snapshot of its
+ // current keys, an array.
+ final Object[] keySet;
+ synchronized (properties) {
+ keySet = properties.keySet().toArray();
+ }
+ // Then traverse for an unknown amount of time.
+ // Some keys may now be absent, in which case, the value is null.
+ for (final Object key : keySet) {
+ final String keyStr = Objects.toString(key, null);
+ action.accept(keyStr, properties.getProperty(keyStr));
+ }
+ }
- @Override
- public CharSequence getNormalForm(final Iterable extends CharSequence> tokens) {
- return PREFIX + Util.joinAsCamelCase(tokens);
- }
+ @Override
+ public CharSequence getNormalForm(final Iterable extends CharSequence> tokens) {
+ return PREFIX + Util.joinAsCamelCase(tokens);
+ }
}
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/junit/SecurityManagerTestRule.java b/log4j-api/src/test/java/org/apache/logging/log4j/junit/SecurityManagerTestRule.java
new file mode 100644
index 00000000000..311b817bc99
--- /dev/null
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/junit/SecurityManagerTestRule.java
@@ -0,0 +1,70 @@
+/*
+ * 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.junit;
+
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
+
+/**
+ * Sets a security manager for a test run. The current security manager is first
+ * saved then restored after the test is run.
+ *
+ * Using a security manager can mess up other tests so this is best used from
+ * integration tests (classes that end in "IT" instead of "Test" and
+ * "TestCase".)
+ *
+ *
+ * @since 2.11.0
+ */
+public class SecurityManagerTestRule implements TestRule {
+
+ public SecurityManagerTestRule(final SecurityManager securityManager) {
+ super();
+ this.securityManager = securityManager;
+ }
+
+ private SecurityManager securityManagerBefore;
+ private final SecurityManager securityManager;
+
+ @Override
+ public Statement apply(final Statement base, final Description description) {
+ return new Statement() {
+ @Override
+ public void evaluate() throws Throwable {
+ before();
+ try {
+ base.evaluate();
+ } finally {
+ after();
+ }
+ }
+
+ private void after() {
+ System.setSecurityManager(securityManagerBefore);
+ }
+
+ private void before() {
+ securityManagerBefore = System.getSecurityManager();
+ System.setSecurityManager(securityManager);
+
+ }
+ };
+ }
+
+}
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/EnvironmentPropertySourceSecurityManagerIT.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/EnvironmentPropertySourceSecurityManagerIT.java
new file mode 100644
index 00000000000..0020c057e3b
--- /dev/null
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/EnvironmentPropertySourceSecurityManagerIT.java
@@ -0,0 +1,78 @@
+/*
+ * 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.util;
+
+import java.security.Permission;
+
+import org.apache.logging.log4j.junit.SecurityManagerTestRule;
+import org.junit.Rule;
+import org.junit.Test;
+
+/**
+ * Tests https://issues.apache.org/jira/browse/LOG4J2-2274.
+ *
+ * Using a security manager can mess up other tests so this is best used from
+ * integration tests (classes that end in "IT" instead of "Test" and
+ * "TestCase".)
+ *
+ *
+ * @see EnvironmentPropertySource
+ * @see SecurityManager
+ * @see System#setSecurityManager(SecurityManager)
+ */
+public class EnvironmentPropertySourceSecurityManagerIT {
+
+ @Rule
+ public final SecurityManagerTestRule rule = new SecurityManagerTestRule(new TestSecurityManager());
+
+ /**
+ * Always throws a SecurityException for any environment variables permission
+ * check.
+ */
+ private class TestSecurityManager extends SecurityManager {
+ @Override
+ public void checkPermission(final Permission permission) {
+ if ("getenv.*".equals(permission.getName())) {
+ throw new SecurityException();
+ }
+ }
+ }
+
+ /**
+ * Makes sure we do not blow up with exception below due to a security manager
+ * rejecting environment variable access in {@link EnvironmentPropertySource}.
+ *
+ *
+ * java.lang.NoClassDefFoundError: Could not initialize class org.apache.logging.log4j.util.PropertiesUtil
+ * at org.apache.logging.log4j.status.StatusLogger.(StatusLogger.java:78)
+ * at org.apache.logging.log4j.core.AbstractLifeCycle.(AbstractLifeCycle.java:38)
+ * at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
+ * at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
+ * at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
+ * at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
+ * at org.apache.logging.log4j.core.config.builder.impl.DefaultConfigurationBuilder.build(DefaultConfigurationBuilder.java:172)
+ * at org.apache.logging.log4j.core.config.builder.impl.DefaultConfigurationBuilder.build(DefaultConfigurationBuilder.java:161)
+ * at org.apache.logging.log4j.core.config.builder.impl.DefaultConfigurationBuilder.build(DefaultConfigurationBuilder.java:1)
+ * at org.apache.logging.log4j.util.EnvironmentPropertySourceSecurityManagerTest.test(EnvironmentPropertySourceSecurityManagerTest.java:55)
+ *
+ */
+ @Test
+ public void test() {
+ PropertiesUtil.getProperties();
+ }
+}
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/PropertyFilePropertySourceSecurityManagerIT.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/PropertyFilePropertySourceSecurityManagerIT.java
new file mode 100644
index 00000000000..a6679d66823
--- /dev/null
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/PropertyFilePropertySourceSecurityManagerIT.java
@@ -0,0 +1,79 @@
+/*
+ * 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.util;
+
+import java.io.FilePermission;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.security.Permission;
+import java.util.PropertyPermission;
+
+import org.apache.logging.log4j.junit.SecurityManagerTestRule;
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+
+/**
+ * Test related to https://issues.apache.org/jira/browse/LOG4J2-2274.
+ *
+ * Using a security manager can mess up other tests so this is best used from
+ * integration tests (classes that end in "IT" instead of "Test" and
+ * "TestCase".)
+ *
+ *
+ * @see PropertyFilePropertySource
+ * @see SecurityManager
+ * @see System#setSecurityManager(SecurityManager)
+ * @see PropertyPermission
+ */
+public class PropertyFilePropertySourceSecurityManagerIT {
+
+ @Rule
+ public final SecurityManagerTestRule rule = new SecurityManagerTestRule(new TestSecurityManager());
+
+ private static final String TEST_FIXTURE_PATH = "src/test/resources/PropertiesUtilTest.properties";
+
+ /**
+ * Always throws a SecurityException for any environment variables permission
+ * check.
+ */
+ private class TestSecurityManager extends SecurityManager {
+
+ @Override
+ public void checkPermission(Permission permission) {
+ if (permission instanceof FilePermission && permission.getName().endsWith(TEST_FIXTURE_PATH)) {
+ throw new SecurityException();
+ }
+ }
+ }
+
+ /**
+ * Makes sure we do not blow up with exception below due to a security manager
+ * rejecting environment variable access in
+ * {@link SystemPropertiesPropertySource}.
+ *
+ *
+ *
+ */
+ @Test
+ public void test() {
+ Assert.assertTrue(TEST_FIXTURE_PATH, Files.exists(Paths.get(TEST_FIXTURE_PATH)));
+ PropertiesUtil propertiesUtil = new PropertiesUtil(TEST_FIXTURE_PATH);
+ Assert.assertEquals(null, propertiesUtil.getStringProperty("a.1"));
+ }
+}
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/SystemPropertiesPropertySourceSecurityManagerIT.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/SystemPropertiesPropertySourceSecurityManagerIT.java
new file mode 100644
index 00000000000..ebab7100d5a
--- /dev/null
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/SystemPropertiesPropertySourceSecurityManagerIT.java
@@ -0,0 +1,86 @@
+/*
+ * 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.util;
+
+import java.security.Permission;
+import java.util.PropertyPermission;
+
+import org.apache.logging.log4j.junit.SecurityManagerTestRule;
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+
+/**
+ * Test related to https://issues.apache.org/jira/browse/LOG4J2-2274.
+ *
+ * Using a security manager can mess up other tests so this is best used from
+ * integration tests (classes that end in "IT" instead of "Test" and
+ * "TestCase".)
+ *
+ *
+ * @see SystemPropertiesPropertySource
+ * @see SecurityManager
+ * @see System#setSecurityManager(SecurityManager)
+ * @see PropertyPermission
+ */
+public class SystemPropertiesPropertySourceSecurityManagerIT {
+
+ @Rule
+ public final SecurityManagerTestRule rule = new SecurityManagerTestRule(new TestSecurityManager());
+
+ /**
+ * Always throws a SecurityException for any environment variables permission
+ * check.
+ */
+ private class TestSecurityManager extends SecurityManager {
+ @Override
+ public void checkPermission(final Permission permission) {
+ if (permission instanceof PropertyPermission) {
+ throw new SecurityException();
+ }
+ }
+ }
+
+ /**
+ * Makes sure we do not blow up with exception below due to a security manager
+ * rejecting environment variable access in
+ * {@link SystemPropertiesPropertySource}.
+ *
+ *
+ * java.lang.ExceptionInInitializerError
+ * at org.apache.logging.log4j.util.SystemPropertiesPropertySourceSecurityManagerTest.test(SystemPropertiesPropertySourceSecurityManagerTest.java:64)
+ * ...
+ * Caused by: java.lang.SecurityException
+ * at org.apache.logging.log4j.util.SystemPropertiesPropertySourceSecurityManagerTest$TestSecurityManager.checkPermission(SystemPropertiesPropertySourceSecurityManagerTest.java:49)
+ * at java.lang.SecurityManager.checkPropertiesAccess(SecurityManager.java:1265)
+ * at java.lang.System.getProperties(System.java:624)
+ * at org.apache.logging.log4j.util.SystemPropertiesPropertySource.forEach(SystemPropertiesPropertySource.java:40)
+ * at org.apache.logging.log4j.util.PropertiesUtil$Environment.reload(PropertiesUtil.java:330)
+ * at org.apache.logging.log4j.util.PropertiesUtil$Environment.(PropertiesUtil.java:322)
+ * at org.apache.logging.log4j.util.PropertiesUtil$Environment.(PropertiesUtil.java:310)
+ * at org.apache.logging.log4j.util.PropertiesUtil.(PropertiesUtil.java:69)
+ * at org.apache.logging.log4j.util.PropertiesUtil.(PropertiesUtil.java:49)
+ * ... 26 more
+ *
+ */
+ @Test
+ public void test() {
+ final PropertiesUtil propertiesUtil = new PropertiesUtil("src/test/resources/PropertiesUtilTest.properties");
+ Assert.assertEquals(null, propertiesUtil.getStringProperty("a.1"));
+ }
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/util/EnvironmentPropertySourceSecurityManagerTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/util/EnvironmentPropertySourceSecurityManagerTest.java
deleted file mode 100644
index f85d640a2f1..00000000000
--- a/log4j-core/src/test/java/org/apache/logging/log4j/util/EnvironmentPropertySourceSecurityManagerTest.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * 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.util;
-
-import java.security.Permission;
-
-import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- * Tests https://issues.apache.org/jira/browse/LOG4J2-2274.
- *
- * @see EnvironmentPropertySource
- * @see SecurityManager
- * @see System#setSecurityManager(SecurityManager)
- */
-public class EnvironmentPropertySourceSecurityManagerTest {
-
- /**
- * Always throws a SecurityException for any environment variables permission check.
- */
- private class TestSecurityManager extends SecurityManager {
- @Override
- public void checkPermission(Permission permission) {
- if ("getenv.*".equals(permission.getName())) {
- throw new SecurityException();
- }
- }
- }
-
- /**
- * Makes sure we do not blow up with exception below due to a security manager rejecting environment variable access
- * in {@link EnvironmentPropertySource}.
- *
- *
- * java.lang.NoClassDefFoundError: Could not initialize class org.apache.logging.log4j.util.PropertiesUtil
- * at org.apache.logging.log4j.status.StatusLogger.(StatusLogger.java:78)
- * at org.apache.logging.log4j.core.AbstractLifeCycle.(AbstractLifeCycle.java:38)
- * at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
- * at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
- * at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
- * at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
- * at org.apache.logging.log4j.core.config.builder.impl.DefaultConfigurationBuilder.build(DefaultConfigurationBuilder.java:172)
- * at org.apache.logging.log4j.core.config.builder.impl.DefaultConfigurationBuilder.build(DefaultConfigurationBuilder.java:161)
- * at org.apache.logging.log4j.core.config.builder.impl.DefaultConfigurationBuilder.build(DefaultConfigurationBuilder.java:1)
- * at org.apache.logging.log4j.util.EnvironmentPropertySourceSecurityManagerTest.test(EnvironmentPropertySourceSecurityManagerTest.java:55)
- *
- */
- @Test
- public void test() {
- try {
- SecurityManager securityManager = new TestSecurityManager();
- System.setSecurityManager(securityManager);
- } catch (SecurityException se) {
- // The SecurityManager is already set
- }
-
- Assert.assertNotNull(ConfigurationBuilderFactory.newConfigurationBuilder().build());
- }
-}
From d0049ceb2b3778e377fe13ecda0ba406fb475877 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Thu, 1 Mar 2018 11:05:35 -0700
Subject: [PATCH 0090/2347] [LOG4J2-2279] Allow SystemPropertiesPropertySource
to run with a SecurityManager that rejects system property access.
---
src/changes/changes.xml | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index b8c739ee2bf..512291dabce 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -94,6 +94,9 @@
Allow EnvironmentPropertySource to run with a SecurityManager that rejects environment variable access.
+
+ Allow SystemPropertiesPropertySource to run with a SecurityManager that rejects system property access.
+
@@ -278,6 +281,9 @@
Allow EnvironmentPropertySource to run with a SecurityManager that rejects environment variable access.
+
+ Allow SystemPropertiesPropertySource to run with a SecurityManager that rejects system property access.
+
From 33af8889ce67a54bde32241d87f2f0e54a7c32c8 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Thu, 1 Mar 2018 12:18:27 -0700
Subject: [PATCH 0091/2347] [LOG4J2-2279] Allow SystemPropertiesPropertySource
to run with a SecurityManager that rejects system property access. This test
passes for me on Windows 10 but fails on Jenkins. Reorder a sanity check so
that it takes place before the SecurityManager test rule is evaluated.
---
...tyFilePropertySourceSecurityManagerIT.java | 63 ++++++++++---------
1 file changed, 34 insertions(+), 29 deletions(-)
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/PropertyFilePropertySourceSecurityManagerIT.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/PropertyFilePropertySourceSecurityManagerIT.java
index a6679d66823..c0c51349399 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/util/PropertyFilePropertySourceSecurityManagerIT.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/PropertyFilePropertySourceSecurityManagerIT.java
@@ -25,6 +25,7 @@
import org.apache.logging.log4j.junit.SecurityManagerTestRule;
import org.junit.Assert;
+import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
@@ -43,37 +44,41 @@
*/
public class PropertyFilePropertySourceSecurityManagerIT {
- @Rule
- public final SecurityManagerTestRule rule = new SecurityManagerTestRule(new TestSecurityManager());
+ @BeforeClass
+ public static void beforeClass() {
+ Assert.assertTrue(TEST_FIXTURE_PATH, Files.exists(Paths.get(TEST_FIXTURE_PATH)));
+ }
+
+ @Rule
+ public final SecurityManagerTestRule rule = new SecurityManagerTestRule(new TestSecurityManager());
- private static final String TEST_FIXTURE_PATH = "src/test/resources/PropertiesUtilTest.properties";
+ private static final String TEST_FIXTURE_PATH = "src/test/resources/PropertiesUtilTest.properties";
- /**
- * Always throws a SecurityException for any environment variables permission
- * check.
- */
- private class TestSecurityManager extends SecurityManager {
+ /**
+ * Always throws a SecurityException for any environment variables permission
+ * check.
+ */
+ private class TestSecurityManager extends SecurityManager {
- @Override
- public void checkPermission(Permission permission) {
- if (permission instanceof FilePermission && permission.getName().endsWith(TEST_FIXTURE_PATH)) {
- throw new SecurityException();
- }
- }
- }
+ @Override
+ public void checkPermission(final Permission permission) {
+ if (permission instanceof FilePermission && permission.getName().endsWith(TEST_FIXTURE_PATH)) {
+ throw new SecurityException();
+ }
+ }
+ }
- /**
- * Makes sure we do not blow up with exception below due to a security manager
- * rejecting environment variable access in
- * {@link SystemPropertiesPropertySource}.
- *
- *
- *
- */
- @Test
- public void test() {
- Assert.assertTrue(TEST_FIXTURE_PATH, Files.exists(Paths.get(TEST_FIXTURE_PATH)));
- PropertiesUtil propertiesUtil = new PropertiesUtil(TEST_FIXTURE_PATH);
- Assert.assertEquals(null, propertiesUtil.getStringProperty("a.1"));
- }
+ /**
+ * Makes sure we do not blow up with exception below due to a security manager
+ * rejecting environment variable access in
+ * {@link SystemPropertiesPropertySource}.
+ *
+ *
+ *
+ */
+ @Test
+ public void test() {
+ final PropertiesUtil propertiesUtil = new PropertiesUtil(TEST_FIXTURE_PATH);
+ Assert.assertEquals(null, propertiesUtil.getStringProperty("a.1"));
+ }
}
From 5749450151cc0f3fc4179540e658a2b9faf0b467 Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Thu, 1 Mar 2018 12:47:30 -0700
Subject: [PATCH 0092/2347] Now that we are on Java 8, we do not need to keep
the test set up that allowed for MongoDB tests to be disabled if not running
on Java 8. This was due to the dependency on Java 8 of the MongoDB test
framework we use.
---
.../logging/log4j/mongodb2/Java8Test.java | 48 -------------------
...Java8.java => MongoDbAuthFailureTest.java} | 2 +-
...dTestJava8.java => MongoDbCappedTest.java} | 2 +-
...tJava8.java => MongoDbMapMessageTest.java} | 2 +-
...MongoDbTestJava8.java => MongoDbTest.java} | 2 +-
...ava8.java => MongoDbTestTestRuleTest.java} | 2 +-
.../logging/log4j/mongodb3/Java8Test.java | 48 -------------------
...Java8.java => MongoDbAuthFailureTest.java} | 4 +-
...dTestJava8.java => MongoDbCappedTest.java} | 4 +-
...tJava8.java => MongoDbMapMessageTest.java} | 4 +-
...MongoDbTestJava8.java => MongoDbTest.java} | 4 +-
...ava8.java => MongoDbTestTestRuleTest.java} | 4 +-
12 files changed, 15 insertions(+), 111 deletions(-)
delete mode 100644 log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/Java8Test.java
rename log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/{MongoDbAuthFailureTestJava8.java => MongoDbAuthFailureTest.java} (98%)
rename log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/{MongoDbCappedTestJava8.java => MongoDbCappedTest.java} (98%)
rename log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/{MongoDbMapMessageTestJava8.java => MongoDbMapMessageTest.java} (98%)
rename log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/{MongoDbTestJava8.java => MongoDbTest.java} (98%)
rename log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/{MongoDbTestTestRuleTestJava8.java => MongoDbTestTestRuleTest.java} (98%)
delete mode 100644 log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/Java8Test.java
rename log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/{MongoDbAuthFailureTestJava8.java => MongoDbAuthFailureTest.java} (96%)
rename log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/{MongoDbCappedTestJava8.java => MongoDbCappedTest.java} (96%)
rename log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/{MongoDbMapMessageTestJava8.java => MongoDbMapMessageTest.java} (96%)
rename log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/{MongoDbTestJava8.java => MongoDbTest.java} (97%)
rename log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/{MongoDbTestTestRuleTestJava8.java => MongoDbTestTestRuleTest.java} (96%)
diff --git a/log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/Java8Test.java b/log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/Java8Test.java
deleted file mode 100644
index 569cf4a0284..00000000000
--- a/log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/Java8Test.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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.mongodb2;
-
-import org.apache.commons.lang3.JavaVersion;
-import org.apache.commons.lang3.SystemUtils;
-import org.junit.Assume;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-
-/**
- * Runs all MongoDB only on Java 8.
- *
- * The test framework {@code de.flapdoodle.embed.mongo} requires Java 8.
- *
- */
-@RunWith(Suite.class)
-@Suite.SuiteClasses({ MongoDbTestTestRuleTestJava8.class, MongoDbAuthFailureTestJava8.class, MongoDbCappedTestJava8.class,
- MongoDbMapMessageTestJava8.class, MongoDbTestJava8.class })
-public class Java8Test {
-
- @BeforeClass
- public static void beforeClass() {
- Assume.assumeTrue(SystemUtils.JAVA_VERSION, SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_1_8));
- }
-
- @Test
- public void test() {
- // noop
- }
-}
diff --git a/log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbAuthFailureTestJava8.java b/log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbAuthFailureTest.java
similarity index 98%
rename from log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbAuthFailureTestJava8.java
rename to log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbAuthFailureTest.java
index 0d970f79f4a..0fb61c62af6 100644
--- a/log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbAuthFailureTestJava8.java
+++ b/log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbAuthFailureTest.java
@@ -41,7 +41,7 @@
*/
@Ignore("TODO Set up the log4j user in MongoDB")
@Category(Appenders.MongoDb.class)
-public class MongoDbAuthFailureTestJava8 {
+public class MongoDbAuthFailureTest {
private static LoggerContextRule loggerContextTestRule = new LoggerContextRule("log4j2-mongodb-auth-failure.xml");
diff --git a/log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbCappedTestJava8.java b/log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbCappedTest.java
similarity index 98%
rename from log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbCappedTestJava8.java
rename to log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbCappedTest.java
index 03e463a2eb1..ffd368a02e2 100644
--- a/log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbCappedTestJava8.java
+++ b/log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbCappedTest.java
@@ -38,7 +38,7 @@
* This class name does NOT end in "Test" in order to only be picked up by {@link Java8Test}.
*/
@Category(Appenders.MongoDb.class)
-public class MongoDbCappedTestJava8 {
+public class MongoDbCappedTest {
private static LoggerContextRule loggerContextTestRule = new LoggerContextRule("log4j2-mongodb-capped.xml");
diff --git a/log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbMapMessageTestJava8.java b/log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbMapMessageTest.java
similarity index 98%
rename from log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbMapMessageTestJava8.java
rename to log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbMapMessageTest.java
index f18e7ba9a1f..99350aa1bb7 100644
--- a/log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbMapMessageTestJava8.java
+++ b/log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbMapMessageTest.java
@@ -39,7 +39,7 @@
* This class name does NOT end in "Test" in order to only be picked up by {@link Java8Test}.
*/
@Category(Appenders.MongoDb.class)
-public class MongoDbMapMessageTestJava8 {
+public class MongoDbMapMessageTest {
private static LoggerContextRule loggerContextTestRule = new LoggerContextRule("log4j2-mongodb-map-message.xml");
diff --git a/log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbTestJava8.java b/log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbTest.java
similarity index 98%
rename from log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbTestJava8.java
rename to log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbTest.java
index 0e2661086a0..2a73f8c4eb5 100644
--- a/log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbTestJava8.java
+++ b/log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbTest.java
@@ -38,7 +38,7 @@
* This class name does NOT end in "Test" in order to only be picked up by {@link Java8Test}.
*/
@Category(Appenders.MongoDb.class)
-public class MongoDbTestJava8 {
+public class MongoDbTest {
private static LoggerContextRule loggerContextTestRule = new LoggerContextRule("log4j2-mongodb.xml");
diff --git a/log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbTestTestRuleTestJava8.java b/log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbTestTestRuleTest.java
similarity index 98%
rename from log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbTestTestRuleTestJava8.java
rename to log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbTestTestRuleTest.java
index 3d8b35503d6..68e9782f51e 100644
--- a/log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbTestTestRuleTestJava8.java
+++ b/log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbTestTestRuleTest.java
@@ -37,7 +37,7 @@
* The test framework {@code de.flapdoodle.embed.mongo} requires Java 8.
*
*/
-public class MongoDbTestTestRuleTestJava8 {
+public class MongoDbTestTestRuleTest {
private static final AvailablePortSystemPropertyTestRule mongoDbPortTestRule = AvailablePortSystemPropertyTestRule
.create(TestConstants.SYS_PROP_NAME_PORT);
diff --git a/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/Java8Test.java b/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/Java8Test.java
deleted file mode 100644
index 71acc293fdf..00000000000
--- a/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/Java8Test.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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.mongodb3;
-
-import org.apache.commons.lang3.JavaVersion;
-import org.apache.commons.lang3.SystemUtils;
-import org.junit.Assume;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-
-/**
- * Runs all MongoDB only on Java 8.
- *
- * The test framework {@code de.flapdoodle.embed.mongo} requires Java 8.
- *
- */
-@RunWith(Suite.class)
-@Suite.SuiteClasses({ MongoDbTestTestRuleTestJava8.class, MongoDbAuthFailureTestJava8.class, MongoDbCappedTestJava8.class,
- MongoDbMapMessageTestJava8.class, MongoDbTestJava8.class })
-public class Java8Test {
-
- @BeforeClass
- public static void beforeClass() {
- Assume.assumeTrue(SystemUtils.JAVA_VERSION, SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_1_8));
- }
-
- @Test
- public void test() {
- // noop
- }
-}
diff --git a/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbAuthFailureTestJava8.java b/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbAuthFailureTest.java
similarity index 96%
rename from log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbAuthFailureTestJava8.java
rename to log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbAuthFailureTest.java
index 6361a442edf..19a45c86763 100644
--- a/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbAuthFailureTestJava8.java
+++ b/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbAuthFailureTest.java
@@ -42,7 +42,7 @@
*/
@Ignore("TODO Set up the log4j user in MongoDB")
@Category(Appenders.MongoDb.class)
-public class MongoDbAuthFailureTestJava8 {
+public class MongoDbAuthFailureTest {
private static LoggerContextRule loggerContextTestRule = new LoggerContextRule("log4j2-mongodb-auth-failure.xml");
@@ -50,7 +50,7 @@ public class MongoDbAuthFailureTestJava8 {
.create(TestConstants.SYS_PROP_NAME_PORT);
private static final MongoDbTestRule mongoDbTestRule = new MongoDbTestRule(mongoDbPortTestRule.getName(),
- MongoDbAuthFailureTestJava8.class, LoggingTarget.NULL);
+ MongoDbAuthFailureTest.class, LoggingTarget.NULL);
@ClassRule
public static RuleChain ruleChain = RuleChainFactory.create(mongoDbPortTestRule, mongoDbTestRule,
diff --git a/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbCappedTestJava8.java b/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbCappedTest.java
similarity index 96%
rename from log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbCappedTestJava8.java
rename to log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbCappedTest.java
index 06fb4f5cae5..7611284f436 100644
--- a/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbCappedTestJava8.java
+++ b/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbCappedTest.java
@@ -38,7 +38,7 @@
* This class name does NOT end in "Test" in order to only be picked up by {@link Java8Test}.
*/
@Category(Appenders.MongoDb.class)
-public class MongoDbCappedTestJava8 {
+public class MongoDbCappedTest {
private static LoggerContextRule loggerContextTestRule = new LoggerContextRule("log4j2-mongodb-capped.xml");
@@ -46,7 +46,7 @@ public class MongoDbCappedTestJava8 {
.create(TestConstants.SYS_PROP_NAME_PORT);
private static final MongoDbTestRule mongoDbTestRule = new MongoDbTestRule(mongoDbPortTestRule.getName(),
- MongoDbCappedTestJava8.class, LoggingTarget.NULL);
+ MongoDbCappedTest.class, LoggingTarget.NULL);
@ClassRule
public static RuleChain ruleChain = RuleChainFactory.create(mongoDbPortTestRule, mongoDbTestRule,
diff --git a/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbMapMessageTestJava8.java b/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbMapMessageTest.java
similarity index 96%
rename from log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbMapMessageTestJava8.java
rename to log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbMapMessageTest.java
index 1c36e080e0a..70f910e849d 100644
--- a/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbMapMessageTestJava8.java
+++ b/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbMapMessageTest.java
@@ -39,7 +39,7 @@
* This class name does NOT end in "Test" in order to only be picked up by {@link Java8Test}.
*/
@Category(Appenders.MongoDb.class)
-public class MongoDbMapMessageTestJava8 {
+public class MongoDbMapMessageTest {
private static LoggerContextRule loggerContextTestRule = new LoggerContextRule("log4j2-mongodb-map-message.xml");
@@ -47,7 +47,7 @@ public class MongoDbMapMessageTestJava8 {
.create(TestConstants.SYS_PROP_NAME_PORT);
private static final MongoDbTestRule mongoDbTestRule = new MongoDbTestRule(mongoDbPortTestRule.getName(),
- MongoDbMapMessageTestJava8.class, LoggingTarget.NULL);
+ MongoDbMapMessageTest.class, LoggingTarget.NULL);
@ClassRule
public static RuleChain ruleChain = RuleChainFactory.create(mongoDbPortTestRule, mongoDbTestRule,
diff --git a/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbTestJava8.java b/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbTest.java
similarity index 97%
rename from log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbTestJava8.java
rename to log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbTest.java
index e1f283cadc7..eab64b3f5c2 100644
--- a/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbTestJava8.java
+++ b/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbTest.java
@@ -38,7 +38,7 @@
* This class name does NOT end in "Test" in order to only be picked up by {@link Java8Test}.
*/
@Category(Appenders.MongoDb.class)
-public class MongoDbTestJava8 {
+public class MongoDbTest {
private static LoggerContextRule loggerContextTestRule = new LoggerContextRule("log4j2-mongodb.xml");
@@ -46,7 +46,7 @@ public class MongoDbTestJava8 {
.create(TestConstants.SYS_PROP_NAME_PORT);
private static final MongoDbTestRule mongoDbTestRule = new MongoDbTestRule(mongoDbPortTestRule.getName(),
- MongoDbTestJava8.class, LoggingTarget.NULL);
+ MongoDbTest.class, LoggingTarget.NULL);
@ClassRule
public static RuleChain ruleChain = RuleChainFactory.create(mongoDbPortTestRule, mongoDbTestRule,
diff --git a/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbTestTestRuleTestJava8.java b/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbTestTestRuleTest.java
similarity index 96%
rename from log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbTestTestRuleTestJava8.java
rename to log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbTestTestRuleTest.java
index 21d62f9c1de..e19980bfff9 100644
--- a/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbTestTestRuleTestJava8.java
+++ b/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbTestTestRuleTest.java
@@ -37,13 +37,13 @@
* The test framework {@code de.flapdoodle.embed.mongo} requires Java 8.
*
*/
-public class MongoDbTestTestRuleTestJava8 {
+public class MongoDbTestTestRuleTest {
private static final AvailablePortSystemPropertyTestRule mongoDbPortTestRule = AvailablePortSystemPropertyTestRule
.create(TestConstants.SYS_PROP_NAME_PORT);
private static final MongoDbTestRule mongoDbTestRule = new MongoDbTestRule(mongoDbPortTestRule.getName(),
- MongoDbTestTestRuleTestJava8.class, LoggingTarget.NULL);
+ MongoDbTestTestRuleTest.class, LoggingTarget.NULL);
@ClassRule
public static RuleChain mongoDbChain = RuleChainFactory.create(mongoDbPortTestRule, mongoDbTestRule);
From c647ca61eec5a4d7fc4aba6530e3ecd704a54a0d Mon Sep 17 00:00:00 2001
From: Gary Gregory
Date: Thu, 1 Mar 2018 15:03:48 -0700
Subject: [PATCH 0093/2347] Better Javadoc.
---
.../log4j/junit/SecurityManagerTestRule.java | 88 ++++++++++++-------
1 file changed, 56 insertions(+), 32 deletions(-)
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/junit/SecurityManagerTestRule.java b/log4j-api/src/test/java/org/apache/logging/log4j/junit/SecurityManagerTestRule.java
index 311b817bc99..57ac55da281 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/junit/SecurityManagerTestRule.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/junit/SecurityManagerTestRule.java
@@ -22,49 +22,73 @@
import org.junit.runners.model.Statement;
/**
- * Sets a security manager for a test run. The current security manager is first
- * saved then restored after the test is run.
+ * Sets a security manager for a test run. The current security manager is first saved then restored after the test is
+ * run.
*
- * Using a security manager can mess up other tests so this is best used from
- * integration tests (classes that end in "IT" instead of "Test" and
- * "TestCase".)
+ * Using a security manager can mess up other tests so this is best used from integration tests (classes that end in
+ * "IT" instead of "Test" and "TestCase".)
*
*
+ *
+ * When this test rule is evaluated, it will:
+ *
+ *
+ *
Save the current SecurityManager.
+ *
Set the SecurityManager to the instance supplied to this rule.
+ *
Evaluate the test statement.
+ *
Reset the current SecurityManager to the one from step (1).
+ *
+ *
* @since 2.11.0
*/
public class SecurityManagerTestRule implements TestRule {
- public SecurityManagerTestRule(final SecurityManager securityManager) {
- super();
- this.securityManager = securityManager;
- }
+ /**
+ * Constructs a new instance with the given {@link SecurityManager}.
+ *
+ * When this test rule is evaluated, it will:
+ *
+ *
+ *
Save the current SecurityManager.
+ *
Set the SecurityManager to the instance supplied to this rule.
+ *
Evaluate the test statement.
+ *
Reset the current SecurityManager to the one from step (1).