You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by vy...@apache.org on 2021/01/15 15:44:34 UTC

[logging-log4j2] 01/02: LOG4J2-2993 Simplify exception resolvers.

This is an automated email from the ASF dual-hosted git repository.

vy pushed a commit to branch LOG4J2-2993
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit 7cf58d4aa98801f5209ef2346a1485ca1a88343a
Author: Volkan Yazici <vo...@gmail.com>
AuthorDate: Fri Jan 8 17:31:46 2021 +0100

    LOG4J2-2993 Simplify exception resolvers.
---
 .../resolver/ExceptionInternalResolverFactory.java |  68 ----------
 .../template/json/resolver/ExceptionResolver.java  | 150 ++++++++++++---------
 .../json/resolver/ExceptionRootCauseResolver.java  |  91 +------------
 3 files changed, 93 insertions(+), 216 deletions(-)

diff --git a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/ExceptionInternalResolverFactory.java b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/ExceptionInternalResolverFactory.java
deleted file mode 100644
index 31b70cf..0000000
--- a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/ExceptionInternalResolverFactory.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache license, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the license for the specific language governing permissions and
- * limitations under the license.
- */
-package org.apache.logging.log4j.layout.template.json.resolver;
-
-/**
- * Exception resolver factory.
- *
- * <h3>Configuration</h3>
- *
- * <pre>
- * config      = field , [ stringified ]
- * field       = "field" -> ( "className" | "message" | "stackTrace" )
- * stringified = "stringified" -> boolean
- * </pre>
- */
-abstract class ExceptionInternalResolverFactory {
-
-    private static final EventResolver NULL_RESOLVER =
-            (ignored, jsonGenerator) -> jsonGenerator.writeNull();
-
-    EventResolver createInternalResolver(
-            final EventResolverContext context,
-            final TemplateResolverConfig config) {
-        final String fieldName = config.getString("field");
-        switch (fieldName) {
-            case "className": return createClassNameResolver();
-            case "message": return createMessageResolver(context);
-            case "stackTrace": return createStackTraceResolver(context, config);
-        }
-        throw new IllegalArgumentException("unknown field: " + config);
-
-    }
-
-    abstract EventResolver createClassNameResolver();
-
-    abstract EventResolver createMessageResolver(EventResolverContext context);
-
-    private EventResolver createStackTraceResolver(
-            final EventResolverContext context,
-            final TemplateResolverConfig config) {
-        if (!context.isStackTraceEnabled()) {
-            return NULL_RESOLVER;
-        }
-        final boolean stringified = config.getBoolean("stringified", false);
-        return stringified
-                ? createStackTraceStringResolver(context)
-                : createStackTraceObjectResolver(context);
-    }
-
-    abstract EventResolver createStackTraceStringResolver(EventResolverContext context);
-
-    abstract EventResolver createStackTraceObjectResolver(EventResolverContext context);
-
-}
diff --git a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/ExceptionResolver.java b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/ExceptionResolver.java
index 415104a..5fc7a6d 100644
--- a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/ExceptionResolver.java
+++ b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/ExceptionResolver.java
@@ -17,75 +17,23 @@
 package org.apache.logging.log4j.layout.template.json.resolver;
 
 import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.layout.template.json.JsonTemplateLayout;
 import org.apache.logging.log4j.layout.template.json.util.JsonWriter;
 
 /**
  * Exception resolver.
- * <p>
- * Note that this resolver is toggled by {@link
- * JsonTemplateLayout.Builder#setStackTraceEnabled(boolean)}.
  *
- * @see ExceptionInternalResolverFactory
+ * <h3>Configuration</h3>
+ *
+ * <pre>
+ * config      = field , [ stringified ]
+ * field       = "field" -> ( "className" | "message" | "stackTrace" )
+ * stringified = "stringified" -> boolean
+ * </pre>
  */
 class ExceptionResolver implements EventResolver {
 
-    private static final ExceptionInternalResolverFactory INTERNAL_RESOLVER_FACTORY =
-            new ExceptionInternalResolverFactory() {
-
-                @Override
-                EventResolver createClassNameResolver() {
-                    return (final LogEvent logEvent, final JsonWriter jsonWriter) -> {
-                        final Throwable exception = logEvent.getThrown();
-                        if (exception == null) {
-                            jsonWriter.writeNull();
-                        } else {
-                            String exceptionClassName = exception.getClass().getCanonicalName();
-                            jsonWriter.writeString(exceptionClassName);
-                        }
-                    };
-                }
-
-                @Override
-                EventResolver createMessageResolver(final EventResolverContext context) {
-                    return (final LogEvent logEvent, final JsonWriter jsonWriter) -> {
-                        final Throwable exception = logEvent.getThrown();
-                        if (exception == null) {
-                            jsonWriter.writeNull();
-                        } else {
-                            String exceptionMessage = exception.getMessage();
-                            jsonWriter.writeString(exceptionMessage);
-                        }
-                    };
-                }
-
-                @Override
-                EventResolver createStackTraceStringResolver(final EventResolverContext context) {
-                    StackTraceStringResolver stackTraceStringResolver =
-                            new StackTraceStringResolver(context);
-                    return (final LogEvent logEvent, final JsonWriter jsonWriter) -> {
-                        final Throwable exception = logEvent.getThrown();
-                        if (exception == null) {
-                            jsonWriter.writeNull();
-                        } else {
-                            stackTraceStringResolver.resolve(exception, jsonWriter);
-                        }
-                    };
-                }
-
-                @Override
-                EventResolver createStackTraceObjectResolver(final EventResolverContext context) {
-                    return (final LogEvent logEvent, final JsonWriter jsonWriter) -> {
-                        final Throwable exception = logEvent.getThrown();
-                        if (exception == null) {
-                            jsonWriter.writeNull();
-                        } else {
-                            context.getStackTraceObjectResolver().resolve(exception, jsonWriter);
-                        }
-                    };
-                }
-
-            };
+    private static final EventResolver NULL_RESOLVER =
+            (ignored, jsonGenerator) -> jsonGenerator.writeNull();
 
     private final boolean stackTraceEnabled;
 
@@ -95,8 +43,84 @@ class ExceptionResolver implements EventResolver {
             final EventResolverContext context,
             final TemplateResolverConfig config) {
         this.stackTraceEnabled = context.isStackTraceEnabled();
-        this.internalResolver = INTERNAL_RESOLVER_FACTORY
-                .createInternalResolver(context, config);
+        this.internalResolver = createInternalResolver(context, config);
+    }
+
+    EventResolver createInternalResolver(
+            final EventResolverContext context,
+            final TemplateResolverConfig config) {
+        final String fieldName = config.getString("field");
+        switch (fieldName) {
+            case "className": return createClassNameResolver();
+            case "message": return createMessageResolver();
+            case "stackTrace": return createStackTraceResolver(context, config);
+        }
+        throw new IllegalArgumentException("unknown field: " + config);
+
+    }
+
+    private EventResolver createClassNameResolver() {
+        return (final LogEvent logEvent, final JsonWriter jsonWriter) -> {
+            final Throwable exception = extractThrowable(logEvent);
+            if (exception == null) {
+                jsonWriter.writeNull();
+            } else {
+                String exceptionClassName = exception.getClass().getCanonicalName();
+                jsonWriter.writeString(exceptionClassName);
+            }
+        };
+    }
+
+    private EventResolver createMessageResolver() {
+        return (final LogEvent logEvent, final JsonWriter jsonWriter) -> {
+            final Throwable exception = extractThrowable(logEvent);
+            if (exception == null) {
+                jsonWriter.writeNull();
+            } else {
+                String exceptionMessage = exception.getMessage();
+                jsonWriter.writeString(exceptionMessage);
+            }
+        };
+    }
+
+    private EventResolver createStackTraceResolver(
+            final EventResolverContext context,
+            final TemplateResolverConfig config) {
+        if (!context.isStackTraceEnabled()) {
+            return NULL_RESOLVER;
+        }
+        final boolean stringified = config.getBoolean("stringified", false);
+        return stringified
+                ? createStackTraceStringResolver(context)
+                : createStackTraceObjectResolver(context);
+    }
+
+    private EventResolver createStackTraceStringResolver(EventResolverContext context) {
+        StackTraceStringResolver stackTraceStringResolver =
+                new StackTraceStringResolver(context);
+        return (final LogEvent logEvent, final JsonWriter jsonWriter) -> {
+            final Throwable exception = extractThrowable(logEvent);
+            if (exception == null) {
+                jsonWriter.writeNull();
+            } else {
+                stackTraceStringResolver.resolve(exception, jsonWriter);
+            }
+        };
+    }
+
+    private EventResolver createStackTraceObjectResolver(EventResolverContext context) {
+        return (final LogEvent logEvent, final JsonWriter jsonWriter) -> {
+            final Throwable exception = extractThrowable(logEvent);
+            if (exception == null) {
+                jsonWriter.writeNull();
+            } else {
+                context.getStackTraceObjectResolver().resolve(exception, jsonWriter);
+            }
+        };
+    }
+
+    Throwable extractThrowable(LogEvent logEvent) {
+        return logEvent.getThrown();
     }
 
     static String getName() {
diff --git a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/ExceptionRootCauseResolver.java b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/ExceptionRootCauseResolver.java
index 5218284..dfa9d0a 100644
--- a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/ExceptionRootCauseResolver.java
+++ b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/ExceptionRootCauseResolver.java
@@ -19,7 +19,6 @@ package org.apache.logging.log4j.layout.template.json.resolver;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.util.Throwables;
 import org.apache.logging.log4j.layout.template.json.JsonTemplateLayout;
-import org.apache.logging.log4j.layout.template.json.util.JsonWriter;
 
 /**
  * Exception root cause resolver.
@@ -27,81 +26,14 @@ import org.apache.logging.log4j.layout.template.json.util.JsonWriter;
  * Note that this resolver is toggled by {@link
  * JsonTemplateLayout.Builder#setStackTraceEnabled(boolean)}.
  *
- * @see ExceptionInternalResolverFactory
+ * @see ExceptionResolver
  */
-final class ExceptionRootCauseResolver implements EventResolver {
-
-    private static final ExceptionInternalResolverFactory INTERNAL_RESOLVER_FACTORY =
-            new ExceptionInternalResolverFactory() {
-
-                @Override
-                EventResolver createClassNameResolver() {
-                    return (final LogEvent logEvent, final JsonWriter jsonWriter) -> {
-                        final Throwable exception = logEvent.getThrown();
-                        if (exception == null) {
-                            jsonWriter.writeNull();
-                        } else {
-                            final Throwable rootCause = Throwables.getRootCause(exception);
-                            final String rootCauseClassName = rootCause.getClass().getCanonicalName();
-                            jsonWriter.writeString(rootCauseClassName);
-                        }
-                    };
-                }
-
-                @Override
-                EventResolver createMessageResolver(final EventResolverContext context) {
-                    return (final LogEvent logEvent, final JsonWriter jsonWriter) -> {
-                        final Throwable exception = logEvent.getThrown();
-                        if (exception == null) {
-                            jsonWriter.writeNull();
-                        } else {
-                            final Throwable rootCause = Throwables.getRootCause(exception);
-                            final String rootCauseMessage = rootCause.getMessage();
-                            jsonWriter.writeString(rootCauseMessage);
-                        }
-                    };
-                }
-
-                @Override
-                EventResolver createStackTraceStringResolver(final EventResolverContext context) {
-                    final StackTraceStringResolver stackTraceStringResolver =
-                            new StackTraceStringResolver(context);
-                    return (final LogEvent logEvent, final JsonWriter jsonWriter) -> {
-                        final Throwable exception = logEvent.getThrown();
-                        if (exception == null) {
-                            jsonWriter.writeNull();
-                        } else {
-                            final Throwable rootCause = Throwables.getRootCause(exception);
-                            stackTraceStringResolver.resolve(rootCause, jsonWriter);
-                        }
-                    };
-                }
-
-                @Override
-                EventResolver createStackTraceObjectResolver(EventResolverContext context) {
-                    return (final LogEvent logEvent, final JsonWriter jsonWriter) -> {
-                        final Throwable exception = logEvent.getThrown();
-                        if (exception == null) {
-                            jsonWriter.writeNull();
-                        } else {
-                            final Throwable rootCause = Throwables.getRootCause(exception);
-                            context.getStackTraceObjectResolver().resolve(rootCause, jsonWriter);
-                        }
-                    };
-                }
-
-            };
-
-    private final boolean stackTraceEnabled;
-
-    private final EventResolver internalResolver;
+final class ExceptionRootCauseResolver extends ExceptionResolver {
 
     ExceptionRootCauseResolver(
             final EventResolverContext context,
             final TemplateResolverConfig config) {
-        this.stackTraceEnabled = context.isStackTraceEnabled();
-        this.internalResolver = INTERNAL_RESOLVER_FACTORY
-                .createInternalResolver(context, config);
+        super(context, config);
     }
 
     static String getName() {
@@ -109,20 +41,9 @@ final class ExceptionRootCauseResolver implements EventResolver {
     }
 
     @Override
-    public boolean isResolvable() {
-        return stackTraceEnabled;
-    }
-
-    @Override
-    public boolean isResolvable(final LogEvent logEvent) {
-        return stackTraceEnabled && logEvent.getThrown() != null;
-    }
-
-    @Override
-    public void resolve(
-            final LogEvent logEvent,
-            final JsonWriter jsonWriter) {
-        internalResolver.resolve(logEvent, jsonWriter);
+    Throwable extractThrowable(LogEvent logEvent) {
+        final Throwable thrown = logEvent.getThrown();
+        return thrown != null ? Throwables.getRootCause(thrown) : null;
     }
 
 }