ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Автоматический вывод номеров строк в лог Java

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

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

Для того чтобы в логах выводились номера строк, внесите токен %L в конфигурацию вашего логера Log4j или SLF4J. Необходимо лишь применить стандартные методы логирования, например, logger.info, и номера строк автоматом будут вписаны в логи.

Java
Скопировать код
Logger logger = LogManager.getLogger(LogExample.class);
logger.info("Сообщение с номером строки"); // Номер строки добавится автоматически

Приведите в соответствие ваш log4j2.xml:

xml
Скопировать код
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36}:%L – %msg%n"/>

Тут токен %L используется для добавления номера строки в лог.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Разбор роли номеров строк в логах

Номера строк в логе – отличный инструмент навигации, который поможет быстро найти место возникновения проблемы в коде. Разберем это подробнее.

Применение StackTrace для номеров строк

Даже при отсутствии сторонних систем логирования, вы всегда можете отслеживать номера строк с использованием StackTrace. Это полезный и важный функционал!

Java
Скопировать код
int lineNumber = Thread.currentThread().getStackTrace()[2].getLineNumber();
logger.info("У Oracle есть чувство юмора, номер строки: " + lineNumber); // Небольшой эксперимент с кодом

Придайте однородность логам c помощью собственного Logger

Создайте свой класс Logger, который будет автоматически добавлять номер строки перед каждым сообщением. Таким образом, логирование будет единообразным:

Java
Скопировать код
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(), и в ваших логах будут указаны класс, метод и номер строки.

Регулируйте глубину детализации ваших логов

Не всегда нужны подробные записи. Глубину детализации логов можно контролировать с помощью специального флага:

Java
Скопировать код
private static final boolean detailedLogs = true; // Иногда лучше меньше, но лучше

if(detailedLogs) {
    LineNumberLogger.info("Подробное сообщение в логе"); // Ваш персональный гид в мире логирования
}

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

Представьте, что каждый файл лога это набор деталей LEGO, где каждый блок символизирует строку кода:

Markdown
Скопировать код
🎛️  [Строка 100] Блок 100: "Операции по подготовке заказа к отправке..."
🎛️  [Строка 200] Блок 200: "Платеж по заказу №1234 обработан успешно"
🎛️  [Строка 300] Блок 300: "Пользователь без лишних сложностей вышел из системы."

Номера строк позволят вам быстро выявить где в коде произошли определенные события!

plaintext
Скопировать код
"Где обнаружена ошибка?" 🧐
"Вот она, на блоке 200!" 🎯

Эффективно и удобно, как-будто у вас есть GPS для вашего кода!

Принципы использования номеров строк

Номера строк экономят ваше время, предоставляя точные указатели для поиска и устранения ошибок, что особенно актуально во время отладки или анализа после сбоев.

Хорошее...

Автоматическое добавление номеров строк снижает вероятность ошибок и облегчает поддержку кода. Детализированные логи с номерами строк делают процесс отладки и решения скрытых проблем гораздо проще.

Плохое...

Однако нужно быть осторожными: в условиях, когда каждая миллисекунда имеет значение, номера строк в логах могут исключаться с целью снижения нагрузки и сохранения производительности.

И еще плохое...

И, конечно, слишком глубокая детализация может сделать логи непонятными. Логи, заполненные только номерами строк и без осмысленных сообщений, бесполезны.

Полезные ссылки

  1. Log4j – Log4j 2 Layouts — описание PatternLayout в Log4j 2 и работа с номерами строк.
  2. Just a moment... — подробное руководство на Baeldung по добавлению номеров строк в Log4j.
  3. LogRecord (Java Platform SE 8 ) — документация по Java Logging API, где описано как указывать исходные классы и методы.
  4. Chapter 6: Layouts — руководство по макетам Logback Layouts и применению номеров строк в логировании.
  5. Log4j – Log4j 2 Lock-free Asynchronous Loggers for Low-Latency Logging — использование асинхронных логгеров Log4j 2 для увеличения производительности без потери информации о номерах строк.
  6. java – How can I convert a stack trace to a string? – Stack Overflow — обсуждение о том, как преобразовать стек вызовов в строку для логирования.