Настройка форматирования вывода 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 – текст сообщения и информация об исключении.

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

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

Общие настройки проекта через 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.