JavaRush /Blog Java /Random-MS /Mengapa pembalakan diperlukan?

Mengapa pembalakan diperlukan?

Diterbitkan dalam kumpulan
hello! Semasa menulis kuliah, saya perhatikan jika topik tertentu pasti akan digunakan dalam kerja sebenar. Mengapa anda memerlukan pembalakan - 1 Jadi, PERHATIAN! Topik yang akan kami sentuh hari ini pasti akan berguna kepada anda pada semua projek anda dari hari pertama bekerja. Kita akan bercakap tentang pembalakan. Topik ini tidak sukar sama sekali (saya akan katakan mudah). Tetapi pada kerja pertama anda sudah ada tekanan yang mencukupi untuk masih menangani perkara yang jelas, jadi lebih baik anda menyelesaikannya dengan teliti sekarang :) Jadi, mari mulakan. Apakah pembalakan? Pengelogan ialah merekodkan data di suatu tempat tentang pengendalian program. Tempat di mana data ini ditulis dipanggil " log ". Dua soalan timbul serentak: di mana dan apakah data yang direkodkan? Mari kita mulakan dengan "di mana". Anda boleh merekod data operasi program di banyak tempat yang berbeza. Contohnya, semasa pengajian anda sering mengeluarkan data ke konsol menggunakan System.out.println(). Ini adalah pembalakan sebenar, walaupun yang paling mudah. Sudah tentu, ini tidak begitu mudah untuk pelanggan atau pasukan sokongan produk: mereka jelas tidak mahu memasang IDE dan memantau konsol :) Terdapat juga format yang lebih biasa untuk merekodkan maklumat - dalam fail teks. Lebih mudah untuk orang membacanya dengan cara ini, dan pastinya lebih mudah untuk disimpan! Sekarang soalan kedua: apakah data tentang operasi program yang perlu direkodkan dalam log? Tetapi di sini semuanya bergantung pada anda! Sistem pengelogan Java sangat fleksibel. Anda boleh mengkonfigurasinya sedemikian rupa sehingga keseluruhan kemajuan program anda akan direkodkan. Di satu pihak, ini bagus. Tetapi sebaliknya, bayangkan berapa saiz log Facebook atau Twitter yang boleh dicapai jika semuanya ditulis di sana. Syarikat besar sedemikian mungkin mempunyai keupayaan untuk menyimpan walaupun jumlah maklumat ini. Tetapi bayangkan betapa sukarnya untuk mencari maklumat tentang satu ralat kritikal dalam log teks 500 gigabait? Ia lebih teruk daripada jarum dalam timbunan jerami. Oleh itu, log masuk Java boleh dikonfigurasikan supaya hanya data ralat ditulis pada log (log). Ataupun hanya tentang kesilapan kritikal! Walaupun, mengatakan "log masuk Java" tidak sepenuhnya betul. Hakikatnya ialah keperluan untuk pengelogan timbul di kalangan pengaturcara sebelum fungsi ini ditambahkan pada bahasa tersebut. Dan pada masa Java mempunyai perpustakaan pengelogan sendiri, semua orang sudah menggunakan perpustakaan log4j. Sejarah kemunculan pembalakan di Jawa sebenarnya sangat panjang dan bermaklumat; pada masa lapang anda, anda boleh membaca siaran ini di Habré . Ringkasnya, Java mempunyai perpustakaan pembalakan sendiri, tetapi hampir tiada siapa yang menggunakannya :) Kemudian, apabila beberapa perpustakaan pembalakan yang berbeza muncul, dan semua pengaturcara mula menggunakan yang berbeza, masalah keserasian timbul. Untuk menghalang orang daripada melakukan perkara yang sama menggunakan sedozen perpustakaan yang berbeza dengan antara muka yang berbeza, rangka kerja abstraksi slf4j telah dicipta(“Fasad Pengelogan Perkhidmatan Untuk Java”). Ia dipanggil abstrak kerana walaupun anda menggunakan kelas slf4j dan memanggil kaedah mereka, di bawah tudung mereka mempunyai semua rangka kerja pengelogan sebelumnya berjalan: log4j, standard java.util.logging dan lain-lain. Jika pada masa ini anda memerlukan beberapa ciri khusus log4j yang tidak dimiliki oleh perpustakaan lain, tetapi anda tidak mahu memautkan projek dengan ketat ke perpustakaan ini, hanya gunakan slf4j. Dan dia sudah akan "menarik" kaedah log4j. Jika anda berubah fikiran dan memutuskan bahawa anda tidak lagi memerlukan ciri log4j, anda hanya perlu mengkonfigurasi semula "pembungkus" (iaitu, slf4j) untuk menggunakan perpustakaan lain. Kod anda tidak akan berhenti berfungsi, kerana di dalamnya anda memanggil kaedah slf4j, dan bukan pustaka tertentu. Penyimpangan kecil. Untuk contoh berikut berfungsi, anda perlu memuat turun perpustakaan slf4j dari sini dan perpustakaan log4j dari sini . Seterusnya, kita perlu membongkar arkib dan menambah fail jar yang kita perlukan ke classpath melalui Intellij IDEA. Item menu: Fail -> Struktur Projek -> Perpustakaan Pilih balang yang diperlukan dan tambahkannya pada projek (terdapat banyak balang dalam arkib yang kami muat turun, lihat yang anda perlukan dalam gambar) Mengapa anda memerlukan pembalakan - 2Mengapa anda memerlukan pembalakan - 3Nota - arahan ini adalah untuk mereka pelajar yang tidak tahu menggunakan Maven. Jika anda tahu cara menggunakannya, lebih baik cuba bermula dengannya: ia biasanya lebih mudah. ​​Jika anda menggunakan Maven , tambahkan pergantungan ini:
<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
</dependency>
Bagus, kami telah menyusun tetapan :) Mari lihat cara slf4j berfungsi. Bagaimanakah kita boleh memastikan bahawa kemajuan program direkodkan di suatu tempat? Untuk ini kita memerlukan dua perkara - pembalak dan pelengkap . Mari kita mulakan dengan yang pertama. Pembalak ialah objek yang menguruskan penyimpanan rekod sepenuhnya . Mencipta pembalak adalah sangat mudah: ia dilakukan menggunakan kaedah statik - LoggerFactory.getLogger(). Sebagai parameter kepada kaedah, anda perlu lulus kelas yang kerjanya akan direkodkan. Mari jalankan kod kami:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Test log record!!!");
       LOGGER.error("В программе возникла ошибка!");
   }
}
Output konsol: ERROR StatusLogger Tiada fail konfigurasi Log4j 2 ditemui. Menggunakan konfigurasi lalai (hanya mengelog ralat ke konsol) atau konfigurasi yang disediakan oleh pengguna. Tetapkan sifat sistem 'log4j2.debug' untuk menunjukkan pengelogan permulaan dalaman Log4j 2. Lihat https://logging.apache.org/log4j/2.x/manual/configuration.html untuk arahan tentang cara mengkonfigurasi Log4j 2 15:49:08.907 [utama] ERROR MyTestClass - Ralat telah berlaku dalam program! Apa yang kita lihat di sini? Mula-mula kita melihat mesej ralat. Ia muncul kerana pada masa ini kami kekurangan tetapan yang diperlukan. Oleh itu, pembalak kami kini hanya boleh mengeluarkan mesej ralat (ERROR) dan hanya kepada konsol. Kaedah itu logger.info()tidak dilaksanakan. Tetapi logger.error()ia berjaya! Konsol memaparkan tarikh semasa, kaedah di mana ralat berlaku ( main), perkataan ERROR dan mesej kami! ERROR ialah tahap pengelogan. Secara umum, jika entri log ditandakan dengan perkataan ERROR, ini bermakna ralat berlaku pada ketika itu dalam atur cara. Jika entri ditandakan dengan perkataan INFO, ini bermakna ia hanyalah maklumat semasa tentang operasi biasa program. Pustaka SLF4J mempunyai beberapa tahap pengelogan berbeza yang membolehkan anda mengkonfigurasi pengelogan secara fleksibel. Mereka sangat mudah untuk diurus: semua logik yang diperlukan sudah disertakan dalam kelas Logger. Anda hanya perlu memanggil kaedah yang diperlukan. Jika anda ingin menghantar mesej biasa, hubungi logger.info(). Mesej ralat - logger.error(). Paparkan amaran - logger.warn() Sekarang mari kita bincangkan tentang lampiran . Penampil ialah tempat data anda datang. Anda boleh katakan yang bertentangan dengan sumber data ialah "titik B." Secara lalai, data dikeluarkan ke konsol. Sila ambil perhatian bahawa dalam contoh sebelumnya kita tidak perlu mengkonfigurasi apa-apa: teks muncul dalam konsol itu sendiri, tetapi logger dari perpustakaan log4j hanya boleh mengeluarkan mesej peringkat ERROR ke konsol. Jelas sekali lebih mudah bagi orang ramai untuk membaca log daripada fail teks dan menyimpan log dalam fail yang sama. Untuk menukar tingkah laku lalai pembalak, kami perlu mengkonfigurasi lampiran fail kami . Sebagai permulaan, anda perlu mencipta fail log4j.xml terus dalam folder src , atau dalam folder sumber, jika anda menggunakan Maven, atau dalam folder sumber, sekiranya anda menggunakan Maven. Anda sudah biasa dengan format xml, baru-baru ini kami telah mengadakan kuliah mengenainya :) Inilah kandungannya:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
   <Appenders>
       <File name="MyFileAppender" fileName="C:\Users\Username\Desktop\testlog.txt" immediateFlush="false" append="false">
           <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
       </File>
   </Appenders>
   <Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
   </Loggers>
