Логирование stacktrace в log4j: формат, timestamp и thread id

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для записи stacktrace в log4j, используйте метод logger.error(String message, Throwable t). Это позволит вам передать как ваше собственное сообщение, так и полный stacktrace из исключения.

Java
Скопировать код
private static final Logger LOGGER = Logger.getLogger(YourClass.class);

try {
  // Ваш код, который может потенциально вызвать ошибку
} catch (Exception e) {
  LOGGER.error("Произошло исключение: Хьюстон, у нас проблемы", e);
}

Не забывайте указать уровень логирования как ERROR, чтобы фиксировать полный stacktrace, включая имена потоков выполнения.

Кинга Идем в IT: пошаговый план для смены профессии

Продвинутые методы логирования, о которых стоило узнать раньше

Давайте расширим наши знания в логировании и рассмотрим методы более детальной настройки.

Добавление контекста в блок catch

Превращаем блок catch в источник ценной информации для отладки, добавляя в него отметки времени и идентификаторы потоков.

Java
Скопировать код
catch (Exception e) {
  LOGGER.error("Операция не удалась, произошла ошибка в {} в потоке {}", 
               new Date(), 
               Thread.currentThread().getName(), e);
}

Использование ExceptionUtils для работы со строками

Если вам требуется преобразовать stacktrace в строку, используйте Apache Commons Lang:

Java
Скопировать код
import org.apache.commons.lang3.exception.ExceptionUtils;

catch (Exception e) {
  String stacktraceString = ExceptionUtils.getStackTrace(e);
  LOGGER.error(stacktraceString);
}

Такой подход удобен для записи stacktrace в базу данных или для дальнейшей индивидуальной настройки.

Запрос stacktrace без исключений

Вы можете получить stacktrace даже без возникновения исключений для диагностики вашего приложения:

Java
Скопировать код
String diagnosticTrace = Arrays.stream(Thread.currentThread().getStackTrace())
                               .map(StackTraceElement::toString)
                               .collect(Collectors.joining(System.lineSeparator()));
LOGGER.error("Диагностический stacktrace:", diagnosticTrace);

Это приобретает особенную важность при выявлении сложно поддающихся обнаружению ошибок.

Визуализация

Представим stacktrace в виде почтальона, который надёжно предоставляет информацию об ошибках в log4j:

Markdown
Скопировать код
Почтальон (🚚): Доставка stacktrace 📦
Пункт назначения: Log4J 🔑
Java
Скопировать код
try {
    riskyOperation();
} catch(Exception e) {
    // 🚚 Ошибка перехвачена, загружаем stacktrace 📦
    LOGGER.error("Непредвиденная ошибка:", e);
}

После доставки:

Markdown
Скопировать код
🚚➡️🔑: Stacktrace 📦 успешно сохранён в Log4J.
// Информация об ошибке готова для анализа.

Использование различных уровней логирования

Не ограничивайтесь только уровнем ERROR. Применяйте WARN и DEBUG в зависимости от обстоятельств.

Java
Скопировать код
LOGGER.warn("Это предупреждение, ошибка не столь серьёзна:", e);

Настраивая корректный вывод Log4j, вы улучшите восприятие сообщений об ошибках.

Использование общедоступных инструментов для работы со stacktrace

Используйте Apache Commons Lang или схожие инструменты для фильтрации нежелательной информации и акцентирования важного. Подключите необходимые библиотеки, используя Maven или Git.

Обращение внимания на Unicode

Оставайтесь бдительными по отношению к обработке Unicode, чтобы логи всегда отображались корректно.

Полезные материалы