JavaRush /Java блогу /Random-KY /Каттоо эмне үчүн керек?

Каттоо эмне үчүн керек?

Группада жарыяланган
Салам! Лекцияларды жазып жатканда, мен өзгөчө белгилейм, эгерде белгилүү бир тема сөзсүз түрдө реалдуу иште колдонулат. Сизге эмне үчүн журнал жазуу керек - 1 Андыктан, КӨҢҮЛ БЕРҮҮ! Бүгүн биз козгой турган тема ишиңиздин биринчи күнүнөн баштап бардык долбоорлоруңузда сизге пайдалуу болот. Биз жыгач кесүү жөнүндө сүйлөшөбүз. Бул тема такыр эле кыйын эмес (жеңил деп да айтаар элем). Бирок, сиздин биринчи жумушуңузда дагы эле ачык-айкын нерселер менен күрөшүү үчүн жетиштүү стресс болот, андыктан аны азыр кылдат чечип алганыңыз жакшы :) Андыктан, баштайлы. Каттоо деген эмне? Каттоо - бул программанын иштеши жөнүндө маалыматтарды жазуу. Бул маалыматтар жазылган жер " журнал " деп аталат. Дароо эки суроо туулат: кайда жана кандай маалыматтар жазылат? Келгиле, "кайда" менен баштайлы. Сиз көптөгөн ар кандай жерлерде программанын иштөө маалыматтарын жаздыра аласыз. Мисалы, окуу учурунда сиз көбүнчө консолго маалыматтарды чыгарасыз System.out.println(). Бул эң жөнөкөй болсо да, чыныгы жыгач кесүү. Албетте, бул кардар же продуктуну колдоо тобу үчүн анча ыңгайлуу эмес: алар IDE орнотууну жана консолду көзөмөлдөөнү каалашпайт :) Ошондой эле маалыматты жазуу үчүн дагы тааныш формат бар - текст файлында. Адамдарга аларды ушундай жол менен окуу бир топ жеңил, жана, албетте, сактоо дагы бир топ жеңил! Эми экинчи суроо: программанын иштеши жөнүндө кандай маалыматтар журналга жазылышы керек? Бирок бул жерде баары сенден көз каранды! Java журналы системасы абдан ийкемдүү. Сиз аны программаңыздын бардык жүрүшү жазыла тургандай кылып конфигурациялай аласыз. Бир жагынан бул жакшы. Бирок, экинчи жагынан, баары ошол жерде жазылган болсо, Facebook же Twitter журналдары кандай өлчөмдө жете аларын элестетиңиз. Мындай ири компаниялар, балким, маалыматтын мынчалык көлөмүн да сактоо мүмкүнчүлүгүнө ээ. Бирок 500 гигаbyte тексттин журналдарынан бир критикалык ката жөнүндө маалыматты издөө канчалык кыйын болорун элестетип көрүңүзчү? Бул ийнеден да жаман. Ошондуктан, Java менен кирүү журналга (лог) ката маалыматтары гана жазылгыдай кылып конфигурацияланышы мүмкүн. Же жөн гана олуттуу каталар жөнүндө! Бирок, "Java'га кирүү" деп айтуу таптакыр туура эмес. Чындыгында, бул функция тилге кошулганга чейин программисттер арасында журналды жазуу зарылчылыгы пайда болгон. Ал эми Java өзүнүн журнал китепканасына ээ болгон учурда, бардыгы log4j китепканасын колдонуп келишкен. Java'да кирүүнүн пайда болуу тарыхы чындыгында абдан узун жана маалыматтуу; бош убактыңызда бул постту Habréден окуй аласыз . Кыскасы, Javaнын өзүнүн журнал китепканасы бар, бирок аны дээрлик эч ким колдонбойт :) Кийинчерээк бир нече ар кандай журнал китепканалары пайда болуп, бардык программисттер ар башкаларын колдоно баштаганда, шайкештик маселеси келип чыккан. Ар кандай интерфейстери бар ондогон ар кандай китепканаларды колдонуп, адамдардын бир эле нерсени жасоосуна жол бербөө үчүн slf4j абстракция алкагы түзүлгөн.(«Java үчүн Сервис журналынын фасады»). Бул абстракциялоо деп аталат, анткени сиз slf4j класстарын колдонуп, алардын ыкмаларын чакырсаңыз да, капоттун астында аларда мурунку бардык журналдоо алHowтары иштейт: log4j, стандарттуу java.util.logging жана башкалар. Учурда башка китепканаларда жок log4j өзгөчөлүгү керек болсо, бирок сиз долбоорду ушул китепканага катуу байланыштыргыңыз келбесе, жөн гана slf4j колдонуңуз. Ал буга чейин log4j ыкмаларын "тартып" алат. Эгерде сиз оюңузду өзгөртүп, log4j функцияларынын кереги жок деп чечсеңиз, башка китепкананы колдонуу үчүн жөн гана "ороону" (б.а. slf4j) кайра конфигурациялашыңыз керек. Сиздин codeуңуз иштөөсүн токтотпойт, анткени анда сиз белгилүү бир китепкананын эмес, slf4j методдорун чакырасыз. Кичинекей четтөө. Төмөнкү мисалдар иштеши үчүн slf4j китепканасын бул жерден , log4j китепканасын бул жерден жүктөп алышыңыз керек . Андан кийин, биз архивди таңгактан чыгарып, Intellij IDEA аркылуу класстык жолго керектүү jar файлдарын кошушубуз керек. Меню пункттары: Файл -> Долбоордун структурасы -> Китепканалар Керектүү банкаларды тандап, аларды долбоорго кошуңуз (архивде биз жүктөп алган көптөгөн банкалар бар, сизге керектүүсүн сүрөттөрдөн караңыз) Эмне үчүн сизге журналды кесүү керек - 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 конфигурация файлы табылды. Демейки конфигурацияны колдонуу (консолго каталарды гана киргизүү) же колдонуучу программалык түрдө камсыз кылган конфигурацияларды. Log4j 2 ички инициализация журналын көрсөтүү үчүн тутум касиетин 'log4j2.debug' коюңуз. Log4j 2 15:49:08.907 конфигурациялоо боюнча нускамаларды https://logging.apache.org/log4j/2.x/manual/configuration.html караңыз. Бул жерде биз эмнени көрүп жатабыз? Биринчиден, биз ката билдирүүсүн көрөбүз. Бул бизде учурда керектүү орнотуулар жок болгондуктан пайда болду. Ошондуктан, биздин логгер эми ката билдирүүлөрүн (КАТА) жана консолго гана чыгара алат. Метод logger.info()аткарылган жок. Бирок logger.error()ал иштеди! Консоль учурдагы күндү, ката пайда болгон ыкманы ( main), ERROR сөзүн жана биздин билдирүүнү көрсөтөт! ERROR – журналды каттоо деңгээли. Жалпысынан, журналдын жазуусу ERROR деген сөз менен белгиленсе, бул программанын ошол жеринде ката болгонун билдирет. Эгерде жазуу INFO деген сөз менен белгиленсе, бул программанын нормалдуу иштеши жөнүндө жөн гана учурдагы маалымат экенин билдирет. SLF4J китепканасында журнал жазууну ийкемдүү конфигурациялоого мүмкүндүк берген бир нече ар кандай каттоо деңгээли бар. Аларды башкаруу абдан оңой: бардык керектүү логика класска киргизилген Logger. Сиз жөн гана керектүү ыкмаларды чакыруу керек. Кадимки билдирүү жазгыңыз келсе, телефонго чалыңыз logger.info(). Ката билдирүү - logger.error(). Эскертүүнү көрсөтүү - Эми тиркемеlogger.warn() жөнүндө сүйлөшөлү . Тиркеме сиздин маалыматтарыңыз келген жер. Маалымат булагынын карама-каршы жагы "Б чекити" деп айта аласыз. Демейки боюнча, маалыматтар консолго чыгарылат. Эскерте кетсек, мурунку мисалда биз эч нерсени конфигурациялашыбыз керек эмес: текст консолдун өзүндө пайда болгон, бирок 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">
Бул статус-логгер деп аталган. Бул биздин логгерге тиешеси жок жана log4j тарабынан ички колдонулат. Status="INFO" ордуна статус="TRACE" орното аласыз жана log4jдин ички иштеши жөнүндө бардык маалымат консолго чыгарылат (статус-логгер, программанын тиркемечибиз файл болсо дагы, маалыматтарды консолго чыгарат. - негизделген). Бизге мунун азыр кереги жок, ошондуктан бардыгын ошол бойдон калтырабыз.
<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 денгээлиндеги бардык билдирүүлөр (жогоруда биз караган tableга ылайык) журналга киргизилбейт. Биздин программада 3 билдирүү болот: бир INFO, бир ЭСКЕРТҮҮ жана бир КАТА. Учурдагы конфигурацияда 3 билдирүү тең журналга жазылат. Эгер сиз түпкү деңгээлин ERROR деп өзгөртсөңүз, LOGGER.error() акыркы билдирүүсү гана катталат. Мындан тышкары, бул жерде тиркемеге шилтеме жайгаштырылган. <Root>Мындай шилтемени түзүү үчүн, тегдин ичинде тег түзүп <ApprenderRef>, ага параметрди кошуу керек ref=”Name твоего аппендера”. Биз бул жерде тиркеменин атын түздүк, эгер сиз унутуп калсаңыз: <File name="MyFileAppender" Жана бул жерде биздин программанын 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("Начало работы программы!!!");

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

           LOGGER.error("Ошибка! Произошло деление на ноль!");
       }
   }
}
Албетте, бул бир аз кыйшык (RuntimeException тутумунун орточо идеясы), бирок бул биздин максаттарыбыз үчүн эң сонун :) Келгиле, биздин методду main()4 жолу катары менен иштетип, testlog.txt файлыбызды карап көрөлү. Аны алдын ала түзүүнүн кереги жок: китепкана муну автоматтык түрдө жасайт. Баары иштеди! :) Эми сизде конфигурацияланган каттоочу бар. Сиз мурда жазган кээ бир программалар менен ойноп, бардык ыкмаларга логгер чалууларын кошуп, натыйжада журналды карасаңыз болот :) Кошумча окуу үчүн, мен бул макаланы абдан сунуштайм . Ал жерде жыгач кесүү темасы терең талкууланат, аны бир отурушта окуу оңойго турbyte. Бирок ал көптөгөн пайдалуу кошумча маалыматтарды камтыйт. Мисалы, сиз биздин testlog.txt файлыбыз белгилүү бир өлчөмгө жетсе, жаңы текст файлын түзө тургандай логгерди конфигурациялоону үйрөнөсүз :) Жана ушуну менен биздин сабагыбыз аяктады! Бүгүн сиз абдан маанилүү тема менен тааныштыңыз жана бул бorм келечектеги ишиңизде сөзсүз сизге пайдалуу болот. Көрүшкөнгө чейин! :)
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION