Почему Alibaba запрещает инженерам напрямую использовать API в системах логирования (Log4j, Logback)

Java

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

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

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

Во-первых, давайте посмотрим, какие фреймворки широко используются в настоящее время.

Общая структура ведения журнала

j.u.l

 j.u.l — это аббревиатура пакета java.util.logging, представляющего собой собственную среду ведения журналов Java, представленную JDK в версии 1.4. Java Logging API предоставляет семь уровней ведения журнала для управления выводом. Семь уровней: СЕРЬЕЗНЫЙ, ПРЕДУПРЕЖДЕНИЕ, ИНФОРМАЦИЯ, КОНФИГУРАЦИЯ, ХОРОШЕЕ, ТОЧНОЕ, ЛУЧШЕЕ.

Log4j

Log4j – это проект Apache с открытым исходным кодом. Используя Log4j, мы можем контролировать место назначения доставки информации журнала на консоли, в файлы, компоненты графического интерфейса пользователя и даже на серверы сокетов, регистраторы событий NT, демоны системного журнала UNIX и т. д. формат каждого журнала можно контролировать; определяя уровень информации каждого журнала, мы можем более подробно контролировать процесс создания журнала. Самое интересное, что их можно гибко настроить через конфигурационный файл без изменения кода приложения.

Log4 также имеет семь уровней журнала: OFF, FATAL, ERROR, WARN, INFO, DEBUG и TRACE.

LogBack

LogBack также является очень зрелой структурой ведения журналов.На самом деле, LogBack и Log4j созданы одним и тем же человеком, Чеки Гюльджю.

logback в настоящее время разделен на три модуля: logback-core, logback-classic и logback-access. logback-core является базовым модулем для двух других модулей. logback-classic — это улучшенная версия Log4j. Кроме того, logback-classic полностью реализует SLF4J API, так что вы можете легко перейти на другие системы ведения журналов, такие как Log4j или j.u.l. Модуль доступа к журналу интегрируется с контейнером сервлета, чтобы обеспечить функцию доступа к журналу через Http.

Log4j2

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

О том, какие проблемы Log4j решает Log4j2, и о преимуществах Log4j2 по сравнению с Log4j, j.u.l и logback, мы расскажем в следующих статьях.

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

Я не знаю, сколько людей прочитали «Руководство по разработке Java для Alibaba», в котором есть спецификация, которая устанавливает «обязательные» требования:

-w922

Было сказано, что вышеупомянутые четыре широко используемые среды ведения журналов обеспечивают удобство для приложений Java для записи журналов, так почему бы не разрешить использование их API непосредственно в приложениях? Что здесь используется SLF4J? Что такое так называемый узор фасада?

Что такое бревенчатый фасад

Бревенчатый фасад — типичное применение фасадного рисунка.

Фасадный паттерн (Facade Pattern), также известный как Фасадный паттерн, его ядро ​​состоит в следующем: внешняя связь с подсистемой должна осуществляться через единый объект Фасад, что упрощает использование подсистемы.

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

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

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

Зачем нужен бревенчатый фасад

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

Некоторые люди могут спросить, если я изменю фреймворк логирования, приложение менять не нужно, а фасад логирования все равно нужно менять?

Чтобы ответить на этот вопрос, давайте возьмем пример, а затем заново объясним рисунок фасада.

Бревенчатый фасад — как официант в ресторане, а бревенчатый каркас — как повар на задней кухне. Для приложения клиента, когда я заказываю еду в ресторане, мне нужно только сказать официанту, что я хочу тарелку томатной яичницы, и меня не волнует все на кухне. Потому что хотя шеф-повар сменился с шеф-повара А, который назвал это блюдо «омлетом с помидорами», на шеф-повара Б, который назвал его «яичница-болтунья с помидорами». Впрочем, клиенту не нужно заботиться, ему достаточно отдать заказ «яичницы с помидорами» официанту, а официант переведет его повару.

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

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

Вышеперечисленное является одним из наиболее важных преимуществ бревенчатого фасада – развязкой.

Общий бревенчатый фасад

После ознакомления с концепциями и преимуществами фасадов ведения журналов давайте посмотрим, какие хорошие реализации фасадов ведения журналов доступны в экосистеме Java.

SLF4J

Java Simple Logging Facade (Простой логгинг-фасад для Java, сокращенно SLF4J) — это набор интерфейсных программ, обертывающих фреймворк логирования, реализованный в режиме внешнего вида. Вы можете решить, какую платформу ведения журналов использовать во время развертывания программного обеспечения.В настоящее время основными поддерживаемыми платформами являются Java Logging API, Log4j и logback. Выпущено по лицензии MIT.

Автором SLF4J является Ceki Gülcü, автор Log4j, который утверждает, что SLF4J более эффективен, чем Log4j, проще и стабильнее, чем Apache Commons Logging (JCL).

На самом деле, SLF4J — это всего лишь фасадная служба, а не настоящая инфраструктура журналов. Реализация вывода реального журнала по-прежнему зависит от фреймворков журналов, таких как Log4j и logback.

Поскольку SLF4J используется чаще, я буду использовать здесь больше места, а затем кратко проанализирую SLF4J, главным образом, чтобы сравнить его с Log4J. По сравнению с Log4J API SLF4J имеет следующие преимущества:

  • Log4j предоставляет шесть уровней записи TRACE, DEBUG, INFO, WARN, ERROR и FATAL, но SLF4J считает, что между ERROR и FATAL нет существенной разницы, поэтому уровень FATAL удаляется, оставляя только остальные пять.

  • Большинство людей напишет logger.error(Exception) в программе, на самом деле в это время Log4j перейдет к этому исключению в строку. Настоящим методом записи должен быть logger(message.exception), и SLF4J не заставит программистов совершать эту ошибку.

  • Log4j косвенно поощряет программистов использовать метод добавления строк (этот метод имеет проблемы с производительностью), но SLF4J не будет иметь этой проблемы, вы можете использовать logger.error("{} is+serviceid", serviceid) ;

  • С помощью SLF4J можно легко использовать различные jar-файлы коллективной реализации, которые он предоставляет. (похоже на commons-logger)

  • Слияние из commons-logger и Log4j очень удобно, и SLF4J также предоставляет свинг-инструмент, который поможет вам выполнить это слияние.

  • Более эффективно реализовать функцию замены строкового содержимого следующим образом:

    // 传统的字符串产生方式,如果没有要记录Debug等级的信息,就会浪费时间在产生不必要的信息上
    logger.debug("There are now " + count + " user accounts: " + userAccountList);
    
    // 为了避免上述问题,我们可以先检查是不是开启了Debug信息记录功能,只是程序的编码会比较复杂
    if (logger.isDebugEnabled()) {
        logger.debug("There are now " + count + " user accounts: " + userAccountList);
    }
    
    // 如果Debug等级没有开启,则不会产生不必要的字符串,同时也能保持程序编码的简洁
    logger.debug("There are now {} user accounts: {}", count, userAccountList); 
    
  • SLF4J поддерживает только MDC, но не NDC.

commons-logging

Apache Commons Logging — это утилита ведения журнала на основе Java, модель программирования для ведения журнала и другие наборы инструментов. Он предоставляет API, реализацию ведения журнала и реализацию оболочки с помощью некоторых других инструментов.

Функции commons-log и SLF4J схожи, и они в основном используются для логирования фасада. Предоставляйте более удобные инструменты API.

Суммировать

В экосистеме Java существует множество зрелых решений для ведения журналов. Что касается вывода журнала, существует два основных типа инструментов.

Одним из них является структура журнала, которая в основном используется для вывода журнала, например, в какой файл выводить и каков формат журнала. Другой тип — это бревенчатый фасад, который в основном представляет собой набор общих API-интерфейсов для защиты различий между различными фреймворками бревен.

Поэтому для Java-инженеров наилучшей практикой использования инструментов ведения журналов является использование комбинации, такой как Log4j + SLF4J, для вывода журнала в приложении.

Самым большим преимуществом этого является то, что при разработке бизнес-уровня не нужно заботиться о реализации и деталях базовой среды ведения журналов, а также не нужно учитывать стоимость изменения среды в будущем при кодировании. Это также является преимуществом фасадного рисунка.

Подводя итог, не используйте API какой-либо среды ведения журнала, такой как Log4j, в своем коде Java, а напрямую используйте фасад ведения журнала SLF4J.