JEP 264: Platform Logging API and Service
API и сервис журналирования для платформы
| Ответственный | Daniel Fuchs |
| Тип | Feature |
| Область | SE |
| Статус | Closed / Delivered |
| Выпуск | 9 |
| Компонент | core-libs / java.util.logging |
| Обсуждение | core dash libs dash dev at openjdk dot java dot net |
| Трудоёмкость | M |
| Длительность | M |
| Связан с | 8140364: JEP 264: Platform Logging API and Service Implementation |
| Рецензенты | Alan Bateman, Brian Goetz, Mandy Chung |
| Одобрен | Brian Goetz |
| Создан | 2014/06/11 15:52 |
| Обновлён | 2017/07/24 15:51 |
| Задача | 8046565 |
Аннотация
Определить минимальный API журналирования, с помощью которого классы платформы могут записывать сообщения в журнал, и интерфейс сервиса для потребителей этих сообщений. Библиотека или приложение может предоставить реализацию этого сервиса, чтобы направлять журнальные сообщения платформы в выбранный фреймворк журналирования. Если реализация не предоставлена, используется реализация по умолчанию на основе API java.util.logging.
Цели
-
Определяется и используется в модуле
java.base, поэтому не может зависеть от APIjava.util.logging. -
Легко внедряется в приложения, которые используют внешний фреймворк журналирования, например SLF4J или Log4J.
-
Сократить зависимости от модуля
java.logging, чтобы упростить граф модулей JDK. -
Решает проблемы начальной загрузки, чтобы классы платформы могли записывать сообщения в журнал ещё до инициализации потребителя журнала.
-
По умолчанию записывает сообщения через API
java.util.logging, если присутствует модульjava.logging.
Что не является целью
-
Определить интерфейс журналирования общего назначения не является целью. Интерфейс сервиса содержит только минимальный набор методов, необходимых JDK для собственных нужд.
-
Поддержка программной настройки журналирования (установки уровней, файлов назначения и т. д.) через этот API не является целью.
-
Перевести все классы JDK на журналирование через этот новый API не является целью.
Мотивация
В отличие от API java.util.logging, большинство современных фреймворков журналирования (например, Log4J 2.0, Logback) разделены на фасад и реализацию. Приложение, которое ведёт журнал через такой внешний фреймворк, должно создавать логгеры и записывать сообщения через фасад, предоставляемый или поддерживаемый этим фреймворком.
Предлагаемый сервис позволяет приложениям настроить JDK на использование того же фреймворка журналирования, что и у приложения: для этого приложению достаточно предоставить реализацию сервиса, которая возвращает логгеры платформы, оборачивающие логгеры предпочитаемого фреймворка журналирования.
Приложение продолжит использовать фасад фреймворка журналирования, с которым оно работает. Сервис LoggerFinder позволяет настроить JDK на использование того же фреймворка.
Описание
С помощью API java.util.ServiceLoader находится общесистемная реализация LoggerFinder, которая загружается системным загрузчиком классов. Если конкретная реализация не найдена, используется внутренняя реализация сервиса LoggerFinder по умолчанию из JDK. Реализация сервиса по умолчанию использует java.util.logging как бэкенд, если присутствует модуль java.logging, поэтому по умолчанию журнальные сообщения, как и прежде, направляются в java.util.logging.Logger. Однако сервис LoggerFinder позволяет приложению или фреймворку подключить собственный внешний бэкенд журналирования без необходимости настраивать и java.util.logging, и этот бэкенд.
Реализация сервиса LoggerFinder должна позволять различать системные логгеры (используемые системными классами из загрузчика классов начальной загрузки, Bootstrap Class Loader (BCL)) и логгеры приложения (создаваемые приложением для собственных нужд). Это различие важно для безопасности платформы. Создатель логгера может передать LoggerFinder класс или модуль, для которого создаётся логгер, чтобы LoggerFinder мог определить, какой вид логгера вернуть.
Классы в JDK получают логгеры, созданные LoggerFinder, вызывая фабричные методы класса System:
package java.lang;
...
public class System {
System.Logger getLogger(String name) { ... }
System.Logger getLogger(String name, ResourceBundle bundle) { ... }
}
Внутренний API JDK sun.util.logging.PlatformLogger будет переработан так, чтобы выводить журнальные сообщения через системные логгеры, возвращаемые этими методами.
Тестирование
Будут добавлены новые тесты для проверки как сервиса LoggerFinder, так и отображения на бэкенд java.util.logging по умолчанию. Также нужно будет проверить, что подключение существующего внешнего фреймворка работает, особенно с учётом возможных проблем начальной загрузки.
Риски и допущения
Когда бэкендом служит java.util.logging, классы JDK, переведённые на системные логгеры, по-прежнему должны настраиваться через java.util.logging, как и раньше, и по возможности журнальные сообщения и уровни не должны меняться.
Некоторые API Java SE сейчас раскрывают типы java.util.logging в своих публичных сигнатурах. Это может помешать переводу этих API на журналирование через системные логгеры.