Настройка форматирования вывода java.util.logging в Java

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

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

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

Хотите сделать вывод логов более компактным? Для этого создайте свой java.util.logging.Formatter и переопределите метод format так, чтобы он объединял информацию логов без перевода строки. Затем установите его для обработчиков и наслаждайтесь логами, записанными в одну строку.

Пример кода для определения нового форматтера:

Java
Скопировать код
import java.util.logging.*;

public class OneLinerFormatter extends Formatter {
    @Override
    public String format(LogRecord rec) {
        // Формируем логи в виде одной строки
        return rec.getLevel() + " " + rec.getMessage() + "\n";
    }
}

Чтобы воспользоваться этим форматтером, вызовите следующие строки кода:

Java
Скопировать код
Logger logger = Logger.getLogger("compactLogger");
ConsoleHandler ch = new ConsoleHandler();
ch.setFormatter(new OneLinerFormatter()); // Однострочный вывод логов готов!
logger.addHandler(ch);
logger.info("Лог записан в одну строку!"); // Наслаждаемся результатом!
Кинга Идем в IT: пошаговый план для смены профессии

Быстрое решение при помощи SimpleFormatter

Желаете настроить SimpleFormatter так, чтобы он формировал все записи в один ряд? Воспользуйтесь параметром java.util.logging.SimpleFormatter.format и задайте шаблон работы SimpleFormatter.

Используйте следующую команду для консоли:

Bash
Скопировать код
-Djava.util.logging.SimpleFormatter.format="%1$tF %1$tT %4$s %2$s %5$s%6$s%n"

Подробности о заполнителях в данной команде:

  • %1$tF %1$tT – дата и время события,
  • %4$s – уровень серьёзности сообщения,
  • %2$s – источник сообщения,
  • %5$s%6$s – текст сообщения и информация об исключении.

Данную настройку стоит применять до инициализации каких-либо логгеров в приложении.

Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

Выход на новый уровень конфигурации

Общие настройки проекта через logger.properties

Чтобы установить формат логирования для всего проекта, задайте свой шаблон в файле logger.properties:

properties
Скопировать код
java.util.logging.SimpleFormatter.format=%1$tF %1$tT %4$s %2$s %5$s%6$s%n

Данная конфигурация обеспечивает единый формат вывода логов для всего вашего приложения.

Динамическая настройка

Хотите изменить формат логов в реальном времени? Воспользуйтесь методом System.setProperty:

Java
Скопировать код
System.setProperty("java.util.logging.SimpleFormatter.format",
                   "%1$tF %1$tT %4$s %2$s %5$s%6$s%n");

Учтите, что данное действие должно быть выполнено до начала работы логгеров.

Создание собственных форматтеров

Использование MessageFormat и Formatter

Если перед вами вставили сложную задачу, требующую нестандартного решения, вы можете использовать MessageFormat в сочетании с Formatter для создания пользовательских шаблонов вывода логов. Вы сможете настроить их в соответствии с конкретными требованиями или стандартами, например, форматом JSON.

Класс SingleLineFormatter для индивидуальных потребностей

Если вашей задаче требуется особый подход, вы можете использовать класс SingleLineFormatter:

Java
Скопировать код
import java.util.logging.*;
import java.util.*;

public class SingleLineFormatter extends SimpleFormatter {
    private static final String pattern = "%1$tF %1$tT %4$s %2$s %5$s%6$s%n";

    @Override
    public synchronized String format(LogRecord lr) {
        return String.format(pattern,
                new Date(lr.getMillis()),
                lr.getSourceClassName() + "." + lr.getSourceMethodName(),
                lr.getLoggerName(),
                lr.getLevel().getLocalizedName(),
                lr.getMessage(),
                Optional.ofNullable(lr.getThrown()).map(Throwable::toString).orElse(""));
    }
}

Примените этот класс в настройках логгеров для улучшения форматирования логов.

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

Markdown
Скопировать код
😵💭 До конфигурации: логи были хаотичными и разбросанными по множеству строк.
🎇💭 После конфигурации: они стали чёткими и уложенными в одну строку.

Как это выглядит на практике?

plaintext
Скопировать код
Логи в несколько строк:         Логи в одну строку:
[INFO] Старт приложения        [INFO] Старт приложения | [DEBUG] Запуск модуля | [ERROR] Ошибка указателя
[DEBUG] Запуск модуля           ---------------------------------------------------------------------------
[ERROR] Ошибка указателя

Создание собственного форматтера в Java преобразовывает хаотический вывод логов в наглядную последовательность.

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

  1. java.util.logging (Java Platform SE 8) — подробное руководство Oracle по логированию в Java.
  2. Chapter 2: Архитектура — изучите структуру и скрытые возможности Logback.
  3. Java Logging — Якоб Йенков рассказывает о принципах логирования в Java.
  4. Chapter 6: Раскладки — узнайте о раскладках в Logback.
  5. Руководство по SLF4J — полезная информация о SLF4J из первых рук.
  6. Учебник по Java Logging API — всё о продвинутом логировании в Java с помощью Log4j2.