JavaRush /Java Blogu /Random-AZ /Java Girişi. Bir stectrace topunu açın

Java Girişi. Bir stectrace topunu açın

Qrupda dərc edilmişdir
"Axşamınız xeyir, bu gün sənaye sahəsində bir insident qeydə alınıb, tərtibatçıdan analiz qrupuna qoşulmasını xahiş edirəm." İşinizdəki günlərdən biri belə bir şeyə başlaya bilər və ya səhər ola bilər - fərq etməz. Amma gəlin əvvəldən başlayaq. Burada JavaRush-da problemləri həll etməklə siz işləyən və ondan gözlənilənləri yerinə yetirən kodu yazmağı öyrənirsiniz. Yardım bölməsinə baxsanız , aydın olur ki, bu həmişə ilk dəfə işləmir. İşdə də belə olacaq. Problemi həmişə ilk dəfə həll etməyəcəksiniz: səhvlər bizim əbədi yoldaşlarımızdır. Səhv hadisələrini bərpa edə bilməyiniz vacibdir. Giriş.  Bir top stectrace açın - 1Bir nümunə ilə başlayaq. Təsəvvür edək ki, siz polissiniz. Sizi hadisə yerinə çağırıblar (mağazada şüşə sındırılıb), gəlib çatmısınız, baş verənlərlə bağlı sizdən cavab gözləyirlər. Haradan başlamaq lazımdır? Polisin necə işlədiyini bilmirəm. Çox şərti olaraq - şahidlər, sübutlar və digər şeylər axtarmağa başlayırlar. Nə baş verdiyini yerin özü sizə ətraflı izah etsəydi? Məsələn, bu kimi:
  • 21:59 sahibi həyəcan siqnalını işə saldı (tamamilə işə salınana qədər 5 dəqiqə)
  • 22:00 sahibi qapını bağladı
  • 22:05 tam həyəcan aktivləşdirilməsi
  • 22:06 sahibi qolu çəkdi
  • 23:15 səs-küy sensoru işə salındı
  • 23:15 it sürüsü ucadan hürərək yanlarından qaçdı
  • 23:15 səs-küy sensoru söndürülüb
  • 01:17 ekran qutusunun xarici şüşəsindəki şok sensoru işə salındı
  • 01:17 göyərçin şüşəyə uçdu
  • 01:17 şüşə qırıldı
  • 01:17 siren aktivdir
  • 01:17 göyərçin özünü silkələyib uçdu
Yaxşı, bu cür təfərrüatları uzun müddət araşdırmaq lazım deyil, nə baş verdiyi dərhal aydın olur. Eyni şey inkişafdadır. Yazılardan nə baş verdiyini deyə bildiyiniz zaman çox gözəldir. İndi siz sazlamağı xatırlayırsınız, çünki siz hər şeyi düzəldə bilərsiniz. Amma yox. Evə getdin və gecə hər şey pozuldu, düzəliş etmək üçün heç bir şey yoxdur: niyə qırıldığını başa düşmək və düzəltmək lazımdır. Burada logların, bir gecədə baş verən hər şeyin tarixinin meydana çıxdığı yerdir. Məqalənin gedişində sizə xəbərləri dinləyən (izləyən) hər kəsin yəqin ki, eşitdiyi ən məşhur ağac kəsənlərdən biri (əslində ağac kəsən deyil, daha çox monitorinq kimi) haqqında düşünməyi təklif edirəm? Onun sayəsində bəzi hadisələr bərpa olunur. İndi gəlin ciddiləşək. Java-ya daxil olmaq kodda baş verən hər hansı hadisənin qeyd edilməsi prosesidir. Kodunuzun nə etdiyini yazmaq bir proqramçı kimi sizin məsuliyyətinizdir, çünki o zaman bu loglar analiz üçün sizə veriləcək. Hər şey yaxşı olarsa, hər hansı bir səhv çox tez sıralanacaq və düzəldiləcəkdir. Burada, yəqin ki, hansı növ ağac kəsənlərin olduğunu araşdırmayacağam. Bu yazıda biz özümüzü sadə ilə məhdudlaşdıracağıq java.util.Logger: bu, bir-birimizi tanımaq üçün kifayətdir. Hər bir jurnalda tarix-vaxt, hadisə səviyyəsi, mesaj var. Tarix və vaxt avtomatik olaraq daxil edilir. Tədbir səviyyəsi mesaj müəllifi tərəfindən seçilir. Bir neçə səviyyə var. Əsas olanlar məlumat, debug, səhvdir.
  • INFO - adətən bunlar baş verənlər haqqında məlumat mesajlarıdır, tarixə görə tarix kimi bir şey: 1915 - bir şey oldu, 1916 - başqa bir şey.
  • DEBUG - müəyyən bir anın hadisələrini daha ətraflı təsvir edir. Məsələn, tarixdəki döyüşün təfərrüatları debug səviyyəsindədir." Komandir Takoytoviç ordusu ilə Seloviç kəndinə doğru irəlilədi ."
  • ERROR - baş verən xətalar adətən burada yazılır. Yəqin ki, siz nəyisə bükdüyünüz zaman try-catchblokun catchilə əvəz olunduğunu görmüsünüz e.printStacktrace(). O, yalnız girişi konsola çıxarır. Bir logger istifadə edərək, bu girişi loggerə göndərə bilərsiniz (haha), siz fikir əldə edirsiniz.
  • XƏBƏRDARLIQ - burada xəbərdarlıqlar yazılır. Məsələn, bir avtomobildə həddindən artıq istiləşmə işığı. Bu, sadəcə bir xəbərdarlıqdır və nəyisə dəyişdirmək daha yaxşıdır, amma bu, qəza deyil. Maşın xarab olduqda, biz ERROR səviyyəsi ilə daxil olacağıq.
Səviyyələri sıraladıq. Ancaq narahat olmayın: aralarındakı xətt çox incədir - hər kəs bunu izah edə bilməz. Üstəlik, layihədən layihəyə fərqli ola bilər. Böyük bir tərtibatçı sizə hansı səviyyədə və nəyi daxil etməyi izah edəcək. Əsas odur ki, bu qeydlər gələcək təhlillər üçün sizin üçün kifayətdir. Və bu tez başa düşülür. Sonrakı parametrlər. Loggerlərə hara yazmaq (konsola, fayla, jms və ya başqa yerə) və səviyyəni (məlumat, xəta, debug...) təyin etmək olar. Sadə loggerimiz üçün parametrlərin nümunəsi belə görünür:
handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler

java.util.logging.FileHandler.level     = INFO
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.append    = true
java.util.logging.FileHandler.pattern   = log.%u.%g.txt

java.util.logging.ConsoleHandler.level     = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
Bu halda, hər şey konfiqurasiya edilir ki, logger eyni anda bir fayla və konsola yazsın. Bu halda? konsolda nəsə silinibsə, üstəlik fayl üzrə axtarış etmək daha asandır. Hər ikisi üçün INFO səviyyəsi. Fayl üçün ad nümunəsi də müəyyən edilmişdir. Bu, bir anda həm konsola, həm də fayla yazmağa imkan verən minimal konfiqurasiyadır. fayldakı köhnə qeydlərin silinməməsi üçün doğrujava.util.logging.FileHandler.append olaraq təyin edin . İstifadə nümunəsi belədir (şərhlər olmadan, logger özü haqqında şərh edir):
public class Main {
    static Logger LOGGER;
    static {
        try(FileInputStream ins = new FileInputStream("C:\\log.config")){ \\полный путь до file с конфигами
            LogManager.getLogManager().readConfiguration(ins);
            LOGGER = Logger.getLogger(Main.class.getName());
        }catch (Exception ignore){
            ignore.printStackTrace();
        }
    }
    public static void main(String[] args) {
        try {
            LOGGER.log(Level.INFO,"Начало main, создаем лист с типизацией Integers");
            List<Integer> ints = new ArrayList<Integer>();
            LOGGER.log(Level.INFO,"присваиваем лист Integers листу без типипзации");
            List empty = ints;
            LOGGER.log(Level.INFO,"присваиваем лист без типипзации листу строк");
            List<String> string = empty;
            LOGGER.log(Level.WARNING,"добавляем строку \"бла бла\" в наш переприсвоенный лист, возможна ошибка");
            string.add("бла бла");
            LOGGER.log(Level.WARNING,"добавляем строку \"бла 23\" в наш переприсвоенный лист, возможна ошибка");
            string.add("бла 23");
            LOGGER.log(Level.WARNING,"добавляем строку \"бла 34\" в наш переприсвоенный лист, возможна ошибка");
            string.add("бла 34");


            LOGGER.log(Level.INFO,"выводим все элементы листа с типизацией Integers в консоль");
            for (Object anInt : ints) {
                System.out.println(anInt);
            }

            LOGGER.log(Level.INFO,"Размер equals " + ints.size());
            LOGGER.log(Level.INFO,"Получим первый элемент");
            Integer integer = ints.get(0);
            LOGGER.log(Level.INFO,"выведем его в консоль");
            System.out.println(integer);

        }catch (Exception e){
            LOGGER.log(Level.WARNING,"что-то пошло не так" , e);
        }
    }
}
Bu ən yaxşı nümunə deyil, mən əlimdə olanı götürdüm. Nümunə çıxışı:
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Начало main, создаем лист с типизацией Integers
апр 19, 2019 1:10:14 AM generics.Main main
INFO: присваиваем лист Integers листу без типипзации
апр 19, 2019 1:10:14 AM generics.Main main
INFO: присваиваем лист без типипзации листу строк
апр 19, 2019 1:10:14 AM generics.Main main
WARNING: добавляем строку "бла бла" в наш переприсвоенный лист, возможна ошибка
апр 19, 2019 1:10:14 AM generics.Main main
WARNING: добавляем строку "бла 23" в наш переприсвоенный лист, возможна ошибка
апр 19, 2019 1:10:14 AM generics.Main main
WARNING: добавляем строку "бла 34" в наш переприсвоенный лист, возможна ошибка
апр 19, 2019 1:10:14 AM generics.Main main
INFO: выводим все элементы листа с типизацией Integers в консоль
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Размер equals 3
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Получим первый элемент
апр 19, 2019 1:10:14 AM generics.Main main
WARNING: что-то пошло не так
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
	at generics.Main.main(Main.java:45)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Burada qeydlərə diqqət yetirmək istəyirəm:
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Размер equals 3
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Получим первый элемент
Bu giriş olduqca faydasızdır və məlumatlandırıcı deyil. Səhv girişi kimi:
WARNING: что-то пошло не так
Bunu yazmamalısınız: bu, bir günlük xatirinə bir jurnaldır, o, yalnız yola çıxacaq. Həmişə mənalı şeylər yazmağa çalışın. System.out.printlnDüşünürəm ki, bu, istifadəni dayandırmaq və böyüklər üçün oyuncaqlara keçmək üçün kifayətdir . Bunun java.util.loggingmənfi cəhətləri var. Məsələn, yuxarıda təsvir etdiyim səviyyələr burada deyil, lakin ən çox istifadə olunan loggerlərdədir. Bu məqalə üçün onu seçdim, java.util.loggingçünki əlaqə ilə əlavə manipulyasiya tələb etmir. LOGGER.infoOnu da qeyd edim ki, onun yerinə istifadə etmək olar. LOGGER.log(Level.INFO... Mənfi cəhətlərdən biri artıq burada görünür: LOGGER.log(Level.WARNING,"что-то пошло не так" , e);- bu, mesajı və obyekti ötürməyə imkan verir Exception, logger özü onu gözəl yazacaq. Eyni zamanda, LOGGER.warning("");yalnız bir mesaj alır, yəni. İstisna keçə bilməz, onu özünüz sətirə çevirməlisiniz. Ümid edirəm ki, bu nümunə Java logging ilə tanış olmaq üçün kifayətdir. Sonra digər loggerləri (log4j, slf4j, Logback...) birləşdirə bilərsiniz - onların çoxu var, amma mahiyyəti eynidir^ hərəkətlərin tarixini qeyd etmək. Rəsmi dərslik
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION