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

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


The following commit(s) were added to refs/heads/master by this push:
     new a1918c2  LOG4J2-2659: AbstractAction handles unchecked 
RuntimeException and Error (#296)
a1918c2 is described below

commit a1918c260809e958121e00c79f89dee361935381
Author: Carter Kozak <[email protected]>
AuthorDate: Fri Jul 19 16:03:42 2019 -0400

    LOG4J2-2659: AbstractAction handles unchecked RuntimeException and Error 
(#296)
---
 .../appender/rolling/action/AbstractAction.java    |  6 ++-
 .../rolling/action/AbstractActionTest.java         | 43 ++++++++++++++++++++--
 src/changes/changes.xml                            |  3 ++
 3 files changed, 47 insertions(+), 5 deletions(-)

diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/AbstractAction.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/AbstractAction.java
index 43d5f37..4eea0ea 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/AbstractAction.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/AbstractAction.java
@@ -64,8 +64,12 @@ public abstract class AbstractAction implements Action {
         if (!interrupted) {
             try {
                 execute();
-            } catch (final IOException ex) {
+            } catch (final RuntimeException | IOException ex) {
                 reportException(ex);
+            } catch (final Error e) {
+                // reportException takes Exception, widening to Throwable 
would break custom implementations
+                // so we wrap Errors in RuntimeException for handling.
+                reportException(new RuntimeException(e));
             }
 
             complete = true;
diff --git 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/action/AbstractActionTest.java
 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/action/AbstractActionTest.java
index 0f76119..6a70448 100644
--- 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/action/AbstractActionTest.java
+++ 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/action/AbstractActionTest.java
@@ -35,11 +35,46 @@ public class AbstractActionTest {
                 "$TestAction.execute(AbstractActionTest.java:"));
     }
 
+    @Test
+    public void testRuntimeExceptionsAreLoggedToStatusLogger() {
+        StatusLogger statusLogger = StatusLogger.getLogger();
+        statusLogger.clear();
+        new AbstractAction() {
+            @Override
+            public boolean execute() {
+                throw new IllegalStateException();
+            }
+        }.run();
+        List<StatusData> statusDataList = statusLogger.getStatusData();
+        assertEquals(1, statusDataList.size());
+        StatusData statusData = statusDataList.get(0);
+        assertEquals(Level.WARN, statusData.getLevel());
+        String formattedMessage = statusData.getFormattedStatus();
+        assertTrue(formattedMessage.contains("Exception reported by action"));
+    }
+
+    @Test
+    public void testErrorsAreLoggedToStatusLogger() {
+        StatusLogger statusLogger = StatusLogger.getLogger();
+        statusLogger.clear();
+        new AbstractAction() {
+            @Override
+            public boolean execute() {
+                throw new AssertionError();
+            }
+        }.run();
+        List<StatusData> statusDataList = statusLogger.getStatusData();
+        assertEquals(1, statusDataList.size());
+        StatusData statusData = statusDataList.get(0);
+        assertEquals(Level.WARN, statusData.getLevel());
+        String formattedMessage = statusData.getFormattedStatus();
+        assertTrue(formattedMessage.contains("Exception reported by action"));
+    }
+
     private static final class TestAction extends AbstractAction {
         @Override
-        public boolean execute() {
-            this.reportException(new IOException("failed"));
-            return false;
+        public boolean execute() throws IOException {
+            throw new IOException("failed");
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 4c5e2fc..8da790c 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -158,6 +158,9 @@
         AbstractAction.reportException records a warning to the status logger, 
providing more information when file
         based appenders fail to compress rolled data asynchronously.
       </action>
+      <action issue="LOG4J2-2659" dev="ckozak" type="fix">
+        AbstractAction handles and records unchecked RuntimeException and 
Error in addition to IOException.
+      </action>
     </release>
     <release version="2.12.0" date="2019-06-23" description="GA Release 
2.12.0">
       <action issue="LOG4J2-2547" dev="rgoers" type="fix">

Reply via email to