Автоматический вывод номеров строк в лог Java
Быстрый ответ
Для того чтобы в логах выводились номера строк, внесите токен %L
в конфигурацию вашего логера Log4j или SLF4J. Необходимо лишь применить стандартные методы логирования, например, logger.info
, и номера строк автоматом будут вписаны в логи.
Logger logger = LogManager.getLogger(LogExample.class);
logger.info("Сообщение с номером строки"); // Номер строки добавится автоматически
Приведите в соответствие ваш log4j2.xml:
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36}:%L – %msg%n"/>
Тут токен %L
используется для добавления номера строки в лог.
Разбор роли номеров строк в логах
Номера строк в логе – отличный инструмент навигации, который поможет быстро найти место возникновения проблемы в коде. Разберем это подробнее.
Применение StackTrace для номеров строк
Даже при отсутствии сторонних систем логирования, вы всегда можете отслеживать номера строк с использованием StackTrace
. Это полезный и важный функционал!
int lineNumber = Thread.currentThread().getStackTrace()[2].getLineNumber();
logger.info("У Oracle есть чувство юмора, номер строки: " + lineNumber); // Небольшой эксперимент с кодом
Придайте однородность логам c помощью собственного Logger
Создайте свой класс Logger, который будет автоматически добавлять номер строки перед каждым сообщением. Таким образом, логирование будет единообразным:
public class LineNumberLogger { // Ваш незаменимый помощник в логировании
private static final Logger logger = LogManager.getLogger(LineNumberLogger.class);
public static void info(String message) {
StackTraceElement ste = Thread.currentThread().getStackTrace()[2]; // Он облегчит рутину
logger.info(ste.getFileName() + ":" + ste.getLineNumber() + " – " + message);
}
// Аналогичным образом добавьте методы для debug, warn, error и других уровней логирования.
}
Воспользуйтесь LineNumberLogger.info()
, и в ваших логах будут указаны класс, метод и номер строки.
Регулируйте глубину детализации ваших логов
Не всегда нужны подробные записи. Глубину детализации логов можно контролировать с помощью специального флага:
private static final boolean detailedLogs = true; // Иногда лучше меньше, но лучше
if(detailedLogs) {
LineNumberLogger.info("Подробное сообщение в логе"); // Ваш персональный гид в мире логирования
}
Визуализация
Представьте, что каждый файл лога это набор деталей LEGO, где каждый блок символизирует строку кода:
🎛️ [Строка 100] Блок 100: "Операции по подготовке заказа к отправке..."
🎛️ [Строка 200] Блок 200: "Платеж по заказу №1234 обработан успешно"
🎛️ [Строка 300] Блок 300: "Пользователь без лишних сложностей вышел из системы."
Номера строк позволят вам быстро выявить где в коде произошли определенные события!
"Где обнаружена ошибка?" 🧐
"Вот она, на блоке 200!" 🎯
Эффективно и удобно, как-будто у вас есть GPS для вашего кода!
Принципы использования номеров строк
Номера строк экономят ваше время, предоставляя точные указатели для поиска и устранения ошибок, что особенно актуально во время отладки или анализа после сбоев.
Хорошее...
Автоматическое добавление номеров строк снижает вероятность ошибок и облегчает поддержку кода. Детализированные логи с номерами строк делают процесс отладки и решения скрытых проблем гораздо проще.
Плохое...
Однако нужно быть осторожными: в условиях, когда каждая миллисекунда имеет значение, номера строк в логах могут исключаться с целью снижения нагрузки и сохранения производительности.
И еще плохое...
И, конечно, слишком глубокая детализация может сделать логи непонятными. Логи, заполненные только номерами строк и без осмысленных сообщений, бесполезны.
Полезные ссылки
- Log4j – Log4j 2 Layouts — описание PatternLayout в Log4j 2 и работа с номерами строк.
- Just a moment... — подробное руководство на Baeldung по добавлению номеров строк в Log4j.
- LogRecord (Java Platform SE 8 ) — документация по Java Logging API, где описано как указывать исходные классы и методы.
- Chapter 6: Layouts — руководство по макетам Logback Layouts и применению номеров строк в логировании.
- Log4j – Log4j 2 Lock-free Asynchronous Loggers for Low-Latency Logging — использование асинхронных логгеров Log4j 2 для увеличения производительности без потери информации о номерах строк.
- java – How can I convert a stack trace to a string? – Stack Overflow — обсуждение о том, как преобразовать стек вызовов в строку для логирования.