JavaRush /Java Blog /Random-ID /Mengapa logging diperlukan?

Mengapa logging diperlukan?

Dipublikasikan di grup Random-ID
Halo! Saat menulis perkuliahan, saya terutama memperhatikan apakah suatu topik tertentu pasti akan digunakan dalam pekerjaan nyata. Mengapa Anda perlu masuk - 1 Jadi, PERHATIAN! Topik yang akan kami bahas hari ini pasti akan berguna bagi Anda dalam semua proyek Anda sejak hari pertama bekerja. Kita akan berbicara tentang pencatatan. Topik ini sama sekali tidak sulit (bahkan menurut saya mudah). Namun pada pekerjaan pertama Anda, stres sudah cukup untuk tetap menangani hal-hal yang sudah jelas, jadi lebih baik selesaikan sekarang :) Jadi, mari kita mulai. Apa itu pencatatan? Logging adalah pencatatan suatu data tentang pengoperasian suatu program. Tempat dimana data ini ditulis disebut “ log ”. Dua pertanyaan muncul sekaligus: di mana dan data apa yang dicatat? Mari kita mulai dengan "di mana". Anda dapat merekam data pengoperasian program di banyak tempat berbeda. Misalnya, selama belajar, Anda sering mengeluarkan data ke konsol menggunakan System.out.println(). Ini adalah logging yang sebenarnya, meskipun yang paling sederhana. Tentu saja, ini sangat tidak nyaman bagi klien atau tim dukungan produk: mereka jelas tidak ingin menginstal IDE dan memantau konsol :) Ada juga format yang lebih familiar untuk merekam informasi - dalam file teks. Jauh lebih mudah bagi orang untuk membacanya dengan cara ini, dan tentunya lebih mudah untuk menyimpannya! Sekarang pertanyaan kedua: data apa tentang pengoperasian program yang harus dicatat dalam log? Tapi di sini semuanya tergantung pada Anda! Sistem logging Java sangat fleksibel. Anda dapat mengkonfigurasinya sedemikian rupa sehingga seluruh kemajuan program Anda akan dicatat. Di satu sisi, ini bagus. Namun di sisi lain, bayangkan seberapa besar ukuran log Facebook atau Twitter jika semuanya tertulis di sana. Perusahaan besar seperti itu mungkin memiliki kemampuan untuk menyimpan informasi sebanyak ini. Tapi bayangkan betapa sulitnya mencari informasi tentang satu kesalahan kritis dalam log yang berisi 500 gigabyte teks? Ini bahkan lebih buruk dari jarum di tumpukan jerami. Oleh karena itu, login di Java dapat dikonfigurasi sehingga hanya data kesalahan yang ditulis ke log (log). Atau bahkan hanya tentang kesalahan kritis! Meskipun demikian, mengatakan “login di Java” tidak sepenuhnya benar. Faktanya adalah kebutuhan untuk logging muncul di kalangan pemrogram sebelum fungsi ini ditambahkan ke bahasa. Dan ketika Java memiliki perpustakaan logging sendiri, semua orang sudah menggunakan perpustakaan log4j. Sejarah kemunculan logging di Jawa sebenarnya sangat panjang dan informatif, bila ada waktu luang Anda bisa membaca postingan di Habré ini . Singkatnya, Java memiliki perpustakaan logging sendiri, tetapi hampir tidak ada yang menggunakannya :) Kemudian, ketika beberapa perpustakaan logging yang berbeda muncul, dan semua programmer mulai menggunakan perpustakaan yang berbeda, masalah kompatibilitas muncul. Untuk mencegah orang melakukan hal yang sama menggunakan selusin perpustakaan berbeda dengan antarmuka berbeda, kerangka abstraksi slf4j telah dibuat(“Fasad Pencatatan Layanan Untuk Java”). Hal ini disebut abstrak karena meskipun Anda menggunakan kelas slf4j dan memanggil metode mereka, di balik terpal mereka menjalankan semua kerangka logging sebelumnya: log4j, java.util.logging standar, dan lainnya. Jika saat ini Anda memerlukan fitur khusus log4j yang tidak dimiliki perpustakaan lain, tetapi Anda tidak ingin menautkan proyek secara ketat ke perpustakaan khusus ini, gunakan saja slf4j. Dan dia sudah akan “menarik” metode log4j. Jika Anda berubah pikiran dan memutuskan bahwa Anda tidak lagi memerlukan fitur log4j, Anda hanya perlu mengkonfigurasi ulang “wrapper” (yaitu, slf4j) untuk menggunakan perpustakaan lain. Kode Anda tidak akan berhenti bekerja, karena di dalamnya Anda memanggil metode slf4j, dan bukan perpustakaan tertentu. Penyimpangan kecil. Agar contoh berikut dapat berfungsi, Anda perlu mengunduh pustaka slf4j dari sini , dan pustaka log4j dari sini . Selanjutnya, kita perlu membongkar arsip dan menambahkan file jar yang kita perlukan ke classpath melalui Intellij IDEA. Item menu: File -> Struktur Proyek -> Perpustakaan Pilih toples yang diperlukan dan tambahkan ke proyek (ada banyak toples di arsip yang kami unduh, lihat yang Anda perlukan di gambar) Mengapa Anda perlu masuk - 2Mengapa Anda perlu masuk - 3Catatan - instruksi ini untuk itu siswa yang tidak tahu cara menggunakan Maven. Jika Anda tahu cara menggunakannya, lebih baik mencoba memulainya: biasanya lebih mudah. ​​Jika Anda menggunakan Maven , tambahkan ketergantungan ini:
<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
</dependency>
Hebat, kami telah mengatur pengaturannya :) Mari kita lihat cara kerja slf4j. Bagaimana kita dapat memastikan bahwa kemajuan program tercatat di suatu tempat? Untuk ini kita memerlukan dua hal - logger dan appender . Mari kita mulai dengan yang pertama. Logger adalah objek yang sepenuhnya mengelola pencatatan . Membuat logger sangat mudah: dilakukan dengan menggunakan metode statis - LoggerFactory.getLogger(). Sebagai parameter metode ini, Anda harus meneruskan kelas yang pekerjaannya akan dicatat. Mari jalankan kode kita:
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 Tidak ditemukan file konfigurasi Log4j 2. Menggunakan konfigurasi default (hanya mencatat kesalahan ke konsol), atau konfigurasi yang disediakan pengguna secara terprogram. Setel properti sistem 'log4j2.debug' untuk menampilkan logging inisialisasi internal Log4j 2. Lihat https://logging.apache.org/log4j/2.x/manual/configuration.html untuk instruksi tentang cara mengkonfigurasi Log4j 2 15:49:08.907 [utama] ERROR MyTestClass - Telah terjadi kesalahan dalam program! Apa yang kita lihat di sini? Pertama kita melihat pesan kesalahan. Tampaknya karena saat ini kami kekurangan pengaturan yang diperlukan. Oleh karena itu, logger kami sekarang hanya dapat menampilkan pesan kesalahan (ERROR) dan hanya ke konsol. Metode tersebut logger.info()tidak dijalankan. Tapi logger.error()itu berhasil! Konsol menampilkan tanggal saat ini, metode terjadinya kesalahan ( main), kata ERROR dan pesan kami! ERROR adalah tingkat pencatatan. Secara umum, jika entri log ditandai dengan kata ERROR, berarti terjadi kesalahan pada titik tersebut di program. Jika sebuah entri ditandai dengan kata INFO, artinya entri tersebut hanyalah informasi terkini tentang pengoperasian normal program. Pustaka SLF4J memiliki beberapa level logging berbeda yang memungkinkan Anda mengonfigurasi logging secara fleksibel. Mereka sangat mudah untuk dikelola: semua logika yang diperlukan sudah disertakan di kelas Logger. Anda hanya perlu memanggil metode yang diperlukan. Jika Anda ingin mengirim pesan biasa, hubungi logger.info(). Pesan eror - logger.error(). Tampilkan peringatan - logger.warn() Sekarang mari kita bicara tentang appender . Appender adalah tempat data Anda berasal. Bisa dibilang kebalikan dari sumber data adalah “titik B”. Secara default, data dikeluarkan ke konsol. Harap dicatat bahwa dalam contoh sebelumnya kita tidak perlu mengkonfigurasi apa pun: teks muncul di konsol itu sendiri, tetapi logger dari perpustakaan log4j hanya dapat menampilkan pesan tingkat ERROR ke konsol. Jelas lebih mudah bagi orang untuk membaca log dari file teks dan menyimpan log di file yang sama. Untuk mengubah perilaku default logger, kita perlu mengkonfigurasi file appender kita . Untuk memulainya, Anda perlu membuat file log4j.xml langsung di folder src , atau di folder sumber daya, jika Anda menggunakan Maven, atau di folder sumber daya, jika Anda menggunakan Maven. Anda sudah familiar dengan format xml, baru-baru ini kami memberikan kuliah tentangnya :) Berikut isinya:
<?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>
Kelihatannya tidak terlalu rumit :) Tapi mari kita lihat isinya.
<Configuration status="INFO">
Inilah yang disebut pencatat status. Ini tidak terkait dengan logger kami dan digunakan secara internal oleh log4j. Anda dapat mengatur status=”TRACE” alih-alih status=”INFO”, dan semua informasi tentang cara kerja internal log4j akan dikeluarkan ke konsol (status-logger mengeluarkan data ke konsol, bahkan jika penambah program kami adalah file -berdasarkan). Kami tidak membutuhkan ini sekarang, jadi biarkan semuanya apa adanya.
<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 kita membuat appender kita. Tag <File>menunjukkan bahwa itu akan menjadi sebuah file. name="MyFileAppender"- nama appender kami. fileName="C:\Users\Username\Desktop\testlog.txt"— jalur ke file log tempat semua data akan ditulis. append="true"— apakah perlu menulis data tambahan di akhir file. Dalam kasus kami, hal ini akan terjadi. Jika disetel ke false , konten log lama akan dihapus setiap kali program dijalankan kembali. <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>- Ini adalah pengaturan pemformatan. Di sini kita dapat menggunakan ekspresi reguler untuk menyesuaikan format teks di log kita.
<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
Di sini kita menentukan level logging (level root). Kami telah menetapkan level INFO: yaitu, semua pesan pada level yang lebih tinggi dari INFO (menurut tabel yang kami lihat di atas) tidak akan dimasukkan dalam log. Kami akan memiliki 3 pesan dalam program kami: satu INFO, satu PERINGATAN dan satu ERROR. Dengan konfigurasi saat ini, ketiga pesan tersebut akan ditulis ke log. Jika Anda mengubah level root menjadi ERROR, hanya pesan terakhir dari LOGGER.error() yang akan dicatat. Selain itu, link ke appender ditempatkan di sini. Untuk membuat tautan seperti itu, Anda perlu <Root>membuat tag di dalam tag <ApprenderRef>dan menambahkan parameter ke dalamnya ref=”Name твоего аппендера”. Kami membuat nama appender di sini, jika Anda lupa: <File name="MyFileAppender" Dan ini kode 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("Ошибка! Произошло деление на ноль!");
       }
   }
}
Tentu saja, ini sedikit bengkok (menangkap RuntimeException adalah ide yang biasa-biasa saja), tetapi ini sempurna untuk tujuan kita :) Mari kita jalankan metode kita main()4 kali berturut-turut dan lihat file testlog.txt kita. Tidak perlu membuatnya terlebih dahulu: perpustakaan akan melakukannya secara otomatis. Semuanya berhasil! :) Sekarang Anda memiliki logger yang dikonfigurasi. Anda dapat bermain-main dengan beberapa program yang Anda tulis sebelumnya, menambahkan panggilan logger ke semua metode, dan melihat log yang dihasilkan :) Untuk bacaan tambahan, saya sangat merekomendasikan artikel ini . Di sana topik logging dibahas secara mendalam, dan tidak akan mudah untuk membacanya sekaligus. Tapi itu berisi banyak informasi tambahan yang berguna. Misalnya, Anda akan mempelajari cara mengkonfigurasi logger sehingga membuat file teks baru jika file testlog.txt kita mencapai ukuran tertentu :) Dan inilah akhir pelajaran kita! Hari ini Anda belajar tentang topik yang sangat penting, dan pengetahuan ini pasti akan berguna bagi Anda dalam pekerjaan Anda di masa depan. Sampai jumpa lagi! :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION