Логирование stacktrace в log4j: формат, timestamp и thread id
Быстрый ответ
Для записи stacktrace в log4j, используйте метод logger.error(String message, Throwable t). Это позволит вам передать как ваше собственное сообщение, так и полный stacktrace из исключения.
private static final Logger LOGGER = Logger.getLogger(YourClass.class);
try {
// Ваш код, который может потенциально вызвать ошибку
} catch (Exception e) {
LOGGER.error("Произошло исключение: Хьюстон, у нас проблемы", e);
}
Не забывайте указать уровень логирования как ERROR, чтобы фиксировать полный stacktrace, включая имена потоков выполнения.
Продвинутые методы логирования, о которых стоило узнать раньше
Давайте расширим наши знания в логировании и рассмотрим методы более детальной настройки.
Добавление контекста в блок catch
Превращаем блок catch в источник ценной информации для отладки, добавляя в него отметки времени и идентификаторы потоков.
catch (Exception e) {
LOGGER.error("Операция не удалась, произошла ошибка в {} в потоке {}",
new Date(),
Thread.currentThread().getName(), e);
}
Использование ExceptionUtils для работы со строками
Если вам требуется преобразовать stacktrace в строку, используйте Apache Commons Lang:
import org.apache.commons.lang3.exception.ExceptionUtils;
catch (Exception e) {
String stacktraceString = ExceptionUtils.getStackTrace(e);
LOGGER.error(stacktraceString);
}
Такой подход удобен для записи stacktrace в базу данных или для дальнейшей индивидуальной настройки.
Запрос stacktrace без исключений
Вы можете получить stacktrace даже без возникновения исключений для диагностики вашего приложения:
String diagnosticTrace = Arrays.stream(Thread.currentThread().getStackTrace())
.map(StackTraceElement::toString)
.collect(Collectors.joining(System.lineSeparator()));
LOGGER.error("Диагностический stacktrace:", diagnosticTrace);
Это приобретает особенную важность при выявлении сложно поддающихся обнаружению ошибок.
Визуализация
Представим stacktrace в виде почтальона, который надёжно предоставляет информацию об ошибках в log4j:
Почтальон (🚚): Доставка stacktrace 📦
Пункт назначения: Log4J 🔑
try {
riskyOperation();
} catch(Exception e) {
// 🚚 Ошибка перехвачена, загружаем stacktrace 📦
LOGGER.error("Непредвиденная ошибка:", e);
}
После доставки:
🚚➡️🔑: Stacktrace 📦 успешно сохранён в Log4J.
// Информация об ошибке готова для анализа.
Использование различных уровней логирования
Не ограничивайтесь только уровнем ERROR. Применяйте WARN и DEBUG в зависимости от обстоятельств.
LOGGER.warn("Это предупреждение, ошибка не столь серьёзна:", e);
Настраивая корректный вывод Log4j, вы улучшите восприятие сообщений об ошибках.
Использование общедоступных инструментов для работы со stacktrace
Используйте Apache Commons Lang или схожие инструменты для фильтрации нежелательной информации и акцентирования важного. Подключите необходимые библиотеки, используя Maven или Git.
Обращение внимания на Unicode
Оставайтесь бдительными по отношению к обработке Unicode, чтобы логи всегда отображались корректно.