JavaRush /Java Blog /Random-ID /Pencatatan Jawa. Lepaskan gulungan bola stectrace

Pencatatan Jawa. Lepaskan gulungan bola stectrace

Dipublikasikan di grup Random-ID
“Selamat siang, hari ini terekam kejadian di lokasi industri, saya minta pengembang untuk bergabung dalam kelompok analisis.” Suatu hari Anda di tempat kerja bisa dimulai seperti ini, atau bisa juga di pagi hari – tidak masalah. Tapi mari kita mulai dari awal. Dengan memecahkan masalah di JavaRush, Anda belajar menulis kode yang berfungsi dan melakukan apa yang diharapkan. Jika Anda melihat bagian bantuan , jelas bahwa ini tidak selalu berhasil pada kali pertama. Hal yang sama akan terjadi di tempat kerja. Anda tidak akan selalu menyelesaikan masalah pada kali pertama: serangga adalah teman abadi kita. Penting bagi Anda untuk dapat memulihkan kejadian bug tersebut. Pencatatan.  Lepaskan gulungan bola stectrace - 1Mari kita mulai dengan sebuah contoh. Bayangkan Anda adalah seorang polisi. Anda dipanggil ke lokasi kejadian (kaca pecah di sebuah toko), Anda tiba, dan mereka menunggu jawaban dari Anda tentang apa yang terjadi. Di mana memulainya? Saya tidak tahu cara kerja polisi. Dengan sangat kondisional - mereka mulai mencari saksi, bukti, dan sebagainya. Bagaimana jika tempat itu sendiri dapat memberi tahu Anda secara detail apa yang terjadi? Misalnya seperti ini:
  • 21:59 pemilik menyalakan alarm (5 menit hingga aktif sepenuhnya)
  • Pukul 22.00 pemilik menutup pintu
  • 22:05 aktivasi alarm penuh
  • 22:06 pemilik menarik pegangannya
  • 23:15 sensor kebisingan dihidupkan
  • 23:15 sekawanan anjing berlari lewat sambil menggonggong dengan keras
  • 23:15 sensor kebisingan dimatikan
  • 01:17 sensor guncangan di kaca luar etalase menyala
  • 01:17 seekor merpati terbang ke dalam kaca
  • 01:17 kaca pecah
  • 01:17 sirene menyala
  • 01:17 merpati itu terguncang dan terbang menjauh
Ya, Anda tidak perlu mendalami detail seperti itu terlalu lama; sudah jelas apa yang terjadi. Hal yang sama juga terjadi dalam pengembangan. Sangat keren ketika Anda bisa mengetahui dari rekaman apa yang terjadi. Sekarang Anda mungkin ingat melakukan debug, karena Anda dapat men-debug semuanya. Tapi tidak. Anda pulang ke rumah, dan pada malam hari semuanya rusak, tidak ada yang perlu di-debug: Anda perlu memahami mengapa itu rusak dan memperbaikinya. Di sinilah log berperan, sejarah segala sesuatu yang terjadi dalam semalam. Sepanjang artikel ini, saya sarankan Anda memikirkan tentang salah satu logger paling terkenal (sebenarnya bukan logger, lebih seperti pemantauan), yang mungkin pernah didengar oleh setiap orang yang mendengarkan (menonton) berita? Berkat dia, beberapa acara dipulihkan. Sekarang mari kita serius. Logging di Java adalah proses pencatatan setiap kejadian yang terjadi di dalam kode. Merupakan tanggung jawab Anda sebagai pemrogram untuk menuliskan apa yang dilakukan kode Anda, karena log ini akan diberikan kepada Anda untuk dianalisis. Jika semuanya dilakukan dengan baik, maka bug apa pun akan diselesaikan dan diperbaiki dengan sangat cepat. Di sini, saya mungkin tidak akan mempelajari jenis logger apa saja yang ada. Pada artikel ini kami akan membatasi diri pada hal sederhana java.util.Logger: itu lebih dari cukup untuk saling mengenal. Setiap entri log berisi tanggal-waktu, tingkat peristiwa, pesan. Tanggal dan waktu dimasukkan secara otomatis. Tingkat peristiwa dipilih oleh penulis pesan. Ada beberapa tingkatan. Yang utama adalah info, debug, kesalahan.
  • INFO - biasanya ini adalah pesan informasi tentang apa yang terjadi, seperti sejarah berdasarkan tanggal: 1915 - sesuatu terjadi, 1916 - sesuatu yang lain.
  • DEBUG - menjelaskan peristiwa pada momen tertentu secara lebih rinci. Misalnya, detail pertempuran dalam sejarah berada pada tingkat debug. " Komandan Takoytovich maju dengan pasukannya menuju desa Selovicha ."
  • ERROR – error yang terjadi biasanya ditulis disini. Anda mungkin memperhatikan bahwa ketika Anda membungkus sesuatu try-catch, bloknya catchdiganti dengan e.printStacktrace(). Itu hanya menampilkan entri ke konsol. Dengan menggunakan logger, Anda dapat mengirimkan entri ini ke logger (haha), Anda mengerti.
  • PERINGATAN - peringatan tertulis di sini. Misalnya saja lampu mobil yang terlalu panas. Ini hanya peringatan, dan lebih baik mengubah sesuatu, tapi ini bukan kerusakan. Ketika mesin rusak, maka kita akan login dengan level ERROR.
Kami telah memilah levelnya. Tapi jangan khawatir: garis di antara keduanya sangat tipis - tidak semua orang bisa menjelaskannya. Selain itu, ini mungkin berbeda dari satu proyek ke proyek lainnya. Pengembang senior akan menjelaskan kepada Anda pada level apa dan apa yang harus dicatat. Hal utama adalah catatan ini cukup bagi Anda untuk analisis di masa mendatang. Dan ini dapat dipahami dengan cepat. Berikutnya adalah pengaturannya. Logger dapat diberi tahu di mana harus menulis (ke konsol, file, jms, atau di tempat lain), dan menentukan levelnya (info, kesalahan, debug...). Contoh pengaturan logger sederhana kita terlihat 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 hal ini, semuanya dikonfigurasi sehingga logger menulis ke file dan ke konsol pada saat yang bersamaan. Dalam hal itu? jika ada sesuatu yang terhapus di konsol, ditambah lagi lebih mudah untuk mencari berdasarkan file. Tingkat INFO untuk keduanya. Pola nama juga ditentukan untuk file tersebut. Ini adalah konfigurasi minimal yang memungkinkan Anda menulis ke konsol dan file sekaligus. java.util.logging.FileHandler.appenddisetel ke true sehingga entri lama dalam file tidak terhapus. Contoh penggunaannya adalah ini (tanpa komentar, logger akan berkomentar 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 mengambil contoh yang ada. Contoh keluaran:
апр 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 fokus pada catatan:
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Размер equals 3
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Получим первый элемент
Entri ini sangat tidak berguna dan tidak informatif. Seperti entri kesalahan:
WARNING: что-то пошло не так
Anda tidak boleh menulis ini: ini adalah log demi log, itu hanya akan menghalangi. Usahakan untuk selalu menulis hal-hal yang bermakna. Saya rasa ini cukup untuk berhenti menggunakannya System.out.printlndan beralih ke mainan dewasa. Ini java.util.loggingmemiliki kelemahan. Misalnya, level yang saya jelaskan di atas tidak ada di sini, tetapi ada di sebagian besar logger yang digunakan. Saya memilihnya untuk artikel ini java.util.loggingkarena tidak memerlukan manipulasi koneksi tambahan. Saya juga akan mencatat bahwa ini dapat digunakan LOGGER.infosebagai pengganti LOGGER.log(Level.INFO... Salah satu kelemahan sudah muncul di sini: LOGGER.log(Level.WARNING,"что-то пошло не так" , e);- ini memungkinkan Anda untuk mengirimkan pesan dan objek Exception, logger itu sendiri akan menuliskannya dengan indah. Pada saat yang sama, LOGGER.warning("");ia hanya menerima pesan, mis. Pengecualian tidak dapat dilewati, Anda harus menerjemahkannya sendiri ke dalam string. Saya harap contoh ini cukup untuk mengenal Java logging. Kemudian Anda dapat menghubungkan logger lain (log4j, slf4j, Logback...) - ada banyak, tetapi intinya sama^ untuk mencatat riwayat tindakan. Tutorial resmi
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION