You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rp...@apache.org on 2015/09/13 14:46:35 UTC

[1/3] logging-log4j2 git commit: LOG4J2-1120 Implement AppenderControl.equals/hashCode so LoggerConfig can manage AppenderControls in a Set in while preserving Map semantics.

Repository: logging-log4j2
Updated Branches:
  refs/heads/master 6b2cbc2db -> 3d409c10a


LOG4J2-1120 Implement AppenderControl.equals/hashCode so LoggerConfig
can manage AppenderControls in a Set in while preserving Map semantics.

Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/5f4c598e
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/5f4c598e
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/5f4c598e

Branch: refs/heads/master
Commit: 5f4c598ec8314b4b730e8fffc6dafb7d718b9ce5
Parents: 6b2cbc2
Author: rpopma <rp...@apache.org>
Authored: Sun Sep 13 21:21:22 2015 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Sep 13 21:21:22 2015 +0900

----------------------------------------------------------------------
 .../log4j/core/config/AppenderControl.java      | 38 +++++++++++++++++---
 1 file changed, 34 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/5f4c598e/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
index 7445afb..01b97ce 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
@@ -16,6 +16,8 @@
  */
 package org.apache.logging.log4j.core.config;
 
+import java.util.Objects;
+
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.Filter;
@@ -28,16 +30,13 @@ import org.apache.logging.log4j.core.filter.Filterable;
  * Wraps an {@link Appender} with details an appender implementation shouldn't need to know about.
  */
 public class AppenderControl extends AbstractFilterable {
-
     private static final long serialVersionUID = 1L;
 
     private final ThreadLocal<AppenderControl> recursive = new ThreadLocal<>();
-
     private final Appender appender;
-
     private final Level level;
-
     private final int intLevel;
+    private final String appenderName;
 
     /**
      * Constructor.
@@ -48,10 +47,19 @@ public class AppenderControl extends AbstractFilterable {
     public AppenderControl(final Appender appender, final Level level, final Filter filter) {
         super(filter);
         this.appender = appender;
+        this.appenderName = appender.getName();
         this.level = level;
         this.intLevel = level == null ? Level.ALL.intLevel() : level.intLevel();
         start();
     }
+    
+    /**
+     * Returns the name the appender had when this AppenderControl was constructed.
+     * @return the appender name
+     */
+    public String getAppenderName() {
+        return appenderName;
+    }
 
     /**
      * Returns the Appender.
@@ -151,4 +159,26 @@ public class AppenderControl extends AbstractFilterable {
             throw ex;
         }
     }
+    
+    // AppenderControl is a helper object whose purpose is to make it
+    // easier for LoggerConfig to manage and invoke Appenders.
+    // LoggerConfig manages Appenders by their name. To facilitate this,
+    // two AppenderControl objects are considered equal if and only
+    // if they have the same appender name.
+    @Override
+    public boolean equals(final Object obj) {
+        if (obj == this) {
+            return true;
+        }
+        if (!(obj instanceof AppenderControl)) {
+            return false;
+        }
+        final AppenderControl other = (AppenderControl) obj;
+        return Objects.equals(appenderName, other.appenderName);
+    }
+    
+    @Override
+    public int hashCode() {
+        return appenderName.hashCode();
+    }
 }


[3/3] logging-log4j2 git commit: LOG4J2-1120 change log

Posted by rp...@apache.org.
LOG4J2-1120 change log

Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/3d409c10
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/3d409c10
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/3d409c10

Branch: refs/heads/master
Commit: 3d409c10a0771b995e7cf61c8b17ae5a1b6054a4
Parents: a48af4e
Author: rpopma <rp...@apache.org>
Authored: Sun Sep 13 21:46:33 2015 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Sep 13 21:46:33 2015 +0900

----------------------------------------------------------------------
 src/changes/changes.xml | 3 +++
 1 file changed, 3 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3d409c10/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 2386ffc..85cc20f 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -60,6 +60,9 @@
       <action issue="LOG4J2-1096" dev="rpopma" type="update">
         Improved performance of ParameterizedMessage::getFormattedMessage by ~2X.
       </action>
+      <action issue="LOG4J2-1120" dev="rpopma" type="update">
+        LoggerConfig performance improvements: avoid unnecessary lock acquisition, use more efficient data structure.
+      </action>
       <action issue="LOG4J2-1114" dev="ggregory" type="update">
         Add thread name to status logger layout.
       </action>


[2/3] logging-log4j2 git commit: LOG4J2-1120 Replace ConcurrentHashMap with CopyOnWriteArraySet.

Posted by rp...@apache.org.
LOG4J2-1120 Replace ConcurrentHashMap<String, AppenderControl> with
CopyOnWriteArraySet<AppenderControl>.

Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/a48af4ec
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/a48af4ec
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/a48af4ec

Branch: refs/heads/master
Commit: a48af4ecbcbfa10e0f8fde66393b86ec4e9f169c
Parents: 5f4c598
Author: rpopma <rp...@apache.org>
Authored: Sun Sep 13 21:35:18 2015 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Sep 13 21:35:18 2015 +0900

----------------------------------------------------------------------
 .../logging/log4j/core/config/LoggerConfig.java | 40 ++++++++++----------
 1 file changed, 21 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/a48af4ec/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
index 0472ab6..6109c8f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
@@ -18,13 +18,13 @@ package org.apache.logging.log4j.core.config;
 
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
+import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -68,7 +68,7 @@ public class LoggerConfig extends AbstractFilterable {
     private static LogEventFactory LOG_EVENT_FACTORY = null;
 
     private List<AppenderRef> appenderRefs = new ArrayList<>();
-    private final Map<String, AppenderControl> appenders = new ConcurrentHashMap<>();
+    private final Set<AppenderControl> appenders = new CopyOnWriteArraySet<>();
     private final String name;
     private LogEventFactory logEventFactory;
     private Level level;
@@ -192,8 +192,7 @@ public class LoggerConfig extends AbstractFilterable {
      */
     public void addAppender(final Appender appender, final Level level,
             final Filter filter) {
-        appenders.put(appender.getName(), new AppenderControl(appender, level,
-                filter));
+        appenders.add(new AppenderControl(appender, level, filter));
     }
 
     /**
@@ -202,9 +201,12 @@ public class LoggerConfig extends AbstractFilterable {
      * @param name The name of the Appender.
      */
     public void removeAppender(final String name) {
-        final AppenderControl ctl = appenders.remove(name);
-        if (ctl != null) {
-            cleanupFilter(ctl);
+        for (final AppenderControl appenderControl : appenders) {
+            if (Objects.equals(name, appenderControl.getAppenderName())) {
+                if (appenders.remove(appenderControl)) {
+                    cleanupFilter(appenderControl);
+                }
+            }
         }
     }
 
@@ -216,9 +218,8 @@ public class LoggerConfig extends AbstractFilterable {
      */
     public Map<String, Appender> getAppenders() {
         final Map<String, Appender> map = new HashMap<>();
-        for (final Map.Entry<String, AppenderControl> entry : appenders
-                .entrySet()) {
-            map.put(entry.getKey(), entry.getValue().getAppender());
+        for (final AppenderControl appenderControl : appenders) {
+            map.put(appenderControl.getAppenderName(), appenderControl.getAppender());
         }
         return map;
     }
@@ -228,12 +229,13 @@ public class LoggerConfig extends AbstractFilterable {
      */
     protected void clearAppenders() {
         waitForCompletion();
-        final Collection<AppenderControl> controls = appenders.values();
-        final Iterator<AppenderControl> iterator = controls.iterator();
-        while (iterator.hasNext()) {
-            final AppenderControl ctl = iterator.next();
-            iterator.remove();
-            cleanupFilter(ctl);
+        List<AppenderControl> copy = new ArrayList<AppenderControl>(appenders);
+        while (!copy.isEmpty()) {
+            appenders.removeAll(copy);
+            for (final AppenderControl ctl : copy) {
+                cleanupFilter(ctl);
+            }
+            copy = new ArrayList<AppenderControl>(appenders);
         }
     }
 
@@ -443,7 +445,7 @@ public class LoggerConfig extends AbstractFilterable {
     }
 
     protected void callAppenders(final LogEvent event) {
-        for (final AppenderControl control : appenders.values()) {
+        for (final AppenderControl control : appenders) {
             control.callAppender(event);
         }
     }