JavaRush /Java блогу /Random-KY /Java Logging. Стектрастандын шарын бошотуңуз

Java Logging. Стектрастандын шарын бошотуңуз

Группада жарыяланган
"Кутмандуу күн, бүгүн өнөр жай сайтында окуя катталды, мен иштеп чыгуучунун анализ тобуна кошулушун суранам." Жумуштагы күндөрдүн бири ушундай башталышы мүмкүн, же эртең менен болушу мүмкүн - бул маанилүү эмес. Бирок, келгиле, башынан баштайлы. Бул жерде JavaRush көйгөйлөрүн чечүү менен, сиз иштеген жана андан күтүлгөн нерсени аткарган code жазууну үйрөнөсүз. Эгер сиз жардам бөлүмүн карасаңыз , бул дайыма эле биринчи жолу иштебей турганы көрүнүп турат. Жумушта да ошондой болот. Сиз дайыма эле көйгөйдү биринчи жолу чече албайсыз: мүчүлүштүктөр биздин түбөлүк шериктештерибиз. Сиз мүчүлүштүктөрдү окуяларды калыбына келтирүү үчүн маанилүү болуп саналат. Каттоо.  Стектрастандын шарын чечиңиз - 1Келгиле, бир мисал менен баштайлы. Келгиле, сизди мorция кызматкери деп элестетип көрөлү. Окуя болгон жерге сизди чакырышты (дүкөндө айнек сынды), сиз келдиңиз, алар сизден эмне болгондугу боюнча жооп күтүп жатышат. Эмнеден баштасам? Мorция кандай иштегенин билбейм. Абдан шарттуу - алар күбөлөрдү, далилдерди жана башка нерселерди издей башташат. Эгер ошол жердин өзү эмне болгонун майда-чүйдөсүнө чейин айтып бере алсачы? Мисалы, бул сыяктуу:
  • 21:59 ээси ойготкучту күйгүздү (толук иштетилгенге чейин 5 мүнөт)
  • 22:00 ээси эшикти жапты
  • 22:05 толук ойготкучту жандыруу
  • 22:06 ээси тутканы тартып алды
  • 23:15 ызы-чуу сенсору күйгүзүлдү
  • 23:15 Катуу үргөн иттер жанынан чуркап өтүштү
  • 23:15 ызы-чуу сенсору өчүрүлгөн
  • 01:17 дисплейдин сырткы айнегиндеги шок сенсору күйгүзүлдү
  • 01:17 көгүчкөн айнекке учуп кетти
  • 01:17 айнек сынды
  • 01:17 сирена күйүп турат
  • 01:17 көгүчкөн өзүн силкип, учуп кетти
Ооба, мындай майда-чүйдөсүнө чейин көп убакыт изилдеп кереги жок, эмне болгонун дароо айкын болот. Ошол эле өнүгүүдө. Жазуулардан эмне болгонун айта алсаңыз, бул абдан сонун. Эми сиз мүчүлүштүктөрдү оңдоону эстеп жаткандырсыз, анткени сиз баарын оңдоого болот. Бирок жок. Сиз үйгө кеттиңиз, түнү менен баары бузулду, мүчүлүштүктөрдү оңдоого эч нерсе жок: эмне үчүн сынганын түшүнүп, оңдоо керек. Бул жерде журналдар, бир түн ичинде болгон нерселердин тарыхы пайда болот. Макаланын жүрүшүндө, мен сизге эң атактуу токойчулардын бири (чындыгында токойчу эмес, көбүрөөк мониторинг сыяктуу) жөнүндө ойлонуп көрүүнү сунуштайм, ал жөнүндө жаңылыктарды уккан (көргөн) ар бир адам уккандыр? Анын аркасында кээ бир окуялар калыбына келтирилет. Эми олуттуу карайлы. Java'га кирүү - бул codeдо болгон окуяларды жазуу процесси. Программист катары сиздин codeуңуздун эмне кылганын жазуу сиздин милдетиңиз, анткени анда бул журналдар анализ үчүн сизге берилет. Эгер баары жакшы жасалса, анда бардык мүчүлүштүктөр тез арада чечилет жана оңдолот. Бул жерде, мен, балким, кандай токойчулар бар экенин изилдеп эмес. Бул макалада биз жөнөкөй нерсе менен чектелебиз java.util.Logger: бул бири-бири менен таанышуу үчүн жетиштүү. Ар бир журнал жазуусу дата-убакыт, окуя деңгээлин, билдирүүнү камтыйт. Дата жана убакыт автоматтык түрдө киргизилет. Окуянын деңгээли билдирүүнүн автору тарабынан тандалат. Бир нече деңгээли бар. Негизгилери маалымат, мүчүлүштүктөрдү оңдоо, ката.
  • INFO - адатта, бул эмне болуп жаткандыгы жөнүндө маалымат билдирүүлөр, датасы боюнча тарых сыяктуу бир нерсе: 1915 - бир нерсе болду, 1916 - башка нерсе.
  • DEBUG - белгилүү бир учурдун окуяларын кененирээк сүрөттөйт. Мисалы, тарыхта болгон салгылашуулардын чоо-жайы оңдоп-түзөө деңгээлинде." Командир Такойтович өз армиясы менен Селовича айылын көздөй бет алды ."
  • ERROR - пайда болгон каталар адатта ушул жерде жазылат. Сиз бир нерсени орогондо try-catchблоктун catchменен алмаштырылганын байкаган чыгарсыз e.printStacktrace(). Ал консолго киришти гана чыгарат. Логерди колдонуп, сиз бул жазууну журналга жөнөтө аласыз (хаха), сиз идеяны аласыз.
  • ЭСКЕРТҮҮ - эскертүүлөр бул жерде жазылган. Мисалы, унаадагы ысып кеткен жарык. Бул жөн гана эскертүү жана бир нерсени өзгөртүү жакшы, бирок бул бузулуу эмес. Машина бузулганда, биз ERROR деңгээли менен каттайбыз.
Биз деңгээлдерди иреттеп койдук. Бирок кабатыр болбоңуз: алардын ортосундагы сызык абдан ичке - муну баары эле түшүндүрө алbyte. Мындан тышкары, ал долбоордон долбоорго ар кандай болушу мүмкүн. Улук иштеп чыгуучу сизге кайсы деңгээлде жана эмнени киргизүү керектигин түшүндүрөт. Эң негизгиси, бул жазуулар келечекте анализдөө үчүн жетиштүү. Ал эми бул учуп эле түшүнүлөт. Кийинки орнотуулар. Логгерлерге кайда жазууну (консолго, файлга, jms же башка жерге) айтып, деңгээлди (маалымат, ката, мүчүлүштүктөрдү оңдоо...) көрсөтүүгө болот. Жөнөкөй логгерибиздин жөндөөлөрүнүн мисалы мындай көрүнөт:
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
Бул учурда, бардыгы логгер файлга жана консолго бир эле учурда жаза тургандай конфигурацияланган. Андайда? консолдо бир нерсе өчүрүлгөн болсо, файл боюнча издөө оңой болот. Экөө үчүн тең INFO деңгээли. Файл үчүн ат үлгүсү да көрсөтүлгөн. Бул консолго да, файлга да жазууга мүмкүндүк берген минималдуу конфигурация. файлдагы эски жазуулар өчүп калбашы үчүн truejava.util.logging.FileHandler.append деп коюңуз . Колдонуунун мисалы бул (комментарийсиз, логгер өзү жөнүндө комментарий берет):
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);
        }
    }
}
Бул эң жакшы үлгү эмес, мен колдо болгонду алдым. Мисал чыгаруу:
апр 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)
Бул жерде мен ноталарга токтолгум келет:
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Размер equals 3
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Получим первый элемент
Бул жазуу таптакыр пайдасыз жана маалыматтуу эмес. Ката жазуусу сыяктуу:
WARNING: что-то пошло не так
Сиз муну жазбашыңыз керек: бул журнал үчүн журнал, ал жолго гана тоскоол болот. Ар дайым маңыздуу нерселерди жазганга аракет кылыңыз. System.out.printlnБул аны колдонууну токтотуп , чоңдорго оюнчуктарга өтүү үчүн жетиштүү деп ойлойм . Анын java.util.loggingкемчorктери бар. Мисалы, мен жогоруда сүрөттөгөн деңгээлдер бул жерде эмес, бирок алар эң көп колдонулган логгерлерде. Мен аны бул макала үчүн тандап алдым java.util.logging, анткени ал туташуу менен кошумча манипуляцияларды талап кылbyte. LOGGER.infoМен анын ордуна колдонсо болорун белгилей кетейин, LOGGER.log(Level.INFO... бул жерде буга чейин эле пайда болгон кемчorктердин бири: LOGGER.log(Level.WARNING,"что-то пошло не так" , e);- бул кабарды жана an objectти өткөрүүгө мүмкүндүк берет Exception, логгер өзү аны сонун жазат. Ошол эле учурда, LOGGER.warning("");ал бир гана билдирүү алат, б.а. Өзгөчөлүктү өткөрүү мүмкүн эмес, аны өзүңүз сапка которууңуз керек. Мен бул мисал Java журналы менен таанышуу үчүн жетиштүү деп үмүттөнөм. Андан кийин башка логгерлерди (log4j, slf4j, Logback...) туташтыра аласыз - алар көп, бирок иш-аракеттердин тарыхын жазуу үчүн маңызы бир ^. Расмий окуу куралы
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION