Водич за Јава програмере

Један од најважнијих делова процеса развоја софтвера је правилно евидентирање. Са доста различитих Јава оквира за евидентирање доступних, важно је одабрати онај који је једноставан за коришћење. У исто време, оквир по вашем избору треба да има високе перформансе, прошириве карактеристике и омогућава прилагођавање. Лог4ј2 је бесплатна Јава библиотека за евидентирање која испуњава сва поља.

Интеграција Лог4ј2 са било којом апликацијом откључава опције као што су напредно филтрирање, Јава 8 ламбда подршка, тражење својстава и прилагођени нивои евиденције. Хајде да погледамо како можете додати Лог4ј2 својим пројектима и које функције вам могу помоћи да останете на врху своје игре.

Шта је Лог4ј2?

Евидентирање је метод прикупљања корисних информација, познатих као евиденције, које се касније могу референцирати и анализирати. Можете да користите евиденције за брзо отклањање грешака кода апликације. Дневници апликација помажу у разумевању тока кода и решавању проблема и грешака у производњи.

Осим дијагностичких случајева употребе, евиденције се такође користе у сврхе ревизије—на пример, праћење да ли је порука обавештења успешно послата кориснику.

Лог4ј2 је једна од најпопуларнијих Јава библиотека за евидентирање. То је наследник веома утицајне библиотеке Лог4ј. Развијен од стране Апацхе Софтваре Фоундатион и део Апацхе Логгинг Сервицес, Лог4ј2 је бесплатни софтвер отвореног кода (ФОСС) који се дистрибуира под Апацхе лиценцом, верзија 2.0.

Лог4ј2 је изграђен на чврстој основи оригиналног Лог4ј. Постоје предности коришћења Логгер-а у односу на једноставне изјаве за штампање система Систем.оут.принтлн(). Ово укључује контролу над порукама које ће се приказати док избегавате друге поруке дневника. Имати исправне евиденције је кључно у производном окружењу у којем програми за отклањање грешака нису доступни.

Како додати Лог4ј2 свом пројекту?

Постоји неколико начина за додавање Лог4ј2 у ваш Јава пројекат. Препоручљиво је да користите Јава 8 или новију да бисте користили све функције Лог4ј2.

Хајде да разговарамо о различитим методама помоћу којих можете додати Лог4ј2 у зависности од захтева које можда имате.

Додавање Лог4ј2 у пројекте користећи Апацхе Мавен

Ако ваш пројекат користи Апацхе Мавен као систем за прављење, зависности Лог4ј2 треба додати у датотеку пом.кмл.

<dependencies>
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.20.0</version>
  </dependency>
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.20.0</version>
  </dependency>
</dependencies>

Да би се олакшало одржавање исте верзије на различитим артефактима, Лог4ј2 има датотеку Билл оф Материал (БОМ) пом.кмл. Ако га додате у оквиру управљања зависношћу, не морате појединачно да додајете верзије.

<!-- Add the BOM to the dependencyManagement -->
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-bom</artifactId>
      <version>2.20.0</version>
      <scope>import</scope>
      <type>pom</type>
    </dependency>
  </dependencies>
</dependencyManagement>

<!-- Once the BOM is added, the versions are not required -->
<dependencies>
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
  </dependency>
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
  </dependency>
</dependencies>

Додавање Лог4ј2 у пројекте користећи Апацхе Градле

У случају да користите Апацхе Градле као алатку за прављење, можете додати зависности Лог4ј2 у датотеку буилд.градле.

dependencies {
  implementation 'org.apache.logging.log4j:log4j-api:2.20.0'
  implementation 'org.apache.logging.log4j:log4j-core:2.20.0'
}

Ако користите Градле верзију 5.0 или новију, имате опцију да увезете Лог4ј2 Мавен Билл оф Материалс (БОМ) како бисте одржали доследне верзије зависности. Ово се може постићи додавањем следећег у вашу датотеку буилд.градле.

dependencies {
  implementation platform('org.apache.logging.log4j:log4j-bom:2.20.0')

  implementation 'org.apache.logging.log4j:log4j-api'
  runtimeOnly 'org.apache.logging.log4j:log4j-core'
}

За Градле верзије 2.8-4.10, не постоји опција за директан увоз Мавен БОМ-а. Морате да додате додатни додатак за функцију управљања зависношћу.

plugins {
  id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}

dependencyManagement {
  imports {
    mavenBom 'org.apache.logging.log4j:log4j-bom:2.20.0'
  }
}

dependencies {
  implementation 'org.apache.logging.log4j:log4j-api'
  runtimeOnly 'org.apache.logging.log4j:log4j-core'
}

Додавање Лог4ј2 у самосталне апликације без алата за прављење

Ако ваш пројекат нема алатку за прављење, можете преузети потребну верзију артефакта Лог4ј2 са званичне странице за преузимање Лог4ј2.

  Доцкер архитектура и њене компоненте за почетнике

Када их преузмете, морате да се уверите да путања класе ваше апликације укључује следеће тегле.

  • лог4ј-апи-2.20.0.јар
  • лог4ј-цоре-2.20.0.јар

Које су компоненте у Лог4ј2?

Да бисте разумели карактеристике Лог4ј2 и у потпуности искористили његове могућности, важно је разумети како Лог4ј2 функционише. Испод површине, неколико грађевинских блокова чини Лог4ј2. Хајде да причамо о њима један по један.

#1. ЛоггерЦонтект

ЛоггерЦонтект је централна јединица система евидентирања. Садржи све логере тражене у апликацији. Такође садржи референцу на конфигурацију.

#2. Конфигурација

Конфигурација садржи све информације које захтева систем евидентирања. Ово укључује записиваче, додатке, филтере и још много тога. У Лог4ј2, можете дефинисати конфигурацију користећи различите формате датотека као што су КСМЛ, ЈСОН и ИАМЛ, а такође и програмски преко Лог4ј2 АПИ-ја.

Аутоматско поновно учитавање се дешава сваки пут када се било које својство промени у конфигурацији. Дакле, не постоји захтев за поновно покретање апликације.

#3. Логгер

Главна компонента система Лог4ј2 је Логгер. Логгери се добијају унутар кода апликације помоћу наредбе ЛогМанагер.гетЛоггер() и користе се за генерисање дневника. Поруке дневника могу се генерисати на различитим нивоима озбиљности, као што су отклањање грешака, информације, упозорење, грешка и фатална.

#4. ЛоггерЦонфиг

ЛоггерЦонфиг је одговоран за понашање одређеног Логгер-а. Дефинише понашање и подешавања за евидентирање догађаја које генерише тај одређени логер. Омогућава конфигурацију различитих нивоа евидентирања, постављање додатака и примену филтера.

#5. Филтер

Можете селективно обрадити догађаје дневника у Лог4ј2 користећи филтере. Филтери се примењују на основу одређених критеријума. Ове филтере можете применити на бележнике или додатке. Филтери контролишу којим догађајима евиденције је дозвољено да прођу кроз цевовод за евидентирање ради даље обраде. Уз помоћ филтера, понашање евидентирања може се фино подесити, осигуравајући да се обрађују само релевантни записи.

#6. Аппендер

Одредиште било које поруке дневника одређује Аппендер. Један Логгер може имати више додатака. Догађај дневника ће бити послат свим додацима за дати Логгер. Лог4ј2 има много унапред конфигурисаних додатака. На пример, ЦонсолеАппендер се користи за евидентирање порука на конзоли, а ФилеАппендер се користи за излаз порука у датотеку. Сваки Аппендер треба свој распоред који одређује како ће изгледати коначна порука дневника.

#7. Лаиоут

У Лог4ј2, Лаиоут се користи да дефинише како ће изгледати коначна порука дневника. Лаиоут је повезан са Аппендер-ом. Док Аппендер одређује одредиште излаза, Лаиоут описује како ће порука бити објављена.

