JavaRush /Blog Java /Random-MS /Pembalakan Java. Lepaskan bebola stektras

Pembalakan Java. Lepaskan bebola stektras

Diterbitkan dalam kumpulan
"Selamat tengah hari, hari ini satu kejadian dirakam di tapak perindustrian, saya minta pemaju menyertai kumpulan analisis." Satu daripada hari anda di tempat kerja boleh memulakan sesuatu seperti ini, atau boleh jadi pada waktu pagi - tidak mengapa. Tetapi mari kita mulakan dari awal. Dengan menyelesaikan masalah di JavaRush di sini, anda belajar menulis kod yang berfungsi dan melakukan apa yang diharapkan daripadanya. Jika anda melihat bahagian bantuan , adalah jelas bahawa ini tidak selalu berjaya pada kali pertama. Ia akan sama di tempat kerja. Anda tidak akan selalu menyelesaikan masalah pada kali pertama: pepijat adalah teman abadi kami. Adalah penting anda boleh memulihkan peristiwa pepijat. Pembalakan.  Lepaskan bebola stektras - 1Mari kita mulakan dengan contoh. Cuba bayangkan anda seorang polis. Anda telah dipanggil ke tempat kejadian (kaca pecah di kedai), anda tiba, dan mereka sedang menunggu jawapan daripada anda tentang apa yang berlaku. Di mana untuk bermula? Saya tidak tahu bagaimana polis bekerja. Sangat bersyarat - mereka mula mencari saksi, bukti dan semua perkara itu. Bagaimana jika tempat itu sendiri boleh memberitahu anda secara terperinci apa yang berlaku? Sebagai contoh, seperti ini:
  • 21:59 pemilik menghidupkan penggera (5 minit sehingga diaktifkan sepenuhnya)
  • 22:00 pemilik menutup pintu
  • 22:05 pengaktifan penggera penuh
  • 22:06 pemilik menarik pemegang
  • Penderia hingar 23:15 dihidupkan
  • 23:15 sekumpulan anjing berlari melewati, menyalak dengan kuat
  • Penderia hingar 23:15 dimatikan
  • 01:17 penderia hentakan pada kaca luar kotak paparan dihidupkan
  • 01:17 seekor burung merpati terbang ke dalam kaca
  • 01:17 kaca pecah
  • 01:17 siren dihidupkan
  • 01:17 burung merpati itu bergoyang dan terbang
Nah, anda tidak perlu menyelidiki butiran sedemikian lama; ia serta-merta jelas apa yang berlaku. Begitu juga dalam pembangunan. Ia sangat keren apabila anda dapat mengetahui daripada rakaman apa yang berlaku. Kini anda mungkin mengingati nyahpepijat, kerana anda boleh menyahpepijat segala-galanya. Tetapi tidak. Anda pulang ke rumah, dan pada waktu malam semuanya rosak, tiada apa-apa untuk nyahpepijat: anda perlu memahami mengapa ia rosak dan membetulkannya. Di sinilah log masuk bermain, sejarah segala-galanya yang berlaku semalaman. Semasa artikel itu, saya cadangkan anda memikirkan apakah salah satu pembalak yang paling terkenal (bukan pembalak, lebih seperti pemantauan), yang mungkin pernah didengar oleh semua orang yang mendengar (menonton) berita itu? Terima kasih kepadanya, beberapa peristiwa dipulihkan. Sekarang mari kita serius. Log masuk Java ialah proses merekod sebarang peristiwa yang berlaku dalam kod. Adalah menjadi tanggungjawab anda sebagai pengaturcara untuk menulis apa yang dilakukan oleh kod anda, kerana log ini akan diberikan kepada anda untuk dianalisis. Jika semuanya dilakukan dengan baik, maka sebarang pepijat akan diselesaikan dan diperbaiki dengan cepat. Di sini, saya mungkin tidak akan menyelidiki jenis pembalak yang ada. Dalam artikel ini kita akan menghadkan diri kita kepada yang mudah java.util.Logger: ia lebih daripada cukup untuk mengenali satu sama lain. Setiap entri log mengandungi tarikh-masa, peringkat acara, mesej. Tarikh dan masa dimasukkan secara automatik. Tahap acara dipilih oleh pengarang mesej. Terdapat beberapa peringkat. Yang utama ialah maklumat, nyahpepijat, ralat.
  • INFO - biasanya ini adalah mesej maklumat tentang apa yang sedang berlaku, sesuatu seperti sejarah mengikut tarikh: 1915 - sesuatu berlaku, 1916 - sesuatu yang lain.
  • DEBUG - menerangkan peristiwa momen tertentu dengan lebih terperinci. Sebagai contoh, butiran pertempuran dalam sejarah berada pada tahap nyahpepijat." Komander Takoytovich mara bersama tenteranya menuju ke kampung Selovicha ."
  • ERROR - ralat yang berlaku biasanya ditulis di sini. Anda mungkin perasan bahawa apabila anda membungkus sesuatu dalam try-catch, blok itu catchdigantikan dengan e.printStacktrace(). Ia hanya mengeluarkan entri ke konsol. Menggunakan pembalak, anda boleh menghantar entri ini kepada pembalak (haha), anda mendapat idea.
  • AMARAN - amaran ditulis di sini. Contohnya, lampu terlalu panas di dalam kereta. Ini hanyalah amaran, dan lebih baik mengubah sesuatu, tetapi ini bukan pecahan. Apabila mesin rosak, maka kita akan log dengan tahap ERROR.
Kami telah menyusun tahap. Tetapi jangan risau: garis di antara mereka sangat tipis - tidak semua orang dapat menjelaskannya. Selain itu, ia mungkin berbeza dari projek ke projek. Pembangun kanan akan menerangkan kepada anda pada tahap dan perkara yang perlu dilog. Perkara utama ialah rekod ini cukup untuk anda untuk analisis masa hadapan. Dan ini difahami dengan cepat. Seterusnya ialah tetapan. Pembalak boleh diberitahu di mana untuk menulis (ke konsol, fail, jms atau tempat lain), dan menentukan tahap (maklumat, ralat, nyahpepijat...). Contoh tetapan untuk pembalak mudah kami kelihatan seperti ini:
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
Dalam kes ini, semuanya dikonfigurasikan supaya logger menulis ke fail dan ke konsol pada masa yang sama. Kalau macam itu? jika sesuatu dipadamkan dalam konsol, dan lebih mudah untuk mencari mengikut fail. Tahap INFO untuk kedua-duanya. Corak nama juga ditentukan untuk fail. Ini ialah konfigurasi minimum yang membolehkan anda menulis pada konsol dan fail sekaligus. java.util.logging.FileHandler.appendditetapkan kepada benar supaya entri lama dalam fail tidak dipadamkan. Contoh penggunaan adalah ini (tanpa ulasan, pembalak mengulas tentang dirinya sendiri):
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);
        }
    }
}
Ini bukan contoh terbaik, saya ambil yang ada di tangan. Contoh output:
апр 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)
Di sini saya ingin memberi tumpuan kepada nota:
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Размер equals 3
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Получим первый элемент
Entry ini agak sia-sia dan tidak bermaklumat. Seperti entri ralat:
WARNING: что-то пошло не так
Anda tidak sepatutnya menulis ini: ia adalah log demi log, ia hanya akan menghalangnya. Cuba untuk sentiasa menulis perkara yang bermakna. Saya rasa ini sudah cukup untuk berhenti menggunakannya System.out.printlndan beralih kepada mainan dewasa. Ia java.util.loggingmempunyai kelemahan. Sebagai contoh, tahap yang saya terangkan di atas tidak ada di sini, tetapi ia berada dalam kebanyakan pembalak terpakai. Saya memilihnya untuk artikel ini java.util.loggingkerana ia tidak memerlukan manipulasi tambahan dengan sambungan. Saya juga akan ambil perhatian bahawa ia boleh digunakan LOGGER.infodan bukannya LOGGER.log(Level.INFO... Salah satu kelemahan yang telah muncul di sini: LOGGER.log(Level.WARNING,"что-то пошло не так" , e);- ia membolehkan anda menghantar mesej dan objek Exception, pembalak itu sendiri akan menuliskannya dengan cantik. Pada masa yang sama, LOGGER.warning("");ia hanya menerima mesej, i.e. Pengecualian tidak boleh diluluskan, anda perlu menterjemahkannya ke dalam rentetan sendiri. Saya harap contoh ini cukup untuk membiasakan diri dengan pembalakan Java. Kemudian anda boleh menyambungkan pembalak lain (log4j, slf4j, Logback...) - terdapat banyak daripada mereka, tetapi intipatinya adalah sama^ untuk merekodkan sejarah tindakan. Tutorial rasmi
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION