Платформа ведения журналов Java - Java logging framework

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

Ведение журнала относится к записи активности приложения и является распространенной проблемой для команд разработчиков. Фреймворки ведения журнала упрощают и стандартизируют процесс ведения журнала для платформы Java. В частности, они обеспечивают гибкость, избегая явного вывода на консоль (см. Приложение ниже). Место записи журналов становится независимым от кода и может быть настроено во время выполнения.

К сожалению, JDK не включал ведение журнала в свой первоначальный выпуск, поэтому к тому времени, когда был добавлен API ведения журнала Java, стали широко использоваться несколько других фреймворков ведения журнала, в частности, Apache Commons Logging (также известный как Java Commons Logging или JCL) и log4j . Это приводило к проблемам при интеграции различных сторонних библиотек (JAR), каждая из которых использовала разные платформы ведения журналов. Подключаемые фреймворки (оболочки) журналирования были разработаны для решения этой проблемы.

Обзор функциональности

Ведение журнала обычно разбивается на три основных части: средство ведения журнала, средство форматирования и приложение (или обработчик).

  • Регистратор отвечает за захват сообщения, которое должно быть зарегистрировано вместе с определенными метаданными, и передачу его в структуру ведения журнала.
  • После получения сообщения платформа вызывает средство форматирования с сообщением, которое форматирует его для вывода.
  • Затем платформа передает отформатированное сообщение соответствующему приложению / обработчику для удаления. Это может включать вывод на дисплей консоли, запись на диск, добавление в базу данных или создание электронного письма.

Более простые платформы ведения журнала, такие как Logging Framework от Object Guy , объединяют регистратор и приложение. Это упрощает работу по умолчанию, но менее настраиваемую, особенно если проект перемещается между средами.

Регистратор

Регистратор - это объект, который позволяет приложению вести журнал независимо от того, куда отправляется / сохраняется вывод. Приложение регистрирует сообщение, передавая объект или объект и исключение с необязательным уровнем серьезности в объект регистратора с заданным именем / идентификатором.

имя

У регистратора есть имя. Имя обычно имеет иерархическую структуру с точками (.), Разделяющими уровни. Распространенная схема - использовать имя класса или пакета, выполняющего ведение журнала. И log4j, и API ведения журналов Java поддерживают определение обработчиков на более высоком уровне иерархии.

Например, регистратор может называться " com.sun.some.UsefulClass ". Обработчик может быть определен для любого из следующего:

  • com
  • com.sun
  • com.sun.some
  • com.sun.some.UsefulClass

Пока где-то в этом стеке определен обработчик, может происходить протоколирование. Например, сообщение, зарегистрированное в com.sun.some.UsefulClass регистраторе, может быть записано com.sun обработчиком. Обычно существует глобальный обработчик, который принимает и обрабатывает сообщения, созданные любым регистратором.

Уровень опасности

Сообщение регистрируется на определенном уровне. Общие имена уровней копируются из Apache Commons Logging (хотя Java Logging API определяет разные имена уровней):

Общие уровни
Уровень Описание
ФАТАЛЬНЫЙ Серьезные ошибки, вызывающие преждевременное завершение работы. Ожидайте, что они будут немедленно видны на консоли состояния.
ОШИБКА Другие ошибки времени выполнения или неожиданные условия. Ожидайте, что они будут немедленно видны на консоли состояния.
ПРЕДУПРЕЖДЕНИЕ Использование устаревших API, плохое использование API, «почти» ошибки, другие ситуации выполнения, которые являются нежелательными или неожиданными, но не обязательно «неправильными». Ожидайте, что они будут немедленно видны на консоли состояния.
ИНФОРМАЦИЯ Интересные события во время выполнения (запуск / завершение работы). Ожидайте, что они будут сразу же видны на консоли, поэтому будьте консервативны и сведите к минимуму.
ОТЛАЖИВАТЬ подробная информация о потоке через систему. Ожидайте, что они будут записаны только в журналы.
TRACE более подробная информация. Ожидайте, что они будут записаны только в журналы.

Платформа ведения журнала поддерживает текущий уровень ведения журнала для каждого регистратора. Уровень ведения журнала можно установить более или менее ограничительным. Например, если уровень ведения журнала установлен на «ПРЕДУПРЕЖДЕНИЕ», то регистрируются все сообщения этого уровня или выше: ERROR и FATAL.

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

Фильтры

Фильтры приводят к тому, что событие журнала игнорируется или регистрируется. Наиболее часто используемый фильтр - это уровень ведения журнала, описанный в предыдущем разделе. Структуры ведения журнала, такие как Log4j 2 и SLF4J, также предоставляют маркеры, которые при присоединении к событию журнала также могут использоваться для фильтрации. Фильтры также могут использоваться для принятия или отклонения событий журнала на основе генерируемых исключений, данных в сообщении журнала, данных в ThreadLocal, который предоставляется через API ведения журнала, или множества других методов.

Средства форматирования, макеты или средства визуализации

