1. Общ преглед
Simple Logging Facade за Java (съкратено SLF4J) - действа като фасада за различни системи за регистриране (например java.util.logging, logback, Log4j). Той предлага общ API, който прави регистрирането независимо от действителното изпълнение.
Това позволява да съществуват различни рамки за регистриране. Той също така помага за мигриране от една рамка в друга. И накрая, освен стандартизиран API, той предлага и „синтактична захар“.
Тази статия ще обсъди зависимостите и конфигурацията, необходими за интегриране на SLF4J с Log4j2, Logback, Log4J2 и Jakarta Commons Logging. Повече за всяка от тези реализации можете да прочетете в статия Въведение в регистрирането на Java.
2. Настройката Log4j2
За да използвате SLF4J с Log4j2, трябва да добавите следните библиотеки към pom.xml :
org.apache.logging.log4j log4j-api 2.7 org.apache.logging.log4j log4j-core 2.7 org.apache.logging.log4j log4j-slf4j-impl 2.7
Най-новата версия можете да намерите тук: log4j-api, log4j-core, log4j-slf4j-impl.
Действителната конфигурация за регистриране се придържа към собствената конфигурация на Log4j 2. Нека да видим как се създава екземплярът на Logger :
public class SLF4JExample { private static Logger logger = LoggerFactory.getLogger(SLF4JExample.class); public static void main(String[] args) { logger.debug("Debug log message"); logger.info("Info log message"); logger.error("Error log message"); } }
Обърнете внимание, че Logger и LoggerFactory принадлежат към пакета org.slf4j . Пример за проект, работещ с обяснената конфигурация, е достъпен тук.
3. Настройката за регистрация
За да използвате SLF4J с Logback, не е необходимо да добавяте SLF4J към пътя си към класа. Обратната връзка вече използва SLF4J. Счита се за референтно изпълнение. Трябва само да включим библиотеката Logback:
ch.qos.logback logback-classic 1.1.7
Най-новата версия можете да намерите тук: logback-classic.
Конфигурацията е специфична за Logback, но работи безпроблемно със SLF4J. С правилните зависимости и конфигурация на място, същият код от предишните раздели може да се използва за обработка на регистрирането.
4 . Настройката Log4j
В предишните раздели разгледахме случай на употреба, където SLF4J „седи“ върху конкретната реализация на регистриране. Използван по този начин, той напълно абстрахира основната рамка.
Има случаи, когато съществуващо решение за регистриране не може да бъде заменено, например поради изисквания на трети страни. Това обаче не означава, че проектът е „осъден“ само на вече използваната рамка.
SLF4J може да бъде конфигуриран като мост, където извикванията към съществуваща рамка се пренасочват към него. Нека добавим необходимите зависимости, за да създадем мост за Log4j:
org.slf4j log4j-over-slf4j 1.7.30
С наличната зависимост (проверете за най-новото на log4j-over-slf4j), всички обаждания към Log4j ще бъдат пренасочени към SLF4J. Помислете за официалната документация, за да научите повече за свързването на съществуващите рамки.
Точно както при другите рамки Log4j може да служи като основна реализация. Нека добавим необходимите зависимости:
org.slf4j slf4j-log4j12 1.7.30 log4j log4j 1.2.17
Най-новата версия може да бъде намерена тук за slf4j-log4j12 и log4j. Примерен проект, конфигуриран по обяснения начин, е достъпен тук.
5. Настройка на JCL Bridge
В предишните раздели показахме как една и съща кодова база може да се използва за поддържане на регистриране с помощта на различни реализации. Въпреки че това е основното обещание и сила на SLF4J, това е и целта зад JCL (Джакарта Commons Logging или Apache Commons Logging).
JCL по своите намерения е рамка, подобна на SLF4J. Основната разлика е, че JCL разрешава основната реализация по време на изпълнение чрез система за зареждане на клас. Този подход се възприема проблематично в случаите, когато в играта има персонализирани товарачи на класове.
SLF4J решава своите обвързвания по време на компилация. Възприема се по-просто, но достатъчно мощно.
За щастие две рамки могат да работят заедно в режим на мост:
org.slf4j jcl-over-slf4j 1.7.30
Най-новата версия на зависимостите можете да намерите тук jcl-over-slf4j.
Както при другите случаи, същата кодова база ще работи добре. Пример за пълен проект, изпълняващ тази настройка, е наличен тук.
6. Допълнителни SLF4J доброта
SLF4J предоставя допълнително, което може да направи регистрирането по-ефективно и кода по-четлив. Например, SLF4J предоставя много полезен интерфейс за работа с параметри:
String variable = "Hello John"; logger.debug("Printing variable value: {}", variable);
Ето примера на кода на Log4j, който прави същото:
String variable = "Hello John"; logger.debug("Printing variable value: " + variable);
Както можете да видите, Log4j ще обединява низове, независимо дали нивото на отстраняване на грешки е активирано или не. При приложения с голямо натоварване това може да доведе до проблеми с производителността. SLF4J ще обединява низове само когато е разрешено нивото за отстраняване на грешки . За да направите същото с Log4J, трябва да добавите допълнителен блок if, който ще провери дали нивото за отстраняване на грешки е активирано или не:
String variable = "Hello John"; if (logger.isDebugEnabled()) { logger.debug("Printing variable value: " + variable); }
SLF4J стандартизира нивата на регистриране, които са различни за конкретните изпълнения. Нивото на регистрация на FATAL спадна (беше въведено в Log4j) въз основа на предпоставката, че в рамките на регистрация не трябва да решаваме кога дадено приложение трябва да бъде прекратено.
Използваните нива на регистриране са ERROR, WARN, INFO, DEBUG, TRACE . Можете да прочетете повече за използването им в статията Въведение в регистрирането на Java.
7. Заключение
SLF4J помага за безшумно превключване между регистриращи рамки. Той е прост, но гъвкав и позволява четливост и подобрения в производителността.
Както обикновено, кодът може да бъде намерен в GitHub. В допълнение, ние се позоваваме на два други проекта, посветени на различни статии, но съдържащи обсъдени конфигурации на дневника, тук и тук.