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/08/16 15:28:04 UTC

logging-log4j2 git commit: refactored AppenderControl::callAppender into smaller methods to enable inlining: after running a test with -XX:+PrintCompilation -XX:+UnlockDiagnosticVMOptions -XX:+PrintInlining I found "...AppenderControl::callAppender (405

Repository: logging-log4j2
Updated Branches:
  refs/heads/master 5a55b7365 -> ceb0a6208


refactored AppenderControl::callAppender into smaller methods to enable
inlining:
after running a test with -XX:+PrintCompilation
-XX:+UnlockDiagnosticVMOptions -XX:+PrintInlining
I found "...AppenderControl::callAppender (405 bytes) hot method too
big".
The new code is all inlined after ~7000 invocations. 

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

Branch: refs/heads/master
Commit: ceb0a6208ef62a8100cf40e8882abc9515b26147
Parents: 5a55b73
Author: rpopma <rp...@apache.org>
Authored: Sun Aug 16 22:28:11 2015 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Aug 16 22:28:11 2015 +0900

----------------------------------------------------------------------
 .../log4j/core/config/AppenderControl.java      | 113 +++++++++++++------
 1 file changed, 76 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ceb0a620/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 e40c7f0..cff78b8 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
@@ -66,51 +66,90 @@ public class AppenderControl extends AbstractFilterable {
      * @param event The event to process.
      */
     public void callAppender(final LogEvent event) {
-        if (getFilter() != null) {
-            final Filter.Result r = getFilter().filter(event);
-            if (r == Filter.Result.DENY) {
-                return;
-            }
-        }
-        if (level != null && intLevel < event.getLevel().intLevel()) {
+        if (shouldSkip(event)) {
             return;
         }
+        callAppenderPreventRecursion(event);
+    }
+
+    private boolean shouldSkip(final LogEvent event) {
+        return isFilteredByAppenderControl(event) || isFilteredByLevel(event) || isRecursiveCall();
+    }
+
+    private boolean isFilteredByAppenderControl(final LogEvent event) {
+        return getFilter() != null && Filter.Result.DENY == getFilter().filter(event);
+    }
+
+    private boolean isFilteredByLevel(final LogEvent event) {
+        return level != null && intLevel < event.getLevel().intLevel();
+    }
+
+    private boolean isRecursiveCall() {
         if (recursive.get() != null) {
-            appender.getHandler().error("Recursive call to appender " + appender.getName());
-            return;
+            appenderErrorHandlerMessage("Recursive call to appender ");
+            return true;
         }
+        return false;
+    }
+    
+    private String appenderErrorHandlerMessage(final String prefix) {
+        String result = createErrorMsg(prefix);
+        appender.getHandler().error(result);
+        return result;
+    }
+
+    private void callAppenderPreventRecursion(final LogEvent event) {
         try {
-            recursive.set(this);
-
-            if (!appender.isStarted()) {
-                appender.getHandler().error("Attempted to append to non-started appender " + appender.getName());
-
-                if (!appender.ignoreExceptions()) {
-                    throw new AppenderLoggingException(
-                        "Attempted to append to non-started appender " + appender.getName());
-                }
-            }
-
-            if (appender instanceof Filterable && ((Filterable) appender).isFiltered(event)) {
-                return;
-            }
-
-            try {
-                appender.append(event);
-            } catch (final RuntimeException ex) {
-                appender.getHandler().error("An exception occurred processing Appender " + appender.getName(), ex);
-                if (!appender.ignoreExceptions()) {
-                    throw ex;
-                }
-            } catch (final Exception ex) {
-                appender.getHandler().error("An exception occurred processing Appender " + appender.getName(), ex);
-                if (!appender.ignoreExceptions()) {
-                    throw new AppenderLoggingException(ex);
-                }
-            }
+            recursive.set(this);            
+            callAppender0(event);
         } finally {
             recursive.set(null);
         }
     }
 
+    private void callAppender0(final LogEvent event) {
+        ensureAppenderStarted();
+        if (!isFilteredByAppender(event)) {
+            tryCallAppender(event);
+        }
+    }
+
+    private void ensureAppenderStarted() {
+        if (!appender.isStarted()) {
+            handleError("Attempted to append to non-started appender ");
+        }
+    }
+
+    private void handleError(final String prefix) {
+        final String msg = appenderErrorHandlerMessage(prefix);
+        if (!appender.ignoreExceptions()) {
+            throw new AppenderLoggingException(msg);
+        }
+    }
+
+    private String createErrorMsg(final String prefix) {
+        final String msg = prefix + appender.getName();
+        return msg;
+    }
+    
+    private boolean isFilteredByAppender(final LogEvent event) {
+        return appender instanceof Filterable && ((Filterable) appender).isFiltered(event);
+    }
+
+    private void tryCallAppender(final LogEvent event) {
+        try {
+            appender.append(event);
+        } catch (final RuntimeException ex) {
+            handleAppenderError(ex);
+        } catch (final Exception ex) {
+            handleAppenderError(new AppenderLoggingException(ex));
+        }
+    }
+
+    private void handleAppenderError(final RuntimeException ex) {
+        appender.getHandler().error(createErrorMsg("An exception occurred processing Appender "), ex);
+        if (!appender.ignoreExceptions()) {
+            throw ex;
+        }
+    }
 }