5 најбољих карактеристика Лог4ј2

Лог4ј2 је богат функцијама и то је оно што га издваја од других доступних Јава оквира за евидентирање. Од асинхроних логера до подршке Јава 8 ламбда, Лог4ј2 има предност у односу на друге. Хајде да размотримо неке од значајних карактеристика овог оквира.

#1. Проширивање функционалности помоћу додатака

У Лог4ј 1.к, да би се направиле екстензије, било је потребно много модификација кода. Лог4ј2 решава проблем проширивости увођењем Плугин система.

Можете да декларишете нови додатак користећи напомену @Плугин на својој класи. Користећи моћ додатака, можете креирати сопствене компоненте као што су филтери и додаци. Компоненте треће стране се такође могу лако додати у библиотеку.

#2. Јава 8 Ламбда подршка

Са издавањем Лог4ј2 верзије 2.4, уведена је подршка за Јава 8 ламбда изразе. Са ламбда изразима, можете да дефинишете своју логичку логику на линији. Ово смањује потребу за провером у више редова или анонимним унутрашњим класама. Ово такође осигурава да се скупе методе не извршавају непотребно. На тај начин не само да је код чистији и лакши за читање, већ се смањују и трошкови система.

  9 ИоуТубе алата за проверу ранга за стримере и инфлуенцере

Хајде да размотримо пример где евидентирате резултат скупе операције, али само ако је омогућен ниво за отклањање грешака. Пре подршке за ламбда, ово би се обавило коришћењем кода испод:

if (logger.isDebugEnabled()) {
    logger.debug("The output of the given operation is: {}", expensiveOperation());
}

Имати више таквих случајева употребе би непотребно увело условне провере. Међутим, са Лог42, иста радња се може извршити на следећи начин:

logger.debug("The output of the given operation is: {}", () -> expensiveOperation()

Метода екпренсивеОператион() се процењује само ако је омогућен ниво отклањања грешака. Нема потребе за експлицитним проверама.

#3. Асинхрони логери

Сваки догађај дневника је И/О операција, што повећава оптерећење система. Да би ово ублажио, Лог4ј2 уводи асинхроне логере који раде у посебној нити од нити апликације. Када користите асинхроне логере, нит позиваоца одмах добија назад контролу након позивања методе логгер.лог().

Ово му омогућава да настави са логиком апликације уместо да чека да се догађај евидентирања заврши. Коришћењем овог асинхроног понашања постиже се већи проток евиденције. Можете изабрати да сви записивачи буду асинхрони подразумевано или да имају мешавину синхроног и асинхроног понашања.

#4. Сеча без смећа

У Јави, сакупљање смећа је процес којим се некоришћени објекти у апликацији аутоматски бришу. Иако не морате ручно да водите рачуна о овој операцији, сакупљање смећа има своје трошкове.

Ако ваша апликација креира превише објеката у кратком временском периоду, процес сакупљања смећа може заузети више системских ресурса него што је потребно. Неколико библиотека за евидентирање, укључујући претходне верзије Лог4ј-а, креирају много привремених објеката током процеса евидентирања. Након тога, повећани притисак на сакупљач смећа утиче на перформансе система.

Од верзије 2.6, Лог4ј2 ради у режиму „без смећа“. Ово је подразумевано понашање. Због тога се објекти поново користе, а стварање привремених је знатно смањено.

Следеће слике показују како Лог4ј2 верзија 2.6 ублажава проблем непотребних објеката, у поређењу са Лог4ј2 верзијом 2.5.

У Лог4ј2 верзији 2.5, много привремених објеката се креира током процеса евидентирања; Извор: апацхе.орг

У Лог4ј2.6, нема привремених објеката креираних током процеса евидентирања; Извор: апацхе.орг

#5. Лоокупс

У лог4ј2, можете додати контекстуалне информације у своје дневнике користећи Лоокупс. Користећи их, можете додати податке из различитих извора, као што су својства система, променљиве окружења или прилагођене вредности. Дакле, можете укључити релевантне информације које се динамички преузимају, чинећи евиденције кориснијим.

Хајде да размотримо пример где желите да евидентирате ИД сесије корисника са свим линијама дневника. Ово би вам омогућило да тражите све евиденције које одговарају ИД-у сесије.

Бруте форце начин да се то уради био би да се изричито дода ИД сесије појединачно, што постаје тешко одржавати. Ускоро ћете можда заборавити да га додате и тако изгубите вредне информације.

logger.info("The user data has been fetched for session id {}", sessionId);
...
logger.info("The transaction has been processed for session id {}", sessionId);
...
logger.info("Request has been successfully processed for session id {}", sessionId);

Бољи начин да се то уради било би коришћење Цонтект Мап Лоокуп-а. ИД сесије се може додати у контекст нити у коду апликације. Вредност се затим може користити унутар конфигурације Лог4ј2. Тако је елиминисана потреба да се то експлицитно помиње у порукама дневника.

ThreadContext.put("sessionId", sessionId);

Када се вредност дода, иста се може користити у Лоокуп-у помоћу кључне речи цтк.

<File name="Application" fileName="application.log">
  <PatternLayout>
    <pattern>%d %p %c{1.} [%t] $${ctx:sessionId} %m%n</pattern>
  </PatternLayout>
</File>

Како направити прилагођене нивое дневника у Лог4ј2?

Нивои евиденције у Лог4ј2 се користе за категоризацију догађаја евиденције на основу њихове озбиљности или важности. Можете да контролишете ниво евиденције када евидентирате поруку у коду апликације.

На пример, логгер.дебуг() додаје ниво ДЕБУГ. Сходно томе, логгер.еррор() додаје ниво ЕРРОР. Ово одређује које се поруке коначно појављују у излазу. Можете да конфигуришете ниво евиденције у датотеци за конфигурацију.

  Како променити подразумеване поставке формата Гоогле докумената

Унапред конфигурисани нивои дневника у Лог4ј2 и њихове одговарајуће вредности су поменути у наставку.

ОФФ0ФАТАЛ100ЕРРОР200ВАРН300ИНФО400ДЕБУГ500ТРАЦЕ600АЛЛМАКС ВРЕДНОСТ

Ако је ниво дневника постављен на одређени ниво, онда се излазе све линије дневника за ту одговарајућу вредност и оне изнад ње (са мањом вредношћу). Остали се игноришу.

На пример, ако поставите ниво евиденције на ВАРН, тада ће се приказати поруке ВАРН, ЕРРОР и ФАТАЛ. Свака линија дневника са другачијим нивоом биће занемарена. Ово је посебно корисно када користите исти код у различитим окружењима.

Можда ћете желети да подесите ниво евиденције на ИНФО или ДЕБУГ када покрећете код у свом развојном окружењу. Ово ће вам омогућити да видите више евиденција и помоћи у процесу развоја. Међутим, када радите у производном окружењу, желели бисте да га поставите на ЕРРОР. Тако ћете моћи да се фокусирате на проналажење проблема у случају да дође до било какве аномалије и нећете морати да пролазите кроз непотребне редове дневника.

Може се десити да желите да додате сопствени прилагођени ниво евиденције поред унапред конфигурисаних. Лог4ј2 вам омогућава да то учините лако. Хајде да видимо како можете додати сопствене нивое дневника и користити их у својој апликацији.

#1. Додавање прилагођеног нивоа евиденције помоћу конфигурационе датотеке

Можете додати прилагођене нивое евиденције тако што ћете их декларисати у конфигурационој датотеци.

У примеру испод, прилагођени ниво евиденције под називом ОБАВЕШТЕЊЕ је дефинисан са вредношћу од 450. Ово га поставља између ИНФО (са вредношћу 400) и ДЕБУГ (са вредношћу од 500). То значи да ако је ниво подешен на ОБАВЕШТЕЊЕ, онда ће ИНФО поруке бити евидентиране, али ће поруке за ДЕБУГ бити прескочене.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
  <CustomLevels>
    <CustomLevel name="NOTICE" intLevel="450" />
  </CustomLevels>
 
  <Appenders>
    <File name="MyFile" fileName="logs/app.log">
      <PatternLayout pattern="%d %-7level %logger{36} - %msg%n"/>
    </File>
  </Appenders>
  <Loggers>
    <Root level="trace">
      <AppenderRef ref="MyFile" level="NOTICE" />
    </Root>
  </Loggers>
</Configuration>

#2. Додавање прилагођеног нивоа евиденције у коду

Осим што их декларишете у конфигурационој датотеци, можете дефинисати сопствене прилагођене нивое евиденције у свом коду.

final Level VERBOSE = Level.forName("VERBOSE", 550);

Ово ће креирати нови ниво дневника под називом ВЕРБОСЕ. Овај ниво евиденције ће се налазити између ДЕБУГ (са вредношћу од 500) и ТРАЦЕ (са вредношћу од 600). Ако је логер подешен на ниво ВЕРБОСЕ, онда ће се све поруке дневника ВЕРБОСЕ и новијих регистровати, укључујући ДЕБУГ. Међутим, ТРАЦЕ поруке ће бити прескочене.

#3. Коришћење прилагођеног нивоа евиденције у коду

Прилагођени нивои дневника прво морају бити декларисани пре него што се користе. Можете их декларисати или у конфигурационој датотеци или у свом коду. Једном декларисани, слободни сте да их користите.

Овај пример кода показује како можете декларисати прилагођени ниво који се зове НОТИЦЕ, а затим га користити.

final Level NOTICE = Level.forName("NOTICE", 550);

final Logger logger = LogManager.getLogger();
logger.log(NOTICE, "a notice level message");

Иако ће ово генерисати потребну поруку са новокреираним нивоом, могло би постати гломазно увек експлицитно проћи ниво. Срећом, можете да генеришете изворни код тако да добијете помоћне методе за евидентирање ваших прилагођених нивоа. Користећи исто, моћи ћете да користите сопствени метод логгер.нотице() слично као што бисте користили логгер.дебуг() или логгер.еррор().

Лог4ј2 долази са услужним програмом који вам помаже да креирате сопствене проширене бележнике. Следећа команда креира Јава датотеку под називом ЦустомЛоггер.јава. Ова датотека садржи постојеће методе евиденције, заједно са новогенерисаним методама за ниво ОБАВЕШТЕЊЕ.

java -cp log4j-core-2.20.0.jar org.apache.logging.log4j.core.tools.ExtendedLoggerGenerator 
        com.example.CustomLogger NOTICE=450 > com/example/CustomLogger.java

Када се датотека генерише, можете користити класу у свом коду за креирање нових бележника. Ови бележници ће садржати додатне методе за ваш прилагођени ниво евиденције. Тако можете проширити функционалност ваших логера.

final Logger logger = CustomLogger.create(ValueFirstSmsSender.class);

//this new method is similar to using logger.debug()
logger.notice("a notice level message");

Закључак

Лог4ј2 је веома моћан Јава оквир за евидентирање, који нуди широк спектар функција, конфигурација, побољшања перформанси и још много тога. Пошто су евиденције веома важан део процеса развоја софтвера, поседовање робусног оквира као што је Лог4ј2 побољшава способности апликације.

Флексибилност и проширивост Лог4ј2 омогућавају правилно снимање догађаја који се дешавају у вашој апликацији. Након тога, омогућава вам да размишљате о евиденцијама као о моћном алату за отклањање грешака и ревизију. Са свим својим карактеристикама и побољшањима, Лог4ј2 се издваја и чини се пожељним избором у разноликом спектру софтверских пројеката.

Можда ћете бити заинтересовани и за ове Јава ИДЕ-ове и комплиере на мрежи.