You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by gg...@apache.org on 2019/07/18 20:33:47 UTC

[logging-log4j2] branch master updated: [LOG4J2-2657] Improve exception messages in the JDBC appender.

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

ggregory 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 2415903  [LOG4J2-2657] Improve exception messages in the JDBC appender.
2415903 is described below

commit 2415903873de8ad0f3de4012a43da9da7ea7730b
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Thu Jul 18 16:33:43 2019 -0400

    [LOG4J2-2657] Improve exception messages in the JDBC appender.
---
 .../core/appender/AppenderLoggingException.java    | 32 +++++++++++++++++---
 .../log4j/jdbc/appender/JdbcDatabaseManager.java   | 35 +++++++++++++++-------
 src/changes/changes.xml                            |  3 ++
 3 files changed, 56 insertions(+), 14 deletions(-)

diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AppenderLoggingException.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AppenderLoggingException.java
index 4b65a2c..4174e4e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AppenderLoggingException.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AppenderLoggingException.java
@@ -24,17 +24,18 @@ import org.apache.logging.log4j.LoggingException;
  * using the {@link org.apache.logging.log4j.status.StatusLogger}. Appenders should only throw exceptions when an error
  * prevents an event from being written. Appenders <em>must</em> throw an exception in this case so that error-handling
  * features like the {@link FailoverAppender} work properly.
- *
+ * <p>
  * Also note that appenders <em>must</em> provide a way to suppress exceptions when the user desires and abide by
  * that instruction. See {@link org.apache.logging.log4j.core.Appender#ignoreExceptions()}, which is the standard
  * way to do this.
+ * </p>
  */
 public class AppenderLoggingException extends LoggingException {
 
     private static final long serialVersionUID = 6545990597472958303L;
 
     /**
-     * Construct an exception with a message.
+     * Constructs an exception with a message.
      *
      * @param message The reason for the exception
      */
@@ -43,7 +44,18 @@ public class AppenderLoggingException extends LoggingException {
     }
 
     /**
-     * Construct an exception with a message and underlying cause.
+     * Constructs an exception with a message.
+     *
+     * @param format The reason format for the exception, see {@link String#format(String, Object...)}.
+     * @param args The reason arguments for the exception, see {@link String#format(String, Object...)}.
+     * @since 2.12.1
+     */
+    public AppenderLoggingException(final String format, Object... args) {
+        super(String.format(format, args));
+    }
+
+    /**
+     * Constructs an exception with a message and underlying cause.
      *
      * @param message The reason for the exception
      * @param cause The underlying cause of the exception
@@ -53,11 +65,23 @@ public class AppenderLoggingException extends LoggingException {
     }
 
     /**
-     * Construct an exception with an underlying cause.
+     * Constructs an exception with an underlying cause.
      *
      * @param cause The underlying cause of the exception
      */
     public AppenderLoggingException(final Throwable cause) {
         super(cause);
     }
+
+    /**
+     * Constructs an exception with a message.
+     *
+     * @param cause The underlying cause of the exception
+     * @param format The reason format for the exception, see {@link String#format(String, Object...)}.
+     * @param args The reason arguments for the exception, see {@link String#format(String, Object...)}.
+     * @since 2.12.1
+     */
+    public AppenderLoggingException(final Throwable cause, final String format, Object... args) {
+        super(String.format(format, args), cause);
+    }
 }
diff --git a/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/JdbcDatabaseManager.java b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/JdbcDatabaseManager.java
index 7ee06b4..ba8cbdc 100644
--- a/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/JdbcDatabaseManager.java
+++ b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/JdbcDatabaseManager.java
@@ -201,6 +201,11 @@ public final class JdbcDatabaseManager extends AbstractDatabaseManager {
             shutdown = true;
         }
 
+        @Override
+        public String toString() {
+            return String.format("Reconnector [latch=%s, shutdown=%s]", latch, shutdown);
+        }
+
     }
 
     private static final class ResultSetColumnMetaData {
@@ -431,11 +436,11 @@ public final class JdbcDatabaseManager extends AbstractDatabaseManager {
                 reconnector.latch();
                 if (connection == null) {
                     throw new AppenderLoggingException(
-                            "Error writing to JDBC Manager '" + getName() + "': JDBC connection not available.");
+                            "Error writing to JDBC Manager '%s': JDBC connection not available [%s]", getName(), fieldsToString());
                 }
                 if (statement == null) {
                     throw new AppenderLoggingException(
-                            "Error writing to JDBC Manager '" + getName() + "': JDBC statement not available.");
+                            "Error writing to JDBC Manager '%s': JDBC statement not available [%s].", getName(), connection, fieldsToString());
                 }
             }
         }
@@ -481,7 +486,8 @@ public final class JdbcDatabaseManager extends AbstractDatabaseManager {
                 this.connection.commit();
             }
         } catch (final SQLException e) {
-            throw new DbAppenderLoggingException("Failed to commit transaction logging event or flushing buffer.", e);
+            throw new AppenderLoggingException(e, "Failed to commit transaction logging event or flushing buffer [%s]",
+                    fieldsToString());
         } finally {
             closeResources(true);
         }
@@ -553,6 +559,13 @@ public final class JdbcDatabaseManager extends AbstractDatabaseManager {
         return sb.toString();
     }
 
+    private String fieldsToString() {
+        return String.format(
+                "columnConfigs=%s, sqlStatement=%s, factoryData=%s, connection=%s, statement=%s, reconnector=%s, isBatchSupported=%s, columnMetaData=%s",
+                columnConfigs, sqlStatement, factoryData, connection, statement, reconnector, isBatchSupported,
+                columnMetaData);
+    }
+
     public ConnectionSource getConnectionSource() {
         return factoryData.connectionSource;
     }
@@ -625,8 +638,8 @@ public final class JdbcDatabaseManager extends AbstractDatabaseManager {
                 reconnector.start();
                 reconnector.latch();
                 if (connection == null || statement == null) {
-                    throw new AppenderLoggingException(
-                            String.format("Error sending to %s for %s", getName(), factoryData), exception);
+                    throw new AppenderLoggingException(exception, "Error sending to %s for %s [%s]", getName(),
+                            factoryData, fieldsToString());
                 }
             }
         }
@@ -686,7 +699,8 @@ public final class JdbcDatabaseManager extends AbstractDatabaseManager {
                     value = resultSetColumnMetaData.truncate(value.toString());
                 }
             } else {
-                logger().error("Missing ResultSetColumnMetaData for {}", nameKey);
+                logger().error("Missing ResultSetColumnMetaData for {}, connection={}, statement={}", nameKey,
+                        connection, statement);
             }
         }
         return value;
@@ -699,7 +713,8 @@ public final class JdbcDatabaseManager extends AbstractDatabaseManager {
             if (!this.isRunning() || this.connection == null || this.connection.isClosed() || this.statement == null
                     || this.statement.isClosed()) {
                 throw new AppenderLoggingException(
-                        "Cannot write logging event; JDBC manager not connected to the database.");
+                        "Cannot write logging event; JDBC manager not connected to the database, running=%s, [%s]).",
+                        isRunning(), fieldsToString());
             }
             // Clear in case there are leftovers.
             statement.clearParameters();
@@ -759,11 +774,11 @@ public final class JdbcDatabaseManager extends AbstractDatabaseManager {
                 this.statement.addBatch();
             } else if (this.statement.executeUpdate() == 0) {
                 throw new AppenderLoggingException(
-                        "No records inserted in database table for log event in JDBC manager.");
+                        "No records inserted in database table for log event in JDBC manager [%s].", fieldsToString());
             }
         } catch (final SQLException e) {
-            throw new DbAppenderLoggingException(
-                    "Failed to insert record for log event in JDBC manager: " + e.getMessage(), e);
+            throw new AppenderLoggingException(e, "Failed to insert record for log event in JDBC manager: %s [%s]", e,
+                    fieldsToString());
         } finally {
             // Release ASAP
             try {
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 2fecddd..daa8492 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -151,6 +151,9 @@
       <action issue="LOG4J2-2646" dev="ggregory" type="update">
         Update MongoDB 3 driver from 3.10.1 to 3.10.2.
       </action>
+      <action issue="LOG4J2-2657" dev="ggregory" type="update">
+        Improve exception messages in the JDBC appender.
+      </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">