</Configuration>
Ia tidak kelihatan sangat rumit :) Tetapi mari kita teruskan kandungannya.
<Configuration status="INFO">
Inilah yang dipanggil status-logger. Ia tidak berkaitan dengan pembalak kami dan digunakan secara dalaman oleh log4j. Anda boleh menetapkan status=”TRACE” dan bukannya status=”INFO”, dan semua maklumat tentang kerja dalaman log4j akan dikeluarkan kepada konsol (status-logger mengeluarkan data ke konsol, walaupun pelengkap kami untuk program ini ialah fail -berasaskan). Kami tidak memerlukan ini sekarang, jadi kami akan biarkan semuanya seperti sedia ada.
<Appenders>
   <File name="MyFileAppender" fileName="C:\Users\Евгений\Desktop\testlog.txt" append="true">
       <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
   </File>
</Appenders>
Di sini kami membuat appender kami. Teg <File>menunjukkan bahawa ia akan menjadi satu fail. name="MyFileAppender"- nama lampiran kami. fileName="C:\Users\Username\Desktop\testlog.txt"— laluan ke fail log di mana semua data akan ditulis. append="true"— sama ada perlu menulis data tambahan ke penghujung fail. Dalam kes kami ini akan berlaku. Jika ditetapkan kepada false , kandungan log lama akan dipadamkan setiap kali program dimulakan semula. <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>- Ini ialah tetapan pemformatan. Di sini kita boleh menggunakan ungkapan biasa untuk menyesuaikan format teks dalam log kami.
<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
Di sini kami menentukan tahap pembalakan (tahap akar). Kami mempunyai set tahap INFO: iaitu, semua mesej pada tahap yang lebih tinggi daripada INFO (mengikut jadual yang kami lihat di atas) tidak akan disertakan dalam log. Kami akan mempunyai 3 mesej dalam program kami: satu INFO, satu AMARAN dan satu RALAT. Dengan konfigurasi semasa, kesemua 3 mesej akan ditulis pada log. Jika anda menukar tahap akar kepada ERROR, hanya mesej terakhir daripada LOGGER.error() akan dilog. Di samping itu, pautan ke lampiran diletakkan di sini. Untuk membuat pautan sedemikian, anda perlu <Root>membuat teg di dalam teg <ApprenderRef>dan menambah parameter padanya ref=”Name твоего аппендера”. Kami mencipta nama penambah di sini, sekiranya anda terlupa: <File name="MyFileAppender" Dan inilah kod program kami!
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Начало работы программы!!!");

       try {
           LOGGER.warn("Внимание! Программа пытается разделить одно число на другое");
           System.out.println(12/0);
       } catch (ArithmeticException x) {

           LOGGER.error("Ошибка! Произошло деление на ноль!");
       }
   }
}
Sudah tentu, ia sedikit bengkok (menangkap RuntimeException adalah idea biasa-biasa saja), tetapi ia sesuai untuk tujuan kami :) Mari jalankan kaedah kami main()4 kali berturut-turut dan lihat fail testlog.txt kami. Tidak perlu menciptanya terlebih dahulu: perpustakaan akan melakukannya secara automatik. Semuanya berjaya! :) Kini anda mempunyai pembalak yang dikonfigurasikan. Anda boleh bermain-main dengan beberapa program yang anda tulis sebelum ini, menambahkan panggilan logger kepada semua kaedah, dan lihat log yang terhasil :) Untuk bacaan tambahan, saya sangat mengesyorkan artikel ini . Di sana, topik pembalakan dibincangkan secara mendalam, dan ia tidak akan mudah untuk membacanya dalam satu sidang. Tetapi ia mengandungi banyak maklumat tambahan yang berguna. Sebagai contoh, anda akan belajar cara mengkonfigurasi logger supaya ia mencipta fail teks baharu jika fail testlog.txt kami mencapai saiz tertentu :) Dan ini adalah penghujung pelajaran kami! Hari ini anda belajar tentang topik yang sangat penting, dan pengetahuan ini pasti akan berguna kepada anda dalam kerja masa depan anda. Jumpa lagi! :)
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION