JavaRush /Блоги Java /Random-TG /Чаро ба қайд гирифтан лозим аст?

Чаро ба қайд гирифтан лозим аст?

Дар гурӯҳ нашр шудааст
Салом! Ҳангоми навиштани лексияҳо ман махсусан қайд мекунам, ки оё мавзӯи муайян дар кори воқеӣ бешубҳа истифода мешавад. Чаро ба шумо сабтгоҳҳ лозим аст - 1 Пас, ДИККАТ! Мавзӯе, ки мо имрӯз ба он дахл хоҳем кард, бешубҳа барои шумо дар ҳама лоиҳаҳои шумо аз рӯзи аввали кор муфид хоҳад буд. Мо дар бораи дарахтбурӣ сӯҳбат мекунем. Ин мавзӯъ аслан мушкил нест (ҳатто метавонам осон бигӯям). Аммо дар кори аввалини шумо аллакай фишори кофӣ барои мубориза бо чизҳои аён хоҳад буд, аз ин рӯ беҳтар аст, ки ҳоло онро ҳаматарафа ҷудо кунед :) Пас, биёед оғоз кунем. Сабт кардан чист? Бақайдгирӣ дар ҷое сабт кардани маълумот дар бораи кори барнома мебошад. Ҷойе, ки ин маълумот навишта мешавад, " журнал " номида мешавад. Якбора ду савол ба миён меояд: дар куҷо ва кадом маълумот сабт шудааст? Биёед бо "куҷо" оғоз кунем. Шумо метавонед маълумоти амалиёти барномаро дар бисёр ҷойҳои гуногун сабт кунед. Масалан, дар давоми таҳсил шумо аксар вақт маълумотро ба консол бо истифода аз System.out.println(). Ин ба қайдгирии воқеӣ, ҳарчанд соддатарин аст. Албатта, ин барои муштарӣ ё дастаи дастгирии маҳсулот чандон қулай нест: онҳо бешубҳа намехоҳанд IDE-ро насб кунанд ва консолро назорат кунанд :) Инчунин формати бештар шинос барои сабти иттилоот вуҷуд дорад - дар файли матнӣ. Барои одамон ин тавр хондани онҳо хеле осонтар аст ва нигоҳ доштани онҳо албатта осонтар аст! Акнун саволи дуюм: кадом маълумот дар бораи кори барнома бояд дар журнал сабт карда шавад? Аммо дар ин ҷо ҳама чиз аз шумо вобаста аст! Системаи сабти Java хеле чандир аст. Шумо метавонед онро тавре танзим кунед, ки тамоми пешрафти барномаи шумо сабт карда шавад. Аз як тараф, ин хуб аст. Аммо аз тарафи дигар, тасаввур кунед, ки агар ҳама чиз дар он ҷо навишта шуда бошад, гузоришҳои Facebook ё Twitter ба кадом андоза расида метавонанд. Чунин ширкатҳои бузург эҳтимолан қобorяти нигоҳ доштани ин миқдор маълумотро доранд. Аммо тасаввур кунед, ки ҷустуҷӯи маълумот дар бораи як хатои муҳим дар гузоришҳои 500 гигаbyte матн чӣ қадар душвор хоҳад буд? Аз сӯзан дар хирман ҳам бадтар аст. Аз ин рӯ, воридшавиро дар Java метавон танзим кард, ки танҳо маълумоти хатогиҳо ба гузориш (журнал) навишта шаванд. Ё ҳатто дар бораи хатогиҳои муҳим! Ҳарчанд гуфтани "дар Java ворид шудан" комилан дуруст нест. Гап дар он аст, ки зарурати сабти ном дар байни барномасозон пеш аз он ки ин функсия ба забон илова карда шавад, ба миён омадааст. Ва вақте ки Java китобхонаи сабти худро дошт, ҳама аллакай аз китобхонаи log4j истифода мекарданд. Таърихи пайдоиши сабти ном дар Java воқеан хеле тӯлонӣ ва иттилоотӣ аст; дар вақти холӣ шумо метавонед ин мақоларо дар Habré хонед . Хулоса, Java китобхонаи сабти худро дорад, аммо тақрибан касе аз он истифода намебарад :) Баъдтар, вақте ки якчанд китобхонаҳои гуногуни сабти ном пайдо шуданд ва ҳама барномасозон аз китобхонаҳои гуногун истифода бурданд, мушкилоти мутобиқат ба миён омад. Барои пешгирӣ кардани одамон аз як кор бо истифода аз даҳҳо китобхонаҳои гуногун бо интерфейсҳои гуногун, чаҳорчӯбаи абстраксияи slf4j сохта шудааст.("Фасади сабти хидмат барои Java"). Он абстрактизатсия номида мешавад, зеро гарчанде ки шумо синфҳои slf4j-ро истифода мебаред ва усулҳои онҳоро даъват мекунед, онҳо ҳама чаҳорчӯбаҳои қаблии сабти номро доранд: log4j, стандарти java.util.logging ва ғайра. Агар ба шумо дар айни замон ягон хусусияти мушаххаси log4j лозим бошад, ки китобхонаҳои дигар надоранд, аммо шумо намехоҳед лоиҳаро ба ин китобхонаи махсус пайваст кунед, танҳо slf4j-ро истифода баред. Ва вай аллакай усулҳои log4j -ро "кашад". Агар шумо ақидаи худро тағир диҳед ва қарор кунед, ки ба шумо дигар хусусиятҳои log4j лозим нест, ба шумо танҳо лозим аст, ки "маҷмӯа" -ро (яъне slf4j) аз нав танзим кунед, то китобхонаи дигарро истифода баред. Рамзи шумо корашро қатъ намекунад, зеро дар он шумо усулҳои slf4j-ро меномед, на китобхонаи мушаххас. Тарзи хурд. Барои мисолҳои зерин кор кардан, шумо бояд китобхонаи slf4j-ро аз ин ҷо ва китобхонаи log4j-ро аз ин ҷо зеркашӣ кунед . Баъдан, мо бояд бойгониро кушоем ва файлҳои jarеро, ки ба мо лозим аст, тавассути Intellij IDEA ба синфи синф илова кунем. Унсурҳои меню: Файл -> Сохтори лоиҳа -> Китобхонаҳо Зарфҳои заруриро интихоб кунед ва онҳоро ба лоиҳа илова кунед (дар бойгониҳое, ки мо бор кардаем, банкаҳои зиёде мавҷуданд, ба кӯзаҳои лозимӣ дар расмҳо нигаред) Зачем нужно логирование - 2Зачем нужно логирование - 3Эзоҳ - ин дастур барои онҳое аст донишҷӯён, ки чӣ тавр истифода бурдани Maven намедонанд. Агар шумо медонед, ки чӣ тавр истифода бурдани он, беҳтар аст, ки бо он оғоз кунед: ин одатан хеле осонтар аст.Агар шумо Maven -ро истифода баред , ин вобастагӣ илова кунед:
<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
</dependency>
Аҷоиб, мо танзимотро ҷудо кардем :) Биёед бубинем, ки slf4j чӣ гуна кор мекунад. Чӣ тавр мо метавонем боварӣ ҳосил кунем, ки пешрафти барнома дар ҷое сабт шудааст? Барои ин ба мо ду чиз лозим аст - як сабткунанда ва замима . Биёед бо аввалин сар кунем. Бақайдгиранда an objectест, ки нигоҳдории сабтро комилан идора мекунад . Сохтани логгер хеле осон аст: он бо усули статикӣ - анҷом дода мешавад LoggerFactory.getLogger(). Ҳамчун параметр ба усул, шумо бояд синферо гузаронед, ки кори он сабт карда мешавад. Биёед codeи худро иҷро кунем:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Test log record!!!");
       LOGGER.error("В программе возникла ошибка!");
   }
}
Натиҷаи консол: ERROR StatusLogger файли конфигуратсияи Log4j 2 ёфт нашуд. Истифодаи конфигуратсияи пешфарз (ба қайд гирифтани танҳо хатогиҳо ба консол) ё конфигуратсияҳои ба таври барномавӣ таъминшудаи корбар. Хусусияти системаи 'log4j2.debug' -ро барои нишон додани сабти ибтидоии дохorи Log4j 2 насб кунед. Ба https://logging.apache.org/log4j/2.x/manual/configuration.html нигаред барои дастурҳо оид ба танзими Log4j 2 15:49:08.907 [асосӣ] ERROR MyTestClass - Дар барнома хатогӣ рух дод! Мо дар ин ҷо чӣ мебинем? Аввалан мо паёми хатогиро мебинем. Ин пайдо шуд, зеро мо дар айни замон танзимоти зарурӣ надорем. Аз ин рӯ, логгери мо ҳоло метавонад танҳо паёмҳои хатогиро (ERROR) ва танҳо ба консол барорад. Усул logger.info()иҷро нашуд. Аммо logger.error()он кор кард! Консол санаи ҷорӣ, усуле, ки хатогӣ рух додааст ( main), калимаи ERROR ва паёми моро нишон медиҳад! ERROR сатҳи сабткунӣ мебошад. Умуман, агар сабти журнал бо калимаи ERROR қайд карда шавад, ин маънои онро дорад, ки хато дар он нуқтаи барнома рух додааст. Агар вуруд бо калимаи INFO қайд карда шуда бошад, ин маънои онро дорад, ки он танҳо маълумоти ҷорӣ дар бораи кори муқаррарии барнома аст. Китобхонаи SLF4J дорои якчанд сатҳҳои гуногуни сабти ном мебошад, ки ба шумо имкон медиҳанд, ки сабти номро чандир танзим кунед. Идоракунии онҳо хеле осон аст: ҳама мантиқи зарурӣ аллакай ба синф дохил карда шудааст Logger. Шумо танҳо бояд усулҳои заруриро даъват кунед. Агар шумо хоҳед, ки паёми муқаррариро фиристед, ба logger.info(). Паёми хато - logger.error(). Намоиши огоҳӣ - logger.warn() Акнун биёед дар бораи замима сӯҳбат кунем . Замима ҷойест, ки маълумоти шумо меояд. Шумо метавонед бигӯед, ки муқобor манбаи маълумот "нуқтаи B" аст. Бо нобаёнӣ, маълумот ба консол бароварда мешавад. Лутфан таваҷҷӯҳ намоед, ки дар мисоли қаблӣ ба мо лозим набуд, ки чизеро танзим кунем: матн дар худи консол пайдо шуд, аммо логгер аз китобхонаи log4j метавонад танҳо паёмҳои сатҳи ERROR-ро ба консол барорад. Барои одамон хондани гузоришҳо аз файли матнӣ ва нигоҳ доштани гузоришҳо дар ҳамон файлҳо, бешубҳа қулайтар аст. Барои тағир додани рафтори пешфарзии сабткунанда, мо бояд замимаи файли худро танзим кунем . Барои оғоз кардан, шумо бояд файли log4j.xml -ро дуруст дар ҷузвдони src ё дар ҷузвдони захираҳо, агар шумо Maven-ро истифода баред, ё дар папкаи захираҳо, агар шумо Maven-ро истифода баред, эҷод кунед. Шумо аллакай бо формати xml шинос ҳастед, мо ба наздикӣ дар бораи он лексия доштем :) Ин мундариҷаи он хоҳад буд:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
   <Appenders>
       <File name="MyFileAppender" fileName="C:\Users\Username\Desktop\testlog.txt" immediateFlush="false" append="false">
           <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
       </File>
   </Appenders>
   <Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
   </Loggers>
</Configuration>
Ин махсусан мураккаб ба назар намерасад :) Аммо биёед то ҳол мундариҷаро аз назар гузаронем.
<Configuration status="INFO">
Ин ба истилоҳ сабткунандаи статус аст. Он ба logger мо алоқаманд нест ва дар дохor log4j истифода мешавад. Шумо метавонед ба ҷои status="INFO" status="TRACE"-ро муқаррар кунед ва ҳама маълумот дар бораи кори дохorи log4j ба консол бароварда мешавад (вазъ-logger маълумотро ба консол мебарорад, ҳатто агар замимаи мо барои барнома файл бошад ҳам. -асоси). Мо ҳоло ба ин ниёз надорем, аз ин рӯ мо ҳама чизро ҳамон тавре ки ҳаст, мегузорем.
<Appenders>
   <File name="MyFileAppender" fileName="C:\Users\Евгений\Desktop\testlog.txt" append="true">
       <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
   </File>
</Appenders>
Дар ин ҷо мо замимаи худро эҷод мекунем. Tag <File>нишон медиҳад, ки он файл хоҳад буд. name="MyFileAppender"— номи замимаи мо. fileName="C:\Users\Username\Desktop\testlog.txt"— роҳ ба файли журнал, ки дар он ҳама маълумотҳо навишта мешаванд. append="true"— оё ба охири файл навиштани маълумоти иловагӣ зарур аст. Дар вазъияти мо ин тавр мешавад. Агар ба false муқаррар карда шавад , мундариҷаи сабти кӯҳна ҳар дафъае, ки барнома аз нав оғоз мешавад, нест карда мешавад. <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>- Инҳо танзимоти форматкунӣ мебошанд. Дар ин ҷо мо метавонем ифодаҳои муқаррариро истифода барем, то формати матнро дар сабти худ танзим кунем.
<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
Дар ин ҷо мо сатҳи сабтро (сатҳи решавӣ) муайян мекунем. Мо сатҳи INFO дорем: яъне ҳама паёмҳо дар сатҳҳои болотар аз INFO (мувофиқи ҷадвале, ки мо дар боло дида будем) ба сабт дохил карда намешаванд. Мо дар барномаи мо 3 паём хоҳем дошт: як INFO, як Огоҳӣ ва як ХАТО. Бо конфигуратсияи ҷорӣ, ҳамаи 3 паём ба гузориш навишта мешаванд. Агар шумо сатҳи решаро ба ERROR иваз кунед, танҳо паёми охирини LOGGER.error() сабт карда мешавад. Илова бар ин, дар ин ҷо истиноди замима ҷойгир карда шудааст. Барои сохтани чунин пайванд, шумо бояд дар дохor тег <Root>тег эҷод кунед <ApprenderRef>ва параметрро ба он илова кунед ref=”Name твоего аппендера”. Мо номи замимаро дар ин ҷо офаридаем, агар шумо фаромӯш карда бошед: <File name="MyFileAppender" Ва ин аст рамзи барномаи мо!
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Начало работы программы!!!");

       try {
           LOGGER.warn("Внимание! Программа пытается разделить одно число на другое");
           System.out.println(12/0);
       } catch (ArithmeticException x) {

           LOGGER.error("Ошибка! Произошло деление на ноль!");
       }
   }
}
Албатта, ин як каме каҷ аст (дарёфт кардани RuntimeException як идеяи миёнарав аст), аммо он барои мақсадҳои мо комил аст :) Биёед усули худро main()4 маротиба пай дар пай иҷро кунем ва ба файли testlog.txt-и худ назар кунем. Онро пешакӣ эҷод кардан лозим нест: китобхона ин корро ба таври худкор анҷом медиҳад. Ҳама чиз кор кард! :) Акнун шумо як сабти танзимшуда доред. Шумо метавонед бо баъзе барномаҳое, ки қаблан навишта будед, бозӣ кунед, ба ҳама усулҳо зангҳои сабткунанда илова кунед ва ба гузориши натиҷавӣ нигаред :) Барои хондани иловагӣ, ман ин мақоларо тавсия медиҳам . Дар он чо мавзуи дарахтбурй чукур мухокима мешавад ва онро дар як нишаст хондан осон нест. Аммо он дорои маълумоти зиёди иловагии муфид аст. Масалан, шумо тарзи конфигуратсияи логгерро меомӯзед, то он файли нави матниро эҷод кунад, агар файли testlog.txt мо ба андозаи муайян расад :) Ва ин дарси мо ба охир мерасад! Имрӯз шумо дар бораи як мавзӯи хеле муҳим маълумот гирифтед ва ин дониш бешубҳа барои шумо дар кори ояндаатон муфид хоҳад буд. То боздид! :)
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION