CodeGym /Blog Java /rawak /Pembalakan Java
John Squirrels
Tahap
San Francisco

Pembalakan Java

Diterbitkan dalam kumpulan
Hai! Semasa menulis pelajaran, saya amat menekankan jika terdapat topik tertentu yang akan menjadi sangat penting dalam kerja sebenar. Jadi, DENGAR! Topik yang akan kami bincangkan hari ini pasti akan berguna dalam semua projek anda dari hari pertama bekerja. Kami akan bercakap tentang Java Logging. Topik ini tidak rumit sama sekali (saya akan katakan mudah). Tetapi anda akan mempunyai perkara yang cukup jelas untuk ditekankan pada kerja pertama anda, jadi lebih baik untuk memahaminya dengan teliti sekarang :) Baiklah, mari mulakan.

Apakah pembalakan di Jawa?

Pembalakan ialah tindakan merekod data tentang pengendalian sesuatu program. Tempat kami merekod data ini dipanggil "log". Dua soalan segera timbul: data apa yang ditulis dan di mana? Mari kita mulakan dengan "di mana". Anda boleh menulis data tentang kerja program di banyak tempat yang berbeza. Sebagai contoh, semasa pengajian anda, anda sering System.out.println()untuk mengeluarkan data ke konsol. Ini sememangnya pembalakan, walaupun dalam bentuk yang paling mudah. Sudah tentu, ini tidak begitu mudah untuk pengguna atau pasukan sokongan produk: jelas sekali, mereka tidak mahu memasang IDE dan memantau konsol :) Terdapat format yang lebih biasa untuk merakam maklumat: fail teks. Manusia lebih selesa membaca data dalam format ini, dan pastinya ia lebih mudah untuk menyimpan data! Sekarang soalan kedua: apakah data program yang perlu dilog? Itu terpulang kepada anda! Sistem pengelogan Java sangat fleksibel. Anda boleh mengkonfigurasinya untuk log semua yang program anda lakukan. Di satu pihak, ini bagus. Tetapi sebaliknya, bayangkan betapa besarnya log Facebook atau Twitter jika mereka menulis segala-galanya di dalamnya. Syarikat-syarikat besar ini mungkin mempunyai keupayaan untuk menyimpan data sebanyak itu. Tetapi bayangkan betapa sukarnya untuk mencari maklumat tentang satu ralat kritikal dalam 500 gigabait log teks? Itu akan lebih teruk daripada mencari jarum dalam timbunan jerami. Sehubungan itu, Java boleh dikonfigurasikan untuk log data ralat sahaja. Ataupun hanya kesilapan kritikal! Walau bagaimanapun, ia tidak sepenuhnya tepat untuk bercakap tentang sistem pembalakan asli Java. Hakikatnya ialah pengaturcara memerlukan pengelogan sebelum fungsi ini ditambahkan pada bahasa. Pada masa Java memperkenalkan perpustakaan pengelogannya sendiri, semua orang sudah menggunakan perpustakaan log4j. Sejarah pembalakan di Jawa sebenarnya sangat panjang dan bermaklumat. Pendek kata, Java mempunyai perpustakaan pengelogannya sendiri, tetapi hampir tiada siapa yang menggunakannya :) Kemudian, apabila beberapa perpustakaan pembalakan yang berbeza muncul dan mula digunakan oleh pengaturcara, masalah keserasian timbul. Untuk menghalang orang daripada mencipta semula roda dalam sedozen perpustakaan yang berbeza dengan antara muka yang berbeza, rangka kerja SLF4J abstrak ("Service Logging Facade For Java") telah dicipta. Ia dipanggil abstrak, kerana walaupun anda menggunakan dan memanggil kaedah kelas SLF4J, di bawah hud mereka sebenarnya menggunakan semua rangka kerja pengelogan yang datang sebelum ini: log4j, java.util.logging standard dan lain-lain. Jika pada satu ketika anda memerlukan beberapa ciri khusus Log4j yang tiada di perpustakaan lain, tetapi anda tidak mahu memautkan projek anda secara langsung ke perpustakaan ini, hanya gunakan SLF4J. Dan kemudian biarkan ia memanggil kaedah Log4j. Jika anda berubah fikiran dan memutuskan bahawa anda tidak lagi memerlukan ciri Log4j, anda hanya perlu mengkonfigurasi semula "di sini , dan perpustakaan Log4j di sini . Seterusnya, buka pek arkib dan gunakan IntelliJ IDEA untuk menambah fail JAR ke classpath. Item menu: Fail -> Struktur Projek -> Perpustakaan Pilih fail JAR yang diperlukan dan tambahkannya pada projek (arkib yang kami muat turun mengandungi banyak fail JAR — lihat gambar untuk melihat yang anda perlukan) Ambil perhatian bahawa arahan ini untuk pelajar Mengapa kita memerlukan pembalakan - 2Mengapa kita memerlukan pembalakan - 3tersebut yang tidak tahu menggunakan Maven. Jika anda tahu cara menggunakan Maven, biasanya lebih baik (lebih mudah) untuk mencuba bermula di sana. Jika anda menggunakan Maven , tambahkan kebergantungan ini:

    	<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
    	</dependency>
Hebat! Kami mengetahui tetapan :) Mari lihat bagaimana SLF4J berfungsi. Bagaimanakah kita memastikan bahawa kerja program direkodkan di suatu tempat? Untuk melakukan ini, kita memerlukan dua perkara: logger dan appender. Mari kita mulakan dengan yang pertama. Pembalak ialah objek yang menyediakan kawalan penuh terhadap pembalakan. Mencipta pembalak adalah sangat mudah: kami melakukan ini menggunakan kaedah LoggerFactory.getLogger() statik . Parameter kaedah ialah kelas yang operasinya akan dilog. 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 entry!!!");
       LOGGER.error("An error occurred!");
   }
}
Output konsol:

ERROR StatusLogger No Log4j 2 configuration file found. Using default configuration (logging only errors to the console), or user programmatically provided configurations. Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging. See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2 15:49:08.907 [main] ERROR MyTestClass - An error occurred!
Apa yang kita lihat di sini? Pertama, kita melihat mesej ralat. Ini adalah hasil daripada fakta bahawa sekarang kami kekurangan tetapan yang diperlukan. Sehubungan itu, pembalak kami pada masa ini hanya dapat mengeluarkan mesej ralat (ERROR) dan hanya kepada konsol. Kaedah logger.info() tidak berfungsi. Tetapi logger.error() berjaya! Pada konsol, kita melihat 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", maka ralat telah berlaku pada ketika ini dalam atur cara. Jika entri ditandakan dengan perkataan "INFO", maka mesej itu hanya mewakili maklumat semasa tentang operasi biasa program. Pustaka SLF4J mempunyai banyak tahap pengelogan berbeza yang membolehkan anda mengkonfigurasi pengelogan secara fleksibel. Semuanya sangat mudah untuk diurus: semua logik yang diperlukan sudah ada dalam kelas Java Logger . Anda hanya perlu memanggil kaedah yang berkaitan. Jika anda ingin log mesej rutin, hubungi kaedah logger.info() . Untuk mesej ralat, gunakan logger.error() . Untuk amaran, gunakan logger.warn()

Sekarang mari kita bercakap tentang appender

Apender ialah tempat data anda pergi. Dari satu segi, bertentangan dengan sumber data, iaitu "titik B". Secara lalai, data dikeluarkan ke konsol. Ambil perhatian bahawa dalam contoh sebelumnya kita tidak perlu mengkonfigurasi apa-apa: teks muncul dalam konsol, dan logger perpustakaan Log4j hanya boleh mengeluarkan mesej peringkat RALAT ke konsol. Jelas sekali, lebih mudah untuk orang membaca dan menulis log dalam fail teks. Untuk menukar tingkah laku lalai pembalak, kami perlu mengkonfigurasi penambah fail kami. Untuk bermula, anda perlu mencipta fail log4j.xml terus dalam folder src. Anda sudah biasa dengan format XML: baru-baru ini kami mendapat pengajaran tentangnya :) Berikut ialah kandungan fail:

<?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>
Tiada apa-apa yang istimewa atau sukar di sini :) Tetapi tetap, mari kita lihat kandungannya.
<Configuration status="INFO">
Ini adalah apa yang dipanggil StatusLogger. Ia tidak berkaitan dengan pembalak kami dan digunakan dalam proses dalaman Log4j. Jika anda menetapkan status="TRACE" dan bukannya status="INFO", dan semua maklumat tentang kerja dalaman Log4j akan dipaparkan pada konsol (StatusLogger memaparkan data pada konsol, walaupun pelengkap kami ialah fail). Kita tidak memerlukannya sekarang, jadi mari kita biarkan ia seperti sedia ada.

<Appenders>
   <File name="MyFileAppender" fileName="C:\Users\Evgeny\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 <Fail> menunjukkan bahawa ia akan menjadi pelengkap fail. name="MyFileAppender" menetapkan nama appender. fileName="C:\Users\Username\Desktop\testlog.txt" menunjukkan laluan ke fail log di mana semua data akan ditulis. append="true" menunjukkan sama ada data harus ditulis pada penghujung fail. Dalam kes kami, inilah yang akan kami lakukan. Jika anda menetapkan nilai kepada palsu, maka kandungan lama fail log akan dipadam setiap kali program dimulakan. <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>menunjukkan tetapan pemformatan. Di sini kita boleh menggunakan ungkapan biasa untuk menyesuaikan cara teks diformat dalam log kami.

<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
Di sini kami menunjukkan tahap akar. Kami telah menetapkan tahap "INFO", yang bermaksud bahawa semua mesej yang tahapnya lebih tinggi daripada INFO (mengikut jadual yang kami lihat di atas) tidak akan dilog. Program kami akan mempunyai 3 mesej: satu INFO, satu WARN dan satu ERROR. Dengan konfigurasi semasa, kesemua 3 mesej akan dilog. Jika anda menukar tahap akar kepada ERROR, hanya mesej terakhir daripada panggilan kaedah LOGGER.error() akan berakhir dalam log. Di samping itu, rujukan kepada lampiran juga terdapat di sini. Untuk membuat rujukan sedemikian, anda perlu mencipta teg <ApprenderRef> di dalam teg <Root> dan menambah atribut ref='nama penambah anda' kepadanya. Sekiranya anda terlupa, di sinilah kami menetapkan nama penampil: <. Dan inilah 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("The program is starting!!!");

       try {
           LOGGER.warn("Attention! The program is trying to divide a number by another.
           System.out.println(12/0);
       } catch (ArithmeticException x) {

           LOGGER.error("Error! Division by zero!");
       }
   }
}
Sudah tentu, ia agak mengecewakan (menangkap RuntimeException adalah idea yang boleh dipersoalkan), tetapi ia sesuai untuk tujuan kami :) Mari jalankan kaedah main() kami 4 kali berturut-turut dan lihat fail testlog.txt kami. Anda tidak perlu menciptanya terlebih dahulu: perpustakaan akan melakukan ini secara automatik. Semuanya berjaya! :) Kini anda mempunyai logger yang dikonfigurasikan. Anda boleh bermain-main dengan beberapa program lama anda, menambahkan panggilan logger pada setiap kaedah. Kemudian lihat log yang terhasil :) Ia mempertimbangkan topik pembalakan secara mendalam. Ia akan mencabar untuk membaca semuanya dalam satu sesi. Yang berkata, ia mengandungi banyak maklumat berguna tambahan. Sebagai contoh, anda akan belajar cara mengkonfigurasi logger supaya ia mencipta fail teks baharu jika fail testlog.txt kami mencapai saiz tertentu :) Dan itu menyimpulkan kelas kami! Hari ini anda menjadi biasa dengan topik yang sangat penting, dan pengetahuan ini pasti akan membantu anda dalam kerja masa depan anda. Sehingga kali seterusnya! :)
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION