Repository: logging-log4j2 Updated Branches: refs/heads/master 0ba569c52 -> 020319b4c
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/master Commit: 1b134cf3cbd227562fdfa8c4744366e09a03d4c2 Parents: 7c36904 Author: Mikael Ståldal <[email protected]> Authored: Wed Apr 27 19:04:01 2016 +0200 Committer: Mikael Ståldal <[email protected]> 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); }