Formatter - это объект, который форматирует данный объект. В основном это состоит из преобразования двоичного объекта в строковое представление. Каждая платформа определяет выходной формат по умолчанию, который при желании можно переопределить.

Добавители или обработчики

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

  • отображение на консоли
  • записать в файл или системный журнал
  • добавить в таблицу базы данных
  • распространять через службы обмена сообщениями Java
  • отправить по электронной почте
  • писать в сокет
  • сбросить в "битовое ведро" (/ dev / null)

Сравнение характеристик

Таблица 1 - Характеристики
Фреймворк Тип Поддерживаемые уровни журнала Стандартные дополнения Комментарии Стоимость / Лицензия
Log4J Платформа ведения журнала FATAL ERROR WARN INFO DEBUG TRACE Слишком много, чтобы перечислить: см. Документацию по Appender Широко используется во многих проектах и ​​платформах. Log4j 1 был объявлен «End of Life» в 2015 году и был заменен на Log4j 2, который предоставляет API, который можно использовать с другими реализациями ведения журналов, а также с реализацией этого API.
Лицензия Apache, версия 2.0
API ведения журналов Java Платформа ведения журнала SEVERE WARNING INFO CONFIG FINE FINER FINEST Виртуальная машина Java Java (JVM) Sun по умолчанию имеет следующее: ConsoleHandler, FileHandler, SocketHandler, MemoryHandler. Поставляется с JRE
tinylog Платформа ведения журнала ERROR WARNING INFO DEBUG TRACE ConsoleWriter, FileWriter, LogcatWriter, JdbcWriter, RollingFileWriter, SharedFileWriter и null (отбрасывает все записи журнала) Лицензия Apache, версия 2.0
Логбэк Платформа ведения журнала ERROR WARN INFO DEBUG TRACE Слишком много, чтобы перечислить: см. Appender JavaDoc Разработан как замена log4j с множеством улучшений. Используется многочисленными проектами, как правило, за slf4j, например Akka , Apache Camel , Apache Cocoon , Artifactory , Gradle , Lift Framework , Play Framework , Scalatra , SonarQube , Spring Boot , ... LGPL , версия 2.1
Ведение журнала Apache Commons (JCL) Обертка журнала FATAL ERROR WARN INFO DEBUG TRACE Зависит от базовой структуры Широко используется, часто вместе с log4j Лицензия Apache, версия 2.0
SLF4J Обертка журнала ERROR WARN INFO DEBUG TRACE Зависит от базовой платформы, которая является подключаемой. Предоставляет совместимые с API прокладки для пакетов журналов JCL, JDK и log4j. Он также может использовать любой из них для генерации вывода. По умолчанию для вывода используется Logback, если он доступен. Широко используется во многих проектах и ​​платформах, часто с Logback в качестве реализации. Лицензия MIT

Соображения

JCL и Log4j очень распространены просто потому, что они существуют так долго и долгое время были единственными вариантами. Гибкость slf4j (с использованием Logback внизу) сделала его популярным выбором.

SLF4J - это набор оболочек (или прокладок) журналирования, которые позволяют имитировать любую из других платформ. Таким образом, в приложение можно включить несколько сторонних библиотек, независимо от того, какую платформу ведения журнала выбрала каждая. Однако весь вывод журнала генерируется стандартным способом, обычно через Logback.

Log4j 2 предоставляет как API, так и реализацию. API может быть перенаправлен на другие реализации ведения журнала, аналогичные тому, как работает SLF4J. В отличие от SLF4J, API Log4j 2 регистрирует объекты сообщений вместо строк для дополнительной гибкости, а также поддерживает лямбда-выражения Java.

JCL на самом деле не является фреймворком для ведения журналов, а его оболочкой. Таким образом, он требует наличия фреймворка под ним, хотя по умолчанию он может использовать собственное средство ведения SimpleLog журнала.

JCL, SLF4J и Log4j 2 API полезны при разработке повторно используемых библиотек, которым необходимо записывать в любую базовую систему ведения журнала, используемую приложением. Это также обеспечивает гибкость в гетерогенных средах, где структура ведения журнала может измениться, хотя в большинстве случаев после выбора структуры ведения журнала нет необходимости в ее изменении в течение всего срока реализации проекта. SLF4J и Log4j 2 выигрывают от того, что они новее и основаны на уроках, извлеченных из старых фреймворков. Более того, у JCL есть известные проблемы с загрузчиками классов при определении того, какую библиотеку протоколирования следует обернуть, которая теперь заменила JCL.

API ведения журналов Java предоставляется вместе с Java. Хотя API технически отделен от реализации по умолчанию, предоставляемой с Java, замена его альтернативной реализацией может быть сложной задачей, поэтому многие разработчики путают эту реализацию с API ведения журналов Java. Конфигурация осуществляется только внешними файлами, которые нелегко изменить на лету (другие платформы поддерживают программную конфигурацию). Реализация по умолчанию предоставляет только несколько обработчиков и форматировщиков, что означает, что большинству пользователей придется писать свои собственные.

Смотрите также

Рекомендации

внешние ссылки