You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by mi...@apache.org on 2016/05/06 14:43:15 UTC
[05/50] logging-log4j2 git commit: LogEvent memento
LogEvent memento
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/1b134cf3
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/1b134cf3
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/1b134cf3
Branch: refs/heads/LOG4J-1181
Commit: 1b134cf3cbd227562fdfa8c4744366e09a03d4c2
Parents: 7c36904
Author: Mikael St�ldal <mi...@magine.com>
Authored: Wed Apr 27 19:04:01 2016 +0200
Committer: Mikael St�ldal <mi...@magine.com>
Committed: Wed Apr 27 19:04:01 2016 +0200
----------------------------------------------------------------------
.../log4j/core/appender/AsyncAppender.java | 62 +++++++++-----------
.../logging/log4j/core/impl/Log4jLogEvent.java | 10 ++++
.../log4j/core/impl/MutableLogEvent.java | 11 ++++
.../core/layout/AbstractJacksonLayout.java | 2 +-
.../logging/log4j/core/net/SmtpManager.java | 2 +-
.../log4j/test/appender/ListAppender.java | 2 +-
6 files changed, 52 insertions(+), 37 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1b134cf3/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java
index aa10155..72f9ca8 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java
@@ -16,14 +16,7 @@
*/
package org.apache.logging.log4j.core.appender;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.atomic.AtomicLong;
-
+import org.apache.logging.log4j.core.AbstractLogEvent;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.LogEvent;
@@ -35,15 +28,17 @@ import org.apache.logging.log4j.core.config.AppenderControl;
import org.apache.logging.log4j.core.config.AppenderRef;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationException;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAliases;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.core.config.plugins.*;
import org.apache.logging.log4j.core.impl.Log4jLogEvent;
import org.apache.logging.log4j.core.util.Constants;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.atomic.AtomicLong;
+
/**
* Appends to one or more Appenders asynchronously. You can configure an AsyncAppender with one or more Appenders and an
* Appender to append to if the queue is full. The AsyncAppender does not allow a filter to be specified on the Appender
@@ -53,11 +48,11 @@ import org.apache.logging.log4j.core.util.Constants;
public final class AsyncAppender extends AbstractAppender {
private static final int DEFAULT_QUEUE_SIZE = 128;
- private static final String SHUTDOWN = "Shutdown";
+ private static final LogEvent SHUTDOWN = new AbstractLogEvent() { };
private static final AtomicLong THREAD_SEQUENCE = new AtomicLong(1);
- private final BlockingQueue<Serializable> queue;
+ private final BlockingQueue<LogEvent> queue;
private final int queueSize;
private final boolean blocking;
private final long shutdownTimeout;
@@ -173,19 +168,19 @@ public final class AsyncAppender extends AbstractAppender {
private boolean enqueueOrBlockIfQueueFull(final LogEvent logEvent) {
boolean appendSuccessful;
- final Serializable serialized = Log4jLogEvent.serialize(logEvent, includeLocation);
+ final Log4jLogEvent frozenLogEvent = Log4jLogEvent.createMemento(logEvent, includeLocation);
try {
// wait for free slots in the queue
- queue.put(serialized);
+ queue.put(frozenLogEvent);
appendSuccessful = true;
} catch (final InterruptedException e) {
- appendSuccessful = handleInterruptedException(serialized);
+ appendSuccessful = handleInterruptedException(frozenLogEvent);
}
return appendSuccessful;
}
private boolean enqueueOrDropIfQueueFull(final LogEvent logEvent) {
- final boolean appendSuccessful = queue.offer(Log4jLogEvent.serialize(logEvent, includeLocation));
+ final boolean appendSuccessful = queue.offer(Log4jLogEvent.createMemento(logEvent, includeLocation));
if (!appendSuccessful) {
error("Appender " + getName() + " is unable to write primary appenders. queue is full");
}
@@ -203,8 +198,8 @@ public final class AsyncAppender extends AbstractAppender {
// This may interfere with the application's expectation of
// being interrupted, so when we are done, we set the interrupted
// flag again.
- private boolean handleInterruptedException(final Serializable serialized) {
- final boolean appendSuccessful = queue.offer(serialized);
+ private boolean handleInterruptedException(final Log4jLogEvent frozenLogEvent) {
+ final boolean appendSuccessful = queue.offer(frozenLogEvent);
if (!appendSuccessful) {
LOGGER.warn("Interrupted while waiting for a free slot in the AsyncAppender LogEvent-queue {}",
getName());
@@ -269,9 +264,9 @@ public final class AsyncAppender extends AbstractAppender {
private volatile boolean shutdown = false;
private final List<AppenderControl> appenders;
- private final BlockingQueue<Serializable> queue;
+ private final BlockingQueue<LogEvent> queue;
- public AsyncThread(final List<AppenderControl> appenders, final BlockingQueue<Serializable> queue) {
+ public AsyncThread(final List<AppenderControl> appenders, final BlockingQueue<LogEvent> queue) {
this.appenders = appenders;
this.queue = queue;
setDaemon(true);
@@ -281,17 +276,16 @@ public final class AsyncAppender extends AbstractAppender {
@Override
public void run() {
while (!shutdown) {
- Serializable s;
+ LogEvent event;
try {
- s = queue.take();
- if (s != null && s instanceof String && SHUTDOWN.equals(s.toString())) {
+ event = queue.take();
+ if (event == SHUTDOWN) {
shutdown = true;
continue;
}
} catch (final InterruptedException ex) {
break; // LOG4J2-830
}
- final Log4jLogEvent event = Log4jLogEvent.deserialize(s);
event.setEndOfBatch(queue.isEmpty());
final boolean success = callAppenders(event);
if (!success && errorAppender != null) {
@@ -309,15 +303,15 @@ public final class AsyncAppender extends AbstractAppender {
int ignored = 0;
while (!queue.isEmpty()) {
try {
- final Serializable s = queue.take();
- if (Log4jLogEvent.canDeserialize(s)) {
- final Log4jLogEvent event = Log4jLogEvent.deserialize(s);
- event.setEndOfBatch(queue.isEmpty());
- callAppenders(event);
+ final LogEvent event = queue.take();
+ if (event instanceof Log4jLogEvent) {
+ final Log4jLogEvent logEvent = (Log4jLogEvent) event;
+ logEvent.setEndOfBatch(queue.isEmpty());
+ callAppenders(logEvent);
count++;
} else {
ignored++;
- LOGGER.trace("Ignoring event of class {}", s.getClass().getName());
+ LOGGER.trace("Ignoring event of class {}", event.getClass().getName());
}
} catch (final InterruptedException ex) {
// May have been interrupted to shut down.
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1b134cf3/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
----------------------------------------------------------------------
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 776fba7..7c9bcbf 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
@@ -670,6 +670,16 @@ public Log4jLogEvent(final String loggerName, final Marker marker, final String
throw new InvalidObjectException("Proxy required");
}
+ /**
+ * Creates and returns a new immutable copy of this {@code Log4jLogEvent}.
+ *
+ * @return a new immutable copy of the data in this {@code Log4jLogEvent}
+ */
+ public static Log4jLogEvent createMemento(LogEvent event, final boolean includeLocation) {
+ // TODO implement Log4jLogEvent.createMemento()
+ return deserialize(serialize(event, includeLocation));
+ }
+
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1b134cf3/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/MutableLogEvent.java
----------------------------------------------------------------------
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 7fd31c0..be4ba24 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
@@ -415,4 +415,15 @@ public class MutableLogEvent implements LogEvent, ReusableMessage {
private void readObject(final ObjectInputStream stream) throws InvalidObjectException {
throw new InvalidObjectException("Proxy required");
}
+
+ /**
+ * Creates and returns a new immutable copy of this {@code MutableLogEvent}.
+ *
+ * @return a new immutable copy of the data in this {@code MutableLogEvent}
+ */
+ public Log4jLogEvent createMemento() {
+ // TODO implement MutableLogEvent.createMemento()
+ return Log4jLogEvent.deserialize(Log4jLogEvent.serialize(this, includeLocation));
+ }
+
}
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1b134cf3/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractJacksonLayout.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractJacksonLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractJacksonLayout.java
index 22e2d36..b3bad36 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractJacksonLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractJacksonLayout.java
@@ -75,7 +75,7 @@ abstract class AbstractJacksonLayout extends AbstractStringLayout {
// TODO Need to set up the same filters for MutableLogEvent but don't know how...
// This is a workaround.
return event instanceof MutableLogEvent
- ? Log4jLogEvent.deserialize(Log4jLogEvent.serialize(event, event.isIncludeLocation()))
+ ? ((MutableLogEvent) event).createMemento()
: event;
}
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1b134cf3/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SmtpManager.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SmtpManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SmtpManager.java
index ab1d5c7..6683f1d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SmtpManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SmtpManager.java
@@ -88,7 +88,7 @@ public class SmtpManager extends AbstractManager {
if (event instanceof Log4jLogEvent && event.getMessage() instanceof ReusableMessage) {
((Log4jLogEvent) event).makeMessageImmutable();
} else if (event instanceof MutableLogEvent) {
- event = Log4jLogEvent.deserialize(Log4jLogEvent.serialize(event, event.isIncludeLocation()));
+ event = ((MutableLogEvent) event).createMemento();
}
buffer.add(event);
}
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1b134cf3/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java
index acab7c1..cc897ea 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java
@@ -88,7 +88,7 @@ public class ListAppender extends AbstractAppender {
if (layout == null) {
if (event instanceof MutableLogEvent) {
// must take snapshot or subsequent calls to logger.log() will modify this event
- events.add(Log4jLogEvent.deserialize(Log4jLogEvent.serialize(event, event.isIncludeLocation())));
+ events.add(((MutableLogEvent) event).createMemento());
} else {
events.add(event);
}