Я заметил некоторую путаницу изначально с моим вопросом. Я не спрашиваю о том, как правильно настроить регистратор и как правильно использовать логгер, а как захватить всю информацию, которая была бы зарегистрирована на более низком уровне ведения журнала, чем текущий уровень ведения журнала в сообщении об исключении.
Я заметил два шаблона в Java для записи информации, которая может быть полезна разработчику при возникновении исключения.
Следующий шаблон кажется очень распространенным. В основном, вы просто должны иметь информацию журнала журнала в строке по мере необходимости, так что, когда возникает исключение, у вас есть трассировка журнала.
try {
String myValue = someObject.getValue();
logger.debug("Value: {}", myValue);
doSomething(myValue);
}
catch (BadThingsHappenException bthe) {
// consider this a RuntimeException wrapper class
throw new UnhandledException(bthe);
}
Недостатком вышеуказанного подхода является то, что если ваши пользователи требуют относительно тихих журналов и нуждаются в высоком уровне надежности до такой степени, что они просто не могут "повторить попытку в режиме отладки", сообщение об исключении содержит недостаточно данных для использования разработчиком.
Следующий шаблон - тот, который я видел, который пытается смягчить эту проблему, но кажется уродливым:
String myValue = null;
try {
myValue = someObject.getValue();
doSomething(myValue);
}
catch (BadThingsHappenException bthe) {
String pattern = "An error occurred when setting value. [value={}]";
// note that the format method below doesn't barf on nulls
String detail = MessageFormatter.format(pattern, myValue);
// consider this a RuntimeException wrapper class
throw new UnhandledException(detail, bthe);
}
Вышеприведенный шаблон, похоже, несколько решает проблему, однако я не уверен, что мне нравится объявлять так много переменных за пределами области try. Особенно, когда мне приходится иметь дело с очень сложными состояниями.
Единственный другой подход, который я видел, - это использование карты для хранения пар значений ключа, которые затем сбрасываются в сообщение об исключении. Я не уверен, что мне нравится этот подход, поскольку он, похоже, создает раздувание кода.
Есть ли там Java vodoo, которого я не вижу? Как вы обрабатываете информацию о состоянии исключения?