JavaRush /Java Blogu /Random-AZ /Giriş niyə lazımdır?

Giriş niyə lazımdır?

Qrupda dərc edilmişdir
Salam! Mühazirələr yazarkən xüsusi bir mövzunun real işdə mütləq istifadə ediləcəyini qeyd edirəm. Niyə girişə ehtiyacınız var - 1 Beləliklə, DİQQƏT! Bu gün toxunacağımız mövzu işin ilk günündən bütün layihələrinizdə mütləq sizə faydalı olacaq. Giriş haqqında danışacağıq. Bu mövzu heç də çətin deyil (hətta asan deyərdim). Ancaq ilk işinizdə hələ də açıq-aşkar şeylərlə məşğul olmaq üçün kifayət qədər stress olacaq, ona görə də bunu indi hərtərəfli çeşidləmək daha yaxşıdır :) Beləliklə, başlayaq. Giriş nədir? Giriş proqramın işləməsi haqqında məlumatların haradasa qeyd edilməsidir. Bu məlumatların yazıldığı yerə “ log ” deyilir. Bir anda iki sual yaranır: harada və hansı məlumatlar qeyd olunur? "harada" ilə başlayaq. Siz bir çox müxtəlif yerlərdə proqram əməliyyat məlumatlarını qeyd edə bilərsiniz. Məsələn, təhsiliniz zamanı tez-tez istifadə edərək konsola məlumat çıxarırsınız System.out.println(). Bu, ən sadə olsa da, əsl girişdir. Əlbəttə ki, bu, müştəri və ya məhsula dəstək komandası üçün çox əlverişli deyil: onlar açıq-aydın IDE quraşdırmaq və konsola nəzarət etmək istəməyəcəklər :) Məlumatların yazılması üçün daha tanış format da var - mətn faylında. İnsanlar üçün onları bu şəkildə oxumaq çox asandır və əlbəttə ki, saxlamaq daha asandır! İndi ikinci sual: proqramın işləməsi ilə bağlı hansı məlumatlar jurnalda qeyd edilməlidir? Ancaq burada hər şey sizdən asılıdır! Java giriş sistemi çox çevikdir. Siz onu elə konfiqurasiya edə bilərsiniz ki, proqramınızın bütün gedişatı qeyd olunacaq. Bir tərəfdən bu yaxşıdır. Ancaq digər tərəfdən, orada hər şey yazılsa, Facebook və ya Twitter jurnallarının hansı ölçülərə çata biləcəyini təsəvvür edin. Belə böyük şirkətlər, yəqin ki, hətta bu qədər məlumatı saxlamaq imkanına malikdirlər. Bəs təsəvvür edin ki, 500 giqabayt mətni olan jurnallarda bir kritik xəta haqqında məlumat axtarmaq nə qədər çətin olacaq? Samanlıqdakı iynədən də pisdir. Buna görə də, Java-da daxil olmaq konfiqurasiya edilə bilər ki, jurnala (log) yalnız səhv məlumatları yazılsın. Və ya hətta kritik səhvlər haqqında! Baxmayaraq ki, “Java-ya daxil olmaq” demək tamamilə doğru deyil. Məsələ burasındadır ki, bu funksionallıq dilə əlavə olunmazdan əvvəl proqramçılar arasında logging ehtiyacı yaranmışdı. Java-nın öz logging kitabxanası olanda artıq hər kəs log4j kitabxanasından istifadə edirdi. Java-da girişin yaranma tarixi əslində çox uzun və informativdir; boş vaxtlarınızda bu yazını Habré-də oxuya bilərsiniz . Bir sözlə, Java-nın öz logging kitabxanası var, lakin ondan demək olar ki, heç kim istifadə etmir :) Sonralar bir neçə fərqli logging kitabxanası meydana çıxanda və bütün proqramçılar fərqli olanlardan istifadə etməyə başlayanda uyğunluq problemi yarandı. Fərqli interfeyslərə malik onlarla fərqli kitabxanadan istifadə edərək insanların eyni işi görməsinin qarşısını almaq üçün slf4j abstraksiya çərçivəsi yaradılmışdır.(“Java üçün Xidmət Giriş Fasad”). Buna abstraktlaşdırma deyilir, çünki siz slf4j siniflərindən istifadə etsəniz və onların metodlarını çağırsanız da, onların bütün əvvəlki giriş çərçivələri işləyir: log4j, standart java.util.logging və s. Hal-hazırda digər kitabxanalarda olmayan log4j funksiyasına ehtiyacınız varsa, lakin siz layihəni bu xüsusi kitabxana ilə ciddi şəkildə əlaqələndirmək istəmirsinizsə, sadəcə olaraq slf4j-dən istifadə edin. Və o, artıq log4j üsullarını "çəkəcək". Əgər fikrinizi dəyişsəniz və log4j funksiyalarına artıq ehtiyacınız olmadığına qərar versəniz, başqa kitabxanadan istifadə etmək üçün sadəcə “sarğı”nı (yəni slf4j) yenidən konfiqurasiya etməlisiniz. Sizin kodunuz işləməyi dayandırmayacaq, çünki onda siz konkret kitabxananın deyil, slf4j metodlarını çağırırsınız. Kiçik bir sapma. Aşağıdakı nümunələrin işləməsi üçün slf4j kitabxanasını buradan , log4j kitabxanasını isə buradan yükləməlisiniz . Sonra, arxivi boşaltmalı və lazım olan jar fayllarını Intellij IDEA vasitəsilə sinif yoluna əlavə etməliyik. Menyu elementləri: Fayl -> Layihənin Strukturu -> Kitabxanalar Lazım olan bankaları seçin və onları layihəyə əlavə edin (yüklədiyimiz arxivlərdə çoxlu bankalar var, şəkillərdə sizə lazım olanlara baxın) Niyə girişə ehtiyacınız var - 2Niyə girişə ehtiyacınız var - 3Qeyd - bu təlimat onlar üçündür Maven-dən necə istifadə edəcəyini bilməyən tələbələr. Əgər ondan necə istifadə edəcəyinizi bilirsinizsə, ondan başlamağa cəhd etmək daha yaxşıdır: bu adətən çox asandır.Əgər Maven istifadə edirsinizsə , bu asılılığı əlavə edin:
<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
</dependency>
Əla, biz parametrləri sıraladıq :) Gəlin baxaq slf4j necə işləyir. Proqramın gedişatının haradasa qeydə alındığına necə əmin ola bilərik? Bunun üçün bizə iki şey lazımdır - loggerappender . Birincidən başlayaq. Logger qeydlərin aparılmasını tamamilə idarə edən bir obyektdir . Bir logger yaratmaq çox asandır: statik metoddan istifadə etməklə həyata keçirilir - LoggerFactory.getLogger(). Metodun parametri olaraq, işi qeyd olunacaq bir sinfi keçmək lazımdır. Kodumuzu işə salaq:
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 çıxışı: ERROR StatusLogger Log4j 2 konfiqurasiya faylı tapılmadı. Defolt konfiqurasiyadan istifadə (yalnız səhvləri konsola daxil etmək) və ya istifadəçinin proqramla təmin etdiyi konfiqurasiyalar. Log4j 2 daxili başlatma qeydini göstərmək üçün 'log4j2.debug' sistem xassəsini təyin edin. Log4j 2 15:49:08.907 15:49:08.907 [əsas] XƏTƏ MyTestClass - Proqramda xəta baş verdi! Biz burada nə görürük? Əvvəlcə bir səhv mesajı görürük. Hazırda lazımi parametrlərimiz olmadığı üçün ortaya çıxdı. Buna görə də, qeydiyyatçımız indi yalnız səhv mesajlarını (ERROR) və yalnız konsola çıxara bilər. Metod logger.info()icra edilmədi. Amma logger.error()işlədi! Konsol cari tarixi, xətanın baş verdiyi metodu ( main), ERROR sözünü və mesajımızı göstərir! ERROR qeyd səviyyəsidir. Ümumiyyətlə, əgər log girişi ERROR sözü ilə qeyd olunubsa, bu, proqramın həmin nöqtəsində xətanın baş verdiyini bildirir. Əgər giriş INFO sözü ilə qeyd olunubsa, bu, proqramın normal işləməsi haqqında sadəcə cari məlumat deməkdir. SLF4J kitabxanasında girişi çevik şəkildə konfiqurasiya etməyə imkan verən kifayət qədər müxtəlif giriş səviyyələri var. Onları idarə etmək çox asandır: bütün lazımi məntiq artıq sinifə daxil edilmişdir Logger. Sadəcə lazımi üsulları çağırmaq lazımdır. Əgər müntəzəm mesaj göndərmək istəyirsinizsə, zəng edin logger.info(). Səhv mesajı - logger.error(). Xəbərdarlığı göstərin - İndi əlavəlogger.warn() haqqında danışaq . Əlavə məlumatlarınızın gəldiyi yerdir. Məlumat mənbəyinin əksinin “B nöqtəsi” olduğunu söyləyə bilərsiniz. Varsayılan olaraq, məlumatlar konsola çıxarılır. Nəzərə alın ki, əvvəlki nümunədə biz heç nəyi konfiqurasiya etməli deyildik: mətn konsolun özündə göründü, lakin log4j kitabxanasından qeydiyyatçı konsola yalnız ERROR səviyyəli mesajlar çıxara bilər. İnsanlar üçün mətn faylından qeydləri oxumaq və qeydləri eyni fayllarda saxlamaq daha rahatdır. Qeydiyyatçının standart davranışını dəyişmək üçün biz fayl əlavəsini konfiqurasiya etməliyik . Başlamaq üçün log4j.xml faylını birbaşa src qovluğunda və ya Maven istifadə edirsinizsə, resurslar qovluğunda və ya Maven istifadə etdiyiniz halda resurslar qovluğunda yaratmalısınız . Siz artıq xml formatı ilə tanışsınız, bu yaxınlarda bu haqda mühazirəmiz oldu :) Onun məzmunu belə olacaq:
<?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>
Xüsusilə mürəkkəb görünmür :) Amma yenə də məzmunu nəzərdən keçirək.
<Configuration status="INFO">
Bu, status-logger adlanır. Bu, bizim loggerimizlə əlaqəli deyil və log4j tərəfindən daxili olaraq istifadə olunur. Siz status=“INFO” əvəzinə status=“TRACE” təyin edə bilərsiniz və log4j-in daxili işləməsi ilə bağlı bütün məlumatlar konsola çıxarılacaq (status-logger proqram üçün əlavəmiz fayl olsa belə konsola məlumatları çıxarır. -əsaslıdır). İndi buna ehtiyacımız yoxdur, ona görə də hər şeyi olduğu kimi buraxacağıq.
<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>
Burada əlavəmizi yaradırıq. Teq <File>onun fayl olacağını bildirir. name="MyFileAppender"- əlavəmizin adı. fileName="C:\Users\Username\Desktop\testlog.txt"— bütün məlumatların yazılacağı log faylına gedən yol. append="true"— faylın sonuna əlavə məlumat yazmaq lazım olub-olmaması. Bizim vəziyyətimizdə belə olacaq. Yanlış olaraq təyin edilərsə , proqram hər dəfə yenidən işə salındıqda köhnə jurnalın məzmunu silinəcək. <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>- Bunlar formatlama parametrləridir. Burada jurnalımızdakı mətnin formatını fərdiləşdirmək üçün müntəzəm ifadələrdən istifadə edə bilərik.
<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
Burada logging səviyyəsini (kök səviyyəsi) təyin edirik. Bizdə INFO səviyyəsi müəyyən edilmişdir: yəni INFO-dan yuxarı səviyyələrdə olan bütün mesajlar (yuxarıda baxdığımız cədvələ görə) jurnala daxil edilməyəcək. Proqramımızda 3 mesajımız olacaq: bir MƏLUMAT, bir XƏBƏRDARLIQ və bir XƏTƏ. Cari konfiqurasiya ilə hər 3 mesaj jurnala yazılacaq. Kök səviyyəsini ERROR-a dəyişsəniz, yalnız LOGGER.error()-dan gələn son mesaj qeyd olunacaq. Bundan əlavə, əlavəyə keçid burada yerləşdirilir. <Root>Belə bir keçid yaratmaq üçün teq daxilində teq yaratmalı <ApprenderRef>və ona parametr əlavə etməlisiniz ref=”Name твоего аппендера”. Unutduğunuz halda əlavənin adını burada yaratdıq: <File name="MyFileAppender" Və proqramımızın kodu budur!
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("Ошибка! Произошло деление на ноль!");
       }
   }
}
Təbii ki, bu, bir az əyridir (RuntimeException-ı tutmaq vasat bir fikirdir), lakin bu, bizim məqsədlərimiz üçün mükəmməldir :) Gəlin metodumuzu main()ardıcıl 4 dəfə işlədək və testlog.txt faylımıza baxaq. Əvvəlcədən yaratmağa ehtiyac yoxdur: kitabxana bunu avtomatik edəcək. Hər şey işlədi! :) İndi konfiqurasiya edilmiş bir qeyd cihazınız var. Siz əvvəllər yazdığınız bəzi proqramlarla oynaya, bütün metodlara qeydiyyatçı zəngləri əlavə edə və nəticədə jurnala baxa bilərsiniz :) Əlavə oxumaq üçün bu məqaləni çox tövsiyə edirəm . Orada ağac kəsmə mövzusu dərindən müzakirə olunur və onu bir oturuşda oxumaq asan olmayacaq. Ancaq bir çox faydalı əlavə məlumat ehtiva edir. Məsələn, testlog.txt faylımız müəyyən ölçüyə çatarsa, yeni mətn faylı yaratması üçün loggeri necə konfiqurasiya etməyi öyrənəcəksiniz :) Və bununla da dərsimizin sonu! Bu gün siz çox vacib bir mövzu haqqında öyrəndiniz və bu bilik gələcək işinizdə mütləq sizin üçün faydalı olacaqdır. Yenidən görüşərik! :)
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION