JavaRush /Java блогы /Random-KK /Java журналы. Стектрас допын босатыңыз

Java журналы. Стектрас допын босатыңыз

Топта жарияланған
«Қайырлы күн, бүгін өндірістік алаңда оқиға тіркелді, әзірлеушіден талдау тобына қосылуын сұраймын». Жұмыстағы күндеріңіздің бірінде осындай нәрсе басталуы мүмкін немесе таңертең болуы мүмкін - бұл маңызды емес. Бірақ басынан бастайық. Мұнда JavaRush-те мәселелерді шешу арқылы сіз жұмыс істейтін және одан күтілетін нәрсені жасайтын code жазуды үйренесіз. Анықтама бөліміне қарасаңыз , бұл әрқашан бірінші рет жұмыс істемейтіні анық. Жұмыста да солай болады. Сіз әрқашан мәселені бірінші рет шеше алмайсыз: қателер біздің мәңгілік серігіміз. Қате оқиғаларын қалпына келтіру маңызды. Тіркеу.  Стектрас допын шешіңіз - 1Мысалдан бастайық. Сіз полицей екеніңізді елестетейік. Оқиға орнына сізді шақырды (дүкенде әйнек сынды), сіз келдіңіз, олар сізден не болғаны туралы жауап күтуде. Неден бастау керек? Мен полицияның қалай жұмыс істейтінін білмеймін. Өте шартты түрде - олар куәгерлерді, дәлелдемелерді және осының бәрін іздей бастайды. Орынның өзі не болғанын егжей-тегжейлі айтып берсе ше? Мысалы, келесідей:
  • 21:59 иесі дабылды қосты (толық іске қосылғанға дейін 5 minutes)
  • 22:00 иесі есікті жауып тастады
  • 22:05 дабылды толық қосу
  • 22:06 иесі тұтқаны тартып алды
  • 23:15 шу сенсоры қосылды
  • 23:15 Бір топ иттер қатты үріп, жүгіріп өтті
  • 23:15 шу сенсоры өшірілген
  • 01:17 дисплей корпусының сыртқы әйнегіндегі соққы сенсоры қосылды
  • 01:17 стақанға көгершін ұшып кетті
  • 01:17 шыны сынды
  • 01:17 сирена қосулы
  • 01:17 көгершін өзін сілкіп, ұшып кетті
Мұндай егжей-тегжейлерді ұзақ уақыт зерттеудің қажеті жоқ, не болғаны бірден түсінікті. Дәл солай дамуда. Жазбалардан не болғанын білу өте керемет. Енді сіз жөндеуді есте сақтауыңыз мүмкін, себебі сіз бәрін жөндеуге болады. Бірақ жоқ. Сіз үйге бардыңыз, түнде бәрі бұзылды, жөндеуге ештеңе жоқ: оның неге сынғанын түсініп, оны жөндеу керек. Бұл жерде бөренелер, бір түнде болған барлық оқиғалардың тарихы ойнайды. Мақала барысында мен сізге ең танымал логгерлердің бірі (шынымен де, монитор емес, бақылау сияқты) қандай екендігі туралы ойлануды ұсынамын, бұл жаңалықтарды тыңдайтын (қарайтын) әрбір адам естіген шығар? Оның арқасында кейбір оқиғалар қалпына келтірілді. Енді байыпты болайық. Java жүйесіне кіру – codeта орын алған кез келген оқиғаларды жазу процесі. Кодыңыздың не істегенін жазу бағдарламашы ретінде сіздің жауапкершілігіңіз, өйткені бұл журналдар талдау үшін сізге беріледі. Егер бәрі жақсы жасалса, кез келген қате өте тез реттеледі және түзетіледі. Бұл жерде мен ағаш кесушілер қандай екенін зерттемейтін шығармын. Бұл мақалада біз қарапайым нәрсемен шектелеміз java.util.Logger: бұл бір-бірін білу үшін жеткілікті. Әрбір журнал жазбасында күн-уақыт, оқиға деңгейі, хабар бар. Күн мен уақыт автоматты түрде енгізіледі. Оқиға деңгейін хабар авторы таңдайды. Бірнеше деңгейлер бар. Негізгілері – ақпарат, жөндеу, қате.
  • INFO - әдетте бұл не болып жатқаны туралы ақпараттық хабарламалар, дата бойынша тарих сияқты нәрсе: 1915 - бірдеңе болды, 1916 - басқа нәрсе.
  • DEBUG - белгілі бір сәттегі оқиғаларды толығырақ сипаттайды. Мысалы, тарихтағы шайқастың егжей-тегжейлері жөндеу деңгейінде." Командир Такойтұлы өз әскерімен Селовича ауылына қарай ілгерілей бастады ."
  • ҚАТЕ – орын алатын қателер әдетте осында жазылады. try-catchСіз бір нәрсені ораған кезде блоктың catchорнына келетінін байқаған боларсыз e.printStacktrace(). Ол тек жазбаны консольге шығарады. Тіркелгіні пайдаланып, сіз бұл жазбаны тіркеушіге жібере аласыз (хаха), сіз идеяны аласыз.
  • ЕСКЕРТУ - мұнда ескертулер жазылған. Мысалы, көлікте қызып кету шамы. Бұл жай ғана ескерту, және бір нәрсені өзгерткен дұрыс, бірақ бұл бұзылу емес. Құрылғы бұзылған кезде, біз ҚАТЕ деңгейімен тіркелеміз.
Біз деңгейлерді реттедік. Бірақ алаңдамаңыз: олардың арасындағы сызық өте жұқа - мұны бәрі түсіндіре алмайды. Оған қоса, ол жобадан жобаға қарай әр түрлі болуы мүмкін. Аға әзірлеуші ​​сізге қай деңгейде және нені тіркеу керектігін түсіндіреді. Ең бастысы, бұл жазбалар сізге болашақ талдау үшін жеткілікті. Және бұл жай ғана түсініледі. Келесі параметрлер. Тіркеушілерге қай жерде жазу керектігін (консольге, файлға, 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 деңгейі. Файл үшін ат үлгісі де көрсетілген. Бұл консольге де, файлға да жазуға мүмкіндік беретін ең аз конфигурация. файлдағы ескі жазбалар өшірілмеуі үшін шынjava.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кемшіліктері бар. Мысалы, мен жоғарыда сипаттаған деңгейлер бұл жерде жоқ, бірақ олар көп қолданылатын тіркеушілерде. Мен оны осы мақала үшін таңдадым java.util.logging, себебі ол қосылыммен қосымша манипуляцияларды қажет етпейді. LOGGER.infoСондай-ақ, оның орнына қолдануға болатынын атап өтейін, LOGGER.log(Level.INFO... мұнда қазірдің өзінде пайда болған кемшіліктердің бірі: LOGGER.log(Level.WARNING,"что-то пошло не так" , e);- бұл хабарлама мен нысанды беруге мүмкіндік береді Exception, тіркеуші өзі оны әдемі етіп жазады. Сонымен бірге LOGGER.warning("");ол тек хабарлама алады, яғни. Ерекшеліктен өту мүмкін емес, оны өзіңіз жолға аударуыңыз керек. Бұл мысал Java журналымен танысу үшін жеткілікті деп үміттенемін. Содан кейін басқа тіркеушілерді қосуға болады (log4j, slf4j, Logback...) - олардың көпшілігі бар, бірақ мәні бірдей ^ әрекеттер тарихын жазу үшін. Ресми оқу құралы
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION