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