JavaRush /Java Blog /Random-TK /Gingurnal açmak näme üçin zerur?

Gingurnal açmak näme üçin zerur?

Toparda çap edildi
Salam! Leksiýa ýazanymda, belli bir mowzugyň hakyky işde ulanyljakdygyna aýratyn üns berýärin. Näme üçin hasaba girmeli - 1 Üns beriň! Bu gün degip geçjek mowzugymyz, ilkinji iş gününden başlap ähli taslamalaryňyz üçin hökman peýdaly bolar. Gingurnal hakda gürleşeris. Bu mowzuk asla kyn däl (hatda aňsat diýerdim). Firstöne ilkinji işiňizde aç-açan zatlar bilen iş salyşmak üçin eýýäm ýeterlik stres bolar, şonuň üçin ony indi jikme-jik çözmek has gowudyr :) Şeýdip, başlalyň. Gingurnal näme? Gingazgy, bir programmanyň işleýşi barada bir ýerde maglumatlary ýazga alýar. Bu maglumatlaryň ýazylan ýerine “ gündelik ” diýilýär. Birbada iki sorag ýüze çykýar: nirede we haýsy maglumatlar ýazylýar? "Nirede" bilen başlalyň. Programmanyň işleýiş maglumatlaryny köp dürli ýerde ýazyp bilersiňiz. Mysal üçin, okuwyňyzyň dowamynda köplenç konsola maglumatlary çykarýarsyňyz System.out.println(). Iň ýönekeý bolsa-da, bu hakyky ýazgydyr. Elbetde, bu müşderi ýa-da önümi goldaýan topar üçin gaty amatly däl: IDE gurmak we konsola gözegçilik etmek islemejekdikleri aç-açan :) Maglumat ýazmak üçin has tanyş format hem bar - tekst faýlynda. Adamlara olary şeýle okamak has aňsat we saklamak has aňsat! Indi ikinji sorag: programmanyň işleýşi barada haýsy maglumatlary gündelige ýazmaly? Emma bu ýerde hemme zat size bagly! Java hasaba alyş ulgamy gaty çeýe. Ony programmaňyzyň ähli ösüşi hasaba alynjak görnüşde düzüp bilersiňiz. Bir tarapdan, bu gowy. Otheröne beýleki tarapdan, hemme zat şol ýerde ýazylan bolsa, “Facebook” ýa-da “Twitter” surnallarynyň haýsy ululykda bolup biljekdigini göz öňüne getiriň. Şeýle iri kompaniýalaryň, hatda bu mukdarda maglumaty hem saklamak mümkinçiligi bar. 500öne 500 gigabaýt teksti öz içine alýan surnallarda bir möhüm ýalňyşlyk barada maglumat gözlemegiň nähili kyndygyny göz öňüne getiriň? Hat-da otly iňňedenem erbetdir. Şonuň üçin Java-a girmek, gündelige diňe säwlik maglumatlary ýazylmagy üçin düzülip bilner. Ora-da diňe möhüm ýalňyşlyklar hakda! “Java-a girmek” diýmek düýbünden dogry däl. Hakykat, bu funksiýa dile goşulmazdan ozal programmistleriň arasynda hasaba girmegiň zerurlygy ýüze çykdy. Java-yň öz hasaba alyş kitaphanasy bolansoň, her kim eýýäm log4j kitaphanasyny ulanýardy. Java-da hasaba girmegiň taryhy hakykatdanam gaty uzyn we maglumatly; boş wagtyňyz bu ýazgyny Habrede okap bilersiňiz . Gysgaça aýdylanda, Java-yň öz hasaba alyş kitaphanasy bar, ýöne ony hiç kim ulanmaýar diýen ýaly :) Soňra birnäçe dürli hasaba alyş kitaphanasy peýda bolup, ähli programmistler dürli kitaplary ulanyp başlanda, ylalaşyk meselesi ýüze çykdy. Adamlaryň dürli interfeýsli onlarça dürli kitaphanany ulanyp, şol bir zady etmeginiň öňüni almak üçin slf4j abstraksiýa çarçuwasy döredildi(“Java üçin hyzmat ýazgy fasady”). Abstrakt diýilýär, sebäbi slf4j sapaklaryny ulansaňyz we olaryň usullaryna jaň etseňiz, kapotyň aşagynda öňki hasaba alyş çarçuwalary bar: log4j, standart java.util.logging we başgalar. Häzirki wagtda beýleki kitaphanalarda ýok log4j-iň belli bir aýratynlygy gerek bolsa, taslamany bu kitaphana bilen berk baglanyşdyrmak islemeýän bolsaňyz, slf4j ulanyň. We log4j usullaryny eýýäm “çeker”. Pikiriňizi üýtgedip, indi log4j aýratynlyklaryna mätäç däldigiňize karar berseňiz, başga bir kitaphanany ulanmak üçin diňe “örtük” (ýagny slf4j) sazlamaly. Koduňyz işlemegini bes etmez, sebäbi siz belli bir kitaphana däl-de, slf4j usullaryna jaň edýärsiňiz. Kiçijik ýalňyşlyk. Aşakdaky mysallaryň işlemegi üçin slf4j kitaphanasyny we log4j kitaphanasyny şu ýerden göçürip almaly . Ondan soň, arhiwi açmaly we Intellij IDEA arkaly synp ýoluna zerur banka faýllaryny goşmaly. Menýu elementleri: Faýl -> Taslamanyň gurluşy -> Kitaphanalar Gerekli bankalary saýlaň we taslama goşuň (göçürip alan arhiwimizde köp sanly banka bar, suratlardaky zatlara serediň) Bellik - bu görkezme şollar üçin Maveni ulanmagy bilmeýän talyplar. Nädip ulanmalydygyny bilýän bolsaňyz, ondan başlamak has gowudyr: adatça has aňsat. Maveni ulanýan bolsaňyz , bu garaşlylygy goşuň: Näme üçin hasaba girmeli - 2Näme üçin hasaba girmeli - 3
<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
</dependency>
Gowy, sazlamalary düzdük :) Geliň, slf4j-iň işleýşine seredeliň. Programmanyň gidişiniň bir ýerde ýazylandygyna nädip göz ýetirip bileris? Munuň üçin bize iki zat gerek - ýazyjy we ýazyjy . Birinjisinden başlalyň. Gerazgy, ýazgylary doly dolandyrýan obýektdir . Kitap ýazgysyny döretmek gaty aňsat: statiki usul bilen amala aşyrylýar - LoggerFactory.getLogger(). Usulyň parametri hökmünde, işi ýazyljak synpdan geçmeli. Geliň kodumyzy işledeliň:
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("В программе возникла ошибка!");
   }
}
Konsol çykyşy: RAL .YŞLYK StatusLogger Log4j 2 konfigurasiýa faýly tapylmady. Bellenen konfigurasiýany ulanmak (diňe konsola ýalňyşlyklary girizmek) ýa-da ulanyjy programma taýdan üpjün edilen konfigurasiýalary ulanmak. Log4j 2 içerki başlangyç ýazgysyny görkezmek üçin ulgam häsiýetini 'log4j2.debug' düzüň. Log4j 2 15: 49: 08.907 [esasy] RALRYŞLYK MyTestClass - programmada säwlik ýüze çykdy! Bu ýerde näme görýäris? Ilki bilen säwlik habaryny görýäris. Görnüşi ýaly, häzirki wagtda zerur sazlamalar ýok. Şonuň üçin ýazgyçymyz indi diňe säwlik habarlaryny (RALRYŞLYK) we diňe konsola çykaryp biler. Usul logger.info()ýerine ýetirilmedi. Emma logger.error()netije berdi! Konsol häzirki senäni, ýalňyşlygyň ýüze çykan usulyny ( main), RALRYŞ sözüni we habarymyzy görkezýär! RAL .YŞlyk hasaba alyş derejesidir. Umuman aýdanyňda, gündelik ýazgyda RAL .YŞLYK sözi ýazylan bolsa, bu programmanyň şol pursatda ýalňyşlyk ýüze çykandygyny aňladýar. Eger ýazgy INFO sözi bilen bellenen bolsa, bu programmanyň kadaly işleýşi barada häzirki maglumatdygyny aňladýar. SLF4J kitaphanasynda hasaba alyş işini çeýe düzmäge mümkinçilik berýän birnäçe dürli hasaba alyş derejesi bar. Dolandyrmak gaty aňsat: ähli zerur logika eýýäm klasa girizildi Logger. Diňe zerur usullary çagyrmaly. Adaty habar ibermek isleseňiz jaň ediň logger.info(). Roralňyşlyk habary - logger.error(). Duýduryş görkeziň - Indi ýüz tutýanlogger.warn() hakda gürleşeliň . Maglumat beriji, maglumatlaryňyzyň gelýän ýeri. Maglumat çeşmesiniň tersini “B nokat” diýip bilersiňiz. Düzgüne görä, maglumatlar konsola çykýar. Öňki mysalda hiç zady düzmeli däldigimizi ýadyňyzdan çykarmaň: tekst konsolyň özünde peýda boldy, ýöne log4j kitaphanasyndan ýazyjy diňe konsolda ERROR derejeli habarlary çykaryp biler. Adamlar üçin tekst faýlyndan surnallary okamak we gündelikleri şol bir faýllarda saklamak has amatlydyr. Gerazgyçynyň adaty hereketini üýtgetmek üçin, faýl iberijimizi sazlamaly . Ilki bilen, src bukjasynda ýa-da Maven ulanýan bolsaňyz, çeşmeler bukjasynda log4j.xml faýly döretmeli . Siz eýýäm xml formaty bilen tanyş, ýakynda bu hakda leksiýa etdik :) Mazmuny şeýle bolar:
<?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>
Aýratynam çylşyrymly görünmeýär :) let'söne geliň mazmunyna geçeliň.
<Configuration status="INFO">
Bu "status-logger" diýilýär. Bu biziň ýazgymyz bilen baglanyşykly däl we log4j tarapyndan içerde ulanylýar. Status = "INFO" ýerine status = "TRACE" belläp bilersiňiz, we log4j-iň içerki işleýşi baradaky ähli maglumatlar konsola çykar (status-logger konsola maglumatlary çykarýar, hatda programma üçin ýüz tutýan adamymyz faýl bolsa-da) esasly). Bize indi zerurlyk ýok, şonuň üçin hemme zady bolşy ýaly goýarys.
<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>
Bu ýerde biz öz ýüzleýjimizi döredýäris. Bellik <File>, faýl boljakdygyny görkezýär. name="MyFileAppender"- ýüz tutýan adamyň ady. fileName="C:\Users\Username\Desktop\testlog.txt"- ähli maglumatlaryň ýazyljak gündelik faýlyna barýan ýol. append="true"- faýlyň soňuna çenli goşmaça maglumatlary ýazmagyň zerurlygy ýa-da ýokdugy. Biziň ýagdaýymyzda şeýle bolar. Falsealňyş düzülen bolsa , programma täzeden başlanda köne gündelik mazmuny ýok ediler. <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>- Bular formatlaşdyrma sazlamalary. Bu ýerde gündeligimizdäki tekstiň görnüşini sazlamak üçin yzygiderli aňlatmalary ulanyp bileris.
<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
Bu ýerde hasaba alyş derejesini (kök derejesi) kesgitleýäris. Bizde INFO derejesi bar: ýagny INFO-dan has ýokary derejedäki ähli habarlar (ýokarda sereden tablisamyza görä) hasaba alynmaz. Programmamyzda 3 habar bolar: biri INFO, biri DUNDURYŞ we biri RAL .YŞLYK. Häzirki konfigurasiýa bilen, 3 habaryň hemmesi gündelige ýazylar. Kök derejesini ERROR diýip üýtgetseňiz, diňe LOGGER.error () -dan soňky habar ýazylar. Mundan başga-da, bu ýere ýüz tutýanlara baglanyşyk ýerleşdirildi. Şeýle baglanyşyk döretmek üçin belligiň içinde <Root>bir bellik döretmeli <ApprenderRef>we oňa parametr goşmaly ref=”Name твоего аппендера”. Theatdan çykaran bolsaňyz, ýüz tutýan adamyň adyny şu ýerde döretdik: <File name="MyFileAppender" Ine, programmamyzyň kody!
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("Ошибка! Произошло деление на ноль!");
       }
   }
}
Elbetde, birneme egri (RuntimeException-y tutmak orta pikirdir), ýöne bu biziň maksatlarymyz üçin ajaýyp :) Geliň, usulymyzy main()yzygiderli 4 gezek işledeliň we testlog.txt faýlymyza seredeliň. Öňünden döretmegiň zerurlygy ýok: kitaphana ony awtomatiki ýerine ýetirer. Hemme zat işledi! :) Indi düzülen sazlaýjyňyz bar. Öň ýazan käbir programmalaryňyz bilen oýnap bilersiňiz, ähli usullara loger jaňlaryny goşup, netijede ýazylan gündelige seredip bilersiňiz :) Goşmaça okamak üçin bu makalany maslahat berýärin . Ol ýerde hasaba alyş mowzugy çuňňur ara alnyp maslahatlaşylýar we ony bir oturgyçda okamak aňsat bolmaz. Itöne köp peýdaly goşmaça maglumatlary öz içine alýar. Mysal üçin, testlog.txt faýlymyz belli bir ululykda bolsa, täze tekst faýly döreder ýaly, ýazgy ýazgyny nädip düzmelidigini öwrenersiňiz :) Ine, bu sapagymyzyň ahyry! Bu gün gaty möhüm bir mowzuk hakda öwrendiňiz we bu bilim geljekki işiňizde hökman peýdaly bolar. Ýene görüşeris! :)
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION