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">