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/04/27 19:04:09 UTC

logging-log4j2 git commit: LogEvent memento

Repository: logging-log4j2
Updated Branches:
  refs/heads/LOG4J2-1347 [created] 1b134cf3c


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/LOG4J2-1347
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);
             }


Re: logging-log4j2 git commit: LogEvent memento

Posted by Mikael Ståldal <mi...@magine.com>.
OK, I have imported the Code Style settings into my IDE (IntelliJ IDEA),
and reformatted AsyncAppender.java.

On Tue, May 3, 2016 at 2:45 AM, Gary Gregory <ga...@gmail.com> wrote:

> Yeah, I'm not a fan of wildcard imports either.
>
> Gary
>
> On Mon, May 2, 2016 at 5:40 PM, Ralph Goers <ra...@dslextreme.com>
> wrote:
>
>> You need to review http://logging.apache.org/log4j/2.x/javastyle.html.
>> In particular you reordered the imports when they were correct to start
>> with and you changed specific imports to a wildcard import.
>>
>> Ralph
>>
>>
>> On Apr 27, 2016, at 10:04 AM, mikes@apache.org wrote:
>>
>> Repository: logging-log4j2
>> Updated Branches:
>>  refs/heads/LOG4J2-1347 [created] 1b134cf3c
>>
>>
>> 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/LOG4J2-1347
>> 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);
>>             }
>>
>>
>>
>>
>
>
> --
> E-Mail: garydgregory@gmail.com | ggregory@apache.org
> Java Persistence with Hibernate, Second Edition
> <http://www.manning.com/bauer3/>
> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
> Spring Batch in Action <http://www.manning.com/templier/>
> Blog: http://garygregory.wordpress.com
> Home: http://garygregory.com/
> Tweet! http://twitter.com/GaryGregory
>



-- 
[image: MagineTV]

*Mikael Ståldal*
Senior software developer

*Magine TV*
mikael.staldal@magine.com
Grev Turegatan 3  | 114 46 Stockholm, Sweden  |   www.magine.com

Privileged and/or Confidential Information may be contained in this
message. If you are not the addressee indicated in this message
(or responsible for delivery of the message to such a person), you may not
copy or deliver this message to anyone. In such case,
you should destroy this message and kindly notify the sender by reply
email.

Re: logging-log4j2 git commit: LogEvent memento

Posted by Gary Gregory <ga...@gmail.com>.
Yeah, I'm not a fan of wildcard imports either.

Gary

On Mon, May 2, 2016 at 5:40 PM, Ralph Goers <ra...@dslextreme.com>
wrote:

> You need to review http://logging.apache.org/log4j/2.x/javastyle.html. In
> particular you reordered the imports when they were correct to start with
> and you changed specific imports to a wildcard import.
>
> Ralph
>
>
> On Apr 27, 2016, at 10:04 AM, mikes@apache.org wrote:
>
> Repository: logging-log4j2
> Updated Branches:
>  refs/heads/LOG4J2-1347 [created] 1b134cf3c
>
>
> 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/LOG4J2-1347
> 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);
>             }
>
>
>
>


-- 
E-Mail: garydgregory@gmail.com | ggregory@apache.org
Java Persistence with Hibernate, Second Edition
<http://www.manning.com/bauer3/>
JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
Spring Batch in Action <http://www.manning.com/templier/>
Blog: http://garygregory.wordpress.com
Home: http://garygregory.com/
Tweet! http://twitter.com/GaryGregory

Re: logging-log4j2 git commit: LogEvent memento

Posted by Ralph Goers <ra...@dslextreme.com>.
You need to review http://logging.apache.org/log4j/2.x/javastyle.html <http://logging.apache.org/log4j/2.x/javastyle.html>. In particular you reordered the imports when they were correct to start with and you changed specific imports to a wildcard import.

Ralph


> On Apr 27, 2016, at 10:04 AM, mikes@apache.org wrote:
> 
> Repository: logging-log4j2
> Updated Branches:
>  refs/heads/LOG4J2-1347 [created] 1b134cf3c
> 
> 
> 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/LOG4J2-1347
> 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);
>             }
> 
>