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

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

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

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

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

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

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

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

Регистратор

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

Имя

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

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

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

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

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

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

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

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

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

Фильтры

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

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

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

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

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

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

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

Таблица 1 - Характеристики
РамкиТипПоддерживаемые уровни журналаСтандартные дополненияКомментарииСтоимость / Лицензия
Log4JПлатформа ведения журналаПРЕДУПРЕЖДЕНИЕ О ФАТАЛЬНОЙ ОШИБОКСлишком много, чтобы перечислить: см. Документация по приложениюШироко используется во многих проектах и ​​платформах. Log4j 1 был объявлен «End of Life» в 2015 году и был заменен на Log4j 2, который предоставляет API, который можно использовать с другими реализациями ведения журнала, а также с реализацией этого API.
Лицензия Apache, версия 2.0
API ведения журналов JavaПлатформа ведения журналаСЕРЬЕЗНОЕ ПРЕДУПРЕЖДЕНИЕ INFO CONFIG FINE FINER FINESTВиртуальная машина Java Java (JVM) Sun по умолчанию имеет следующее: ConsoleHandler, FileHandler, SocketHandler, MemoryHandler.Поставляется с JRE
tinylogПлатформа ведения журналаПРЕДУПРЕЖДЕНИЕ ОБ ОШИБКЕ ИНФОРМАЦИЯ ОБ ОТЛАДКЕConsoleWriter, FileWriter, LogcatWriter, JdbcWriter, RollingFileWriter, SharedFileWriter и ноль (удаляет все записи журнала) [1]Лицензия Apache, версия 2.0
ЛогбэкПлатформа ведения журналаПРЕДУПРЕЖДЕНИЕ ОБ ОШИБОКСлишком много, чтобы перечислить: см. Приложение JavaDocРазработан как замена log4j с множеством улучшений. Используется многочисленными проектами, обычно за slf4j, например Акка, Apache Camel, Apache Cocoon, Artifactory, Gradle, Подъемная рама, Play Framework, Скалатра, SonarQube, Весенний ботинок, ...LGPL, Версия 2.1
Ведение журнала Apache CommonsОбертка журналаПРЕДУПРЕЖДЕНИЕ О ФАТАЛЬНОЙ ОШИБОКЗависит от базовой структурыШироко используется, часто вместе с log4jЛицензия Apache, версия 2.0
SLF4JОбертка журналаПРЕДУПРЕЖДЕНИЕ ОБ ОШИБОКЗависит от базовой платформы, которая является подключаемой. Обеспечивает совместимость с API прокладки для пакетов журналирования JCL, JDK и log4j. Он также может использовать любой из них для генерации вывода. По умолчанию для вывода используется Logback, если он доступен.Широко используется во многих проектах и ​​платформах, часто с Logback в качестве реализации.Лицензия MIT

Соображения

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

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

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

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

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

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

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

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

  1. ^ "Руководство пользователя tinylog".
  2. ^ Сообщения API Log4j2
  3. ^ Поддержка Java 8 Lambda для ленивого ведения журнала
  4. ^ Как избежать ведения журнала Commons
  5. ^ Обзор Spring Logging
  6. ^ java.util.logging Обзор

внешняя ссылка