Логирование в Java: основы и лучшие практики
Основы логирования в Java
В этом руководстве мы изучим логирование в Java и его различные компоненты с помощью примеров.
Java позволяет создавать и захватывать сообщения логов и файлы через процесс логирования.
В Java логирование требует фреймворков и API. У Java есть встроенный фреймворк логирования в пакете java.util.logging.
Мы также можем использовать сторонние фреймворки, такие как Log4j, Logback и многие другие для целей логирования.
Компоненты логирования в Java
На рисунке ниже изображены основные компоненты и поток управления Java Logging API (java.util.logging).

1. Logger (Логгер)
Класс Logger предоставляет методы для логирования. Мы можем инстанцировать объекты из класса Logger и вызывать его методы для целей логирования.
Пример:
Logger logger = Logger.getLogger("newLoggerName");
Метод getLogger() класса Logger используется для поиска или создания нового Logger. Строковый аргумент определяет имя логгера.
Здесь это создает новый объект Logger или возвращает существующий Logger с тем же именем.
Существует соглашение определять Logger после текущего класса, используя class.getName().
Logger logger = Logger.getLogger(MyClass.class.getName());
NullPointerException, если переданное имя null.У каждого Logger есть уровень, определяющий важность сообщения лога. Существует 7 основных уровней логирования:
| Уровень лога (по убыванию) | Использование |
|---|---|
| SEVERE | серьезный сбой |
| WARNING | предупреждение, потенциальная проблема |
| INFO | общая информация о выполнении |
| CONFIG | информация о конфигурации |
| FINE | общая информация разработчика (трассировка) |
| FINER | подробная информация разработчика (трассировка) |
| FINEST | высокодетализированная информация разработчика (трассировка) |
| OFF | отключить логирование для всех уровней |
| ALL | включить логирование для всех уровней |
У каждого уровня лога есть целочисленное значение, определяющее их серьезность, кроме двух специальных уровней OFF и ALL.
Логирование сообщения
По умолчанию всегда логируются верхние три уровня. Чтобы установить другой уровень, используем следующий код:
logger.setLevel(Level.LogLevel); // пример logger.setLevel(Level.FINE);
В этом примере только уровень FINE и уровни выше него устанавливаются для логирования. Все остальные сообщения отбрасываются.
Теперь для логирования сообщения используем метод log().
logger.log(Level.LogLevel, "log message"); // пример logger.log(Level.INFO, "This is INFO log level message");
Существуют сокращенные методы для логирования на желаемых уровнях.
logger.info("This is INFO log level message"); logger.warning("This is WARNING log level message");
Все запросы лога, прошедшие установленный уровень, затем передаются в LogRecord.
null, его уровень наследуется от родителя и так далее вверх по дереву.2. Фильтры (Filters)
Фильтр (если он присутствует) определяет, должен ли LogRecord быть передан дальше или нет. Как следует из названия, он фильтрует сообщения лога согласно конкретным критериям.
LogRecord передается от логгера к обработчику и от обработчика к внешним системам только если он проходит указанные критерии.
// установить фильтр logger.setFilter(filter); // получить фильтр Filter filter = logger.getFilter();
3. Обработчики (Handlers / Appenders)
Обработчик лога или аппендеры получают LogRecord и экспортируют его в различные цели.
Java SE предоставляет 5 встроенных обработчиков:
| Обработчики | Использование |
|---|---|
StreamHandler | записывает в OutputStream |
ConsoleHandler | записывает в консоль |
FileHandler | записывает в файл |
SocketHandler | записывает в удаленные TCP порты |
MemoryHandler | записывает в память |
Обработчик может передать LogRecord фильтру, чтобы снова определить, можно ли передать его во внешние системы.
Чтобы добавить новый обработчик, используем:
logger.addHandler(handler); // пример Handler handler = new ConsoleHandler(); logger.addHandler(handler);
Чтобы удалить обработчик:
logger.removeHandler(handler); // пример Handler handler = new ConsoleHandler(); logger.addHandler(handler); logger.removeHandler(handler);
У логгера может быть несколько обработчиков. Чтобы получить все обработчики:
Handler[] handlers = logger.getHandlers();
4. Форматтеры (Formatters)
Обработчик также может использовать Formatter для форматирования объекта LogRecord в строку перед экспортом во внешние системы.
Java SE имеет два встроенных Formatters:
| Форматтеры | Использование |
|---|---|
SimpleFormatter | форматирует LogRecord в строку |
XMLFormatter | форматирует LogRecord в XML форму |
Мы можем использовать следующий код для форматирования обработчика:
// форматирует в строковую форму handler.setFormatter(new SimpleFormatter()); // форматирует в XML форму handler.setFormatter(new XMLFormatter());
LogManager
Объект LogManager отслеживает глобальную информацию логирования. Он читает и поддерживает конфигурацию логирования и экземпляры логгеров.
Log manager — синглтон, то есть инстанцируется только один экземпляр.
Чтобы получить экземпляр log manager:
LogManager manager = LogManager.getLogManager();
Преимущества логирования
Вот некоторые преимущества логирования в Java.
- помогает в мониторинге потока программы
- помогает в захвате любых ошибок, которые могут возникнуть
- обеспечивает поддержку диагностики проблем и отладки
java
- Освоение операторов Java: типы, синтаксис и практические примеры
- Комментарии в Java: типы, использование и лучшие практики
- Освоение улучшенного цикла for в Java: синтаксис, примеры и лучшие практики
- Освоение строк в Java: создание, методы и лучшие практики
- Интерфейсы в Java: концепции, реализация и лучшие практики
- Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
- Try-with-resources в Java: автоматическое управление ресурсами
- Аннотации в Java: типы, размещение и практические примеры
- Assertions в Java: практическое руководство по обнаружению багов и обеспечению надежности кода
- Понимание Java Vector: использование, особенности и сравнение с ArrayList