mirror of
https://github.com/corda/corda.git
synced 2025-01-30 08:04:16 +00:00
EG-2654 - Ensure stack traces are printed to the logs in error reporting (#6345)
* EG-2654 Ensure stack trace is printed to the logs in error reporting * EG-2654 - Add a test case for exception logging
This commit is contained in:
parent
7ab6a8f600
commit
24b0240d82
@ -1,6 +1,7 @@
|
|||||||
package net.corda.common.logging.errorReporting
|
package net.corda.common.logging.errorReporting
|
||||||
|
|
||||||
import org.slf4j.Logger
|
import org.slf4j.Logger
|
||||||
|
import java.lang.Exception
|
||||||
import java.text.MessageFormat
|
import java.text.MessageFormat
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
@ -31,6 +32,10 @@ internal class ErrorReporterImpl(private val resourceLocation: String,
|
|||||||
override fun report(error: ErrorCode<*>, logger: Logger) {
|
override fun report(error: ErrorCode<*>, logger: Logger) {
|
||||||
val errorResource = ErrorResource.fromErrorCode(error, resourceLocation, locale)
|
val errorResource = ErrorResource.fromErrorCode(error, resourceLocation, locale)
|
||||||
val message = "${errorResource.getErrorMessage(error.parameters.toTypedArray())} ${getErrorInfo(error)}"
|
val message = "${errorResource.getErrorMessage(error.parameters.toTypedArray())} ${getErrorInfo(error)}"
|
||||||
|
if (error is Exception) {
|
||||||
|
logger.error(message, error)
|
||||||
|
} else {
|
||||||
logger.error(message)
|
logger.error(message)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -1,4 +1,4 @@
|
|||||||
errorTemplate = Failed to create the datasource. See the logs for further information and the cause.
|
errorTemplate = Failed to create the datasource: {0}. See the logs for further information and the cause.
|
||||||
shortDescription = The datasource could not be created for unknown reasons.
|
shortDescription = The datasource could not be created for unknown reasons.
|
||||||
actionsToFix = The logs in the logs directory should contain more information on what went wrong.
|
actionsToFix = The logs in the logs directory should contain more information on what went wrong.
|
||||||
aliases =
|
aliases =
|
@ -1,3 +1,3 @@
|
|||||||
errorTemplate = Failed to create the datasource. See the logs for further information and the cause.
|
errorTemplate = Failed to create the datasource: {0}. See the logs for further information and the cause.
|
||||||
shortDescription = The datasource could not be created for unknown reasons.
|
shortDescription = The datasource could not be created for unknown reasons.
|
||||||
actionsToFix = The logs in the logs directory should contain more information on what went wrong.
|
actionsToFix = The logs in the logs directory should contain more information on what went wrong.
|
@ -6,7 +6,7 @@ import java.net.InetAddress
|
|||||||
class DatabaseErrorsTest : ErrorCodeTest<NodeDatabaseErrors>(NodeDatabaseErrors::class.java) {
|
class DatabaseErrorsTest : ErrorCodeTest<NodeDatabaseErrors>(NodeDatabaseErrors::class.java) {
|
||||||
override val dataForCodes = mapOf(
|
override val dataForCodes = mapOf(
|
||||||
NodeDatabaseErrors.COULD_NOT_CONNECT to listOf<Any>(),
|
NodeDatabaseErrors.COULD_NOT_CONNECT to listOf<Any>(),
|
||||||
NodeDatabaseErrors.FAILED_STARTUP to listOf(),
|
NodeDatabaseErrors.FAILED_STARTUP to listOf("This is a test message"),
|
||||||
NodeDatabaseErrors.MISSING_DRIVER to listOf(),
|
NodeDatabaseErrors.MISSING_DRIVER to listOf(),
|
||||||
NodeDatabaseErrors.PASSWORD_REQUIRED_FOR_H2 to listOf(InetAddress.getLocalHost())
|
NodeDatabaseErrors.PASSWORD_REQUIRED_FOR_H2 to listOf(InetAddress.getLocalHost())
|
||||||
)
|
)
|
||||||
|
@ -7,6 +7,7 @@ import net.corda.common.logging.errorReporting.ErrorContextProvider
|
|||||||
import net.corda.common.logging.errorReporting.ErrorReporterImpl
|
import net.corda.common.logging.errorReporting.ErrorReporterImpl
|
||||||
import org.junit.After
|
import org.junit.After
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
import org.mockito.ArgumentMatchers.any
|
||||||
import org.mockito.ArgumentMatchers.anyString
|
import org.mockito.ArgumentMatchers.anyString
|
||||||
import org.mockito.Mockito
|
import org.mockito.Mockito
|
||||||
import org.slf4j.Logger
|
import org.slf4j.Logger
|
||||||
@ -24,6 +25,7 @@ class ErrorReporterImplTest {
|
|||||||
|
|
||||||
private val loggerMock = Mockito.mock(Logger::class.java).also {
|
private val loggerMock = Mockito.mock(Logger::class.java).also {
|
||||||
Mockito.`when`(it.error(anyString())).then { logs.addAll(it.arguments) }
|
Mockito.`when`(it.error(anyString())).then { logs.addAll(it.arguments) }
|
||||||
|
Mockito.`when`(it.error(anyString(), any(Exception::class.java))).then { params -> logs.addAll(params.arguments) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private val contextProvider: ErrorContextProvider = object : ErrorContextProvider {
|
private val contextProvider: ErrorContextProvider = object : ErrorContextProvider {
|
||||||
@ -39,7 +41,8 @@ class ErrorReporterImplTest {
|
|||||||
private enum class TestErrors : ErrorCodes {
|
private enum class TestErrors : ErrorCodes {
|
||||||
CASE1,
|
CASE1,
|
||||||
CASE2,
|
CASE2,
|
||||||
CASE_3;
|
CASE_3,
|
||||||
|
CASE4;
|
||||||
|
|
||||||
override val namespace = TestNamespaces.TEST.toString()
|
override val namespace = TestNamespaces.TEST.toString()
|
||||||
}
|
}
|
||||||
@ -59,6 +62,11 @@ class ErrorReporterImplTest {
|
|||||||
override val parameters = listOf<Any>()
|
override val parameters = listOf<Any>()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class TestError4(cause: Exception?) : Exception("This is test error 4", cause), ErrorCode<TestErrors> {
|
||||||
|
override val code = TestErrors.CASE4
|
||||||
|
override val parameters = listOf<Any>()
|
||||||
|
}
|
||||||
|
|
||||||
private fun createReporterImpl(localeTag: String?) : ErrorReporterImpl {
|
private fun createReporterImpl(localeTag: String?) : ErrorReporterImpl {
|
||||||
val locale = if (localeTag != null) Locale.forLanguageTag(localeTag) else Locale.getDefault()
|
val locale = if (localeTag != null) Locale.forLanguageTag(localeTag) else Locale.getDefault()
|
||||||
return ErrorReporterImpl("errorReporting", locale, contextProvider)
|
return ErrorReporterImpl("errorReporting", locale, contextProvider)
|
||||||
@ -118,4 +126,12 @@ class ErrorReporterImplTest {
|
|||||||
testReporter.report(error, loggerMock)
|
testReporter.report(error, loggerMock)
|
||||||
assertEquals(listOf("This is the third test message [Code: test-case-3 URL: $TEST_URL/en-US]"), logs)
|
assertEquals(listOf("This is the third test message [Code: test-case-3 URL: $TEST_URL/en-US]"), logs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test(timeout = 3_000)
|
||||||
|
fun `exception based error code logs the stack trace`() {
|
||||||
|
val error = TestError4(Exception("A test exception"))
|
||||||
|
val testReporter = createReporterImpl("en-US")
|
||||||
|
testReporter.report(error, loggerMock)
|
||||||
|
assertEquals(listOf("This is the fourth test message [Code: test-case4 URL: $TEST_URL/en-US]", error), logs)
|
||||||
|
}
|
||||||
}
|
}
|
@ -0,0 +1,4 @@
|
|||||||
|
errorTemplate = This is the fourth test message
|
||||||
|
shortDescription = Test description
|
||||||
|
actionsToFix = Actions
|
||||||
|
aliases =
|
@ -0,0 +1,4 @@
|
|||||||
|
errorTemplate = This is the fourth test message
|
||||||
|
shortDescription = Test description
|
||||||
|
actionsToFix = Actions
|
||||||
|
aliases =
|
@ -1360,11 +1360,14 @@ fun CordaPersistence.startHikariPool(hikariProperties: Properties, databaseConfi
|
|||||||
"Could not find the database driver class. Please add it to the 'drivers' folder.",
|
"Could not find the database driver class. Please add it to the 'drivers' folder.",
|
||||||
NodeDatabaseErrors.MISSING_DRIVER)
|
NodeDatabaseErrors.MISSING_DRIVER)
|
||||||
ex is OutstandingDatabaseChangesException -> throw (DatabaseIncompatibleException(ex.message))
|
ex is OutstandingDatabaseChangesException -> throw (DatabaseIncompatibleException(ex.message))
|
||||||
else ->
|
else -> {
|
||||||
|
val msg = ex.message ?: ex::class.java.canonicalName
|
||||||
throw CouldNotCreateDataSourceException(
|
throw CouldNotCreateDataSourceException(
|
||||||
"Could not create the DataSource: ${ex.message}",
|
"Could not create the DataSource: ${ex.message}",
|
||||||
NodeDatabaseErrors.FAILED_STARTUP,
|
NodeDatabaseErrors.FAILED_STARTUP,
|
||||||
cause = ex)
|
cause = ex,
|
||||||
|
parameters = listOf(msg))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user