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);
             }