"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. Bir 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
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-catch
blokuncatch
ilə əvəz olunduğunu görmüsünüze.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.
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.println
Düşü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.logging
mə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.info
Onu 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
GO TO FULL VERSION