CodeGym /Java Blog /Acak /Pencatatan Jawa
John Squirrels
Level 41
San Francisco

Pencatatan Jawa

Dipublikasikan di grup Acak
Hai! Saat menulis pelajaran, saya sangat menekankan jika ada topik tertentu yang akan sangat penting dalam pekerjaan nyata. Jadi, DENGARKAN! Topik yang akan kami bahas hari ini pasti akan berguna di semua proyek Anda sejak hari pertama kerja. Kita akan berbicara tentang Java Logging. Topik ini sama sekali tidak rumit (saya bahkan akan mengatakan mudah). Tetapi Anda akan memiliki hal-hal yang cukup jelas untuk ditekankan pada pekerjaan pertama Anda, jadi lebih baik untuk memahaminya sekarang :) Baiklah, mari kita mulai.

Apa itu login di Jawa?

Logging adalah tindakan merekam data tentang pengoperasian suatu program. Tempat kami merekam data ini disebut "log". Dua pertanyaan segera muncul: data apa yang ditulis dan di mana? Mari kita mulai dengan "di mana". Anda dapat menulis data tentang kerja program di banyak tempat berbeda. Misalnya, selama studi Anda, Anda sering System.out.println()untuk menampilkan data ke konsol. Ini memang penebangan, meskipun dalam bentuknya yang paling sederhana. Tentu saja, ini sangat tidak nyaman bagi pengguna atau tim dukungan produk: jelas, mereka tidak ingin menginstal IDE dan memantau konsol :) Ada format yang lebih umum untuk merekam informasi: file teks. Manusia jauh lebih nyaman membaca data dalam format ini, dan tentunya jauh lebih nyaman untuk menyimpan data! Sekarang pertanyaan kedua: data program apa yang harus dicatat? Itu sepenuhnya terserah Anda! Sistem logging Java sangat fleksibel. Anda dapat mengonfigurasinya untuk mencatat semua yang dilakukan program Anda. Di satu sisi, ini bagus. Namun di sisi lain, bayangkan betapa besar log Facebook atau Twitter jika mereka menulis semuanya di dalamnya. Perusahaan besar ini mungkin memiliki kemampuan untuk menyimpan data sebanyak itu. Tapi bayangkan betapa sulitnya menemukan informasi tentang satu kesalahan kritis dalam 500 gigabytes log teks? Itu akan lebih buruk daripada mencari jarum di tumpukan jerami. Dengan demikian, Java dapat dikonfigurasi untuk hanya mencatat data kesalahan. Atau bahkan hanya kesalahan kritis! Yang mengatakan, itu tidak sepenuhnya akurat untuk berbicara tentang sistem logging asli Jawa. Faktanya adalah programmer membutuhkan logging sebelum fungsi ini ditambahkan ke bahasa. Pada saat Java memperkenalkan pustaka loggingnya sendiri, semua orang sudah menggunakan pustaka log4j. Sejarah logging di Java sebenarnya sangat panjang dan informatif. Singkatnya, Java memiliki pustaka loggingnya sendiri, tetapi hampir tidak ada yang menggunakannya :) Nanti, ketika beberapa pustaka logging berbeda muncul dan mulai digunakan oleh pemrogram, masalah kompatibilitas muncul. Untuk mencegah orang menemukan kembali roda di selusin perpustakaan berbeda dengan antarmuka berbeda, kerangka kerja SLF4J abstrak ("Layanan Logging Fasad Untuk Java") telah dibuat. Ini disebut abstrak, karena bahkan jika Anda menggunakan dan memanggil metode kelas SLF4J, sebenarnya mereka menggunakan semua kerangka logging yang datang sebelumnya: log4j, java.util.logging standar, dan lainnya. Jika pada titik tertentu Anda memerlukan beberapa fitur spesifik Log4j yang tidak dimiliki perpustakaan lain, tetapi Anda tidak ingin langsung menautkan proyek Anda ke perpustakaan ini, gunakan saja SLF4J. Dan kemudian biarkan memanggil metode Log4j. Jika Anda berubah pikiran dan memutuskan bahwa Anda tidak lagi memerlukan fitur Log4j, Anda hanya perlu mengonfigurasi ulang "di sini , dan perpustakaan Log4j di sini . Selanjutnya, bongkar arsip dan gunakan IntelliJ IDEA untuk menambahkan file JAR ke classpath. Item menu: File -> Struktur Proyek -> Perpustakaan Pilih file JAR yang diperlukan dan tambahkan ke proyek (arsip yang kami unduh berisi banyak file JAR - lihat gambar untuk melihat yang Anda butuhkan) Perhatikan bahwa instruksi ini untuk para Mengapa kita perlu masuk - 2Mengapa kita perlu masuk - 3siswa yang tidak tahu cara menggunakan Maven. Jika Anda tahu cara menggunakan Maven, biasanya lebih baik (jauh lebih mudah) untuk mencoba memulai dari sana. Jika Anda menggunakan Maven , tambahkan dependensi ini:

    	<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
    	</dependency>
Besar! Kami menemukan pengaturannya :) Mari kita lihat cara kerja SLF4J. Bagaimana kami memastikan bahwa pekerjaan program direkam di suatu tempat? Untuk melakukan ini, kita membutuhkan dua hal: logger dan appender. Mari kita mulai dengan yang pertama. Logger adalah objek yang memberikan kontrol penuh terhadap logging. Membuat logger sangat mudah: kami melakukannya dengan menggunakan metode statis LoggerFactory.getLogger() . Parameter metode adalah kelas yang operasinya 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 entry!!!");
       LOGGER.error("An error occurred!");
   }
}
Keluaran 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 pesan kesalahan. Ini adalah hasil dari fakta bahwa sekarang kami kekurangan pengaturan yang diperlukan. Karenanya, logger kami saat ini hanya dapat menampilkan pesan kesalahan (ERROR) dan hanya ke konsol. Metode logger.info() tidak berfungsi. Tapi logger.error() melakukannya! Di konsol, kami melihat tanggal saat ini, metode terjadinya kesalahan ( main), kata "ERROR", dan pesan kami! ERROR adalah tingkat logging. Secara umum, jika entri log ditandai dengan kata "ERROR", maka kesalahan telah terjadi pada saat ini dalam program. Jika entri ditandai dengan kata "INFO", maka pesan tersebut hanya mewakili informasi terkini tentang pengoperasian normal program. Pustaka SLF4J memiliki banyak level logging berbeda yang memungkinkan Anda mengonfigurasi logging secara fleksibel. Semuanya sangat mudah dikelola: semua logika yang diperlukan sudah ada di kelas Java Logger . Anda hanya perlu memanggil metode yang relevan. Jika Anda ingin mencatat pesan rutin, panggil metode logger.info() . Untuk pesan kesalahan, gunakan logger.error() . Untuk peringatan, gunakan logger.warn()

Sekarang mari kita bicara tentang appender

Appender adalah tempat di mana data Anda pergi. Di satu sisi, kebalikan dari sumber data, yaitu "titik B". Secara default, data dikeluarkan ke konsol. Perhatikan bahwa dalam contoh sebelumnya kita tidak perlu mengonfigurasi apa pun: teks muncul di konsol, dan logger pustaka Log4j hanya dapat menampilkan pesan tingkat ERROR ke konsol. Jelas, lebih nyaman bagi orang untuk membaca dan menulis log dalam file teks. Untuk mengubah perilaku default logger, kita perlu mengonfigurasi appender file kita. Untuk memulai, Anda perlu membuat file log4j.xml langsung di folder src. Anda sudah terbiasa dengan format XML: baru-baru ini kami mendapat pelajaran tentangnya :) Berikut isi filenya:

<?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>
Tidak ada yang istimewa atau sulit di sini :) Tapi tetap saja, mari kita telusuri kontennya.
<Configuration status="INFO">
Inilah yang disebut StatusLogger. Itu tidak terkait dengan logger kami dan digunakan dalam proses internal Log4j. Jika Anda menyetel status="TRACE" alih-alih status="INFO", dan semua informasi tentang pekerjaan internal Log4j akan ditampilkan di konsol (StatusLogger menampilkan data di konsol, meskipun appender kami adalah file). Kita tidak membutuhkannya sekarang, jadi mari kita biarkan apa adanya.

<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 kita membuat appender kita. Tag <File> menunjukkan bahwa itu akan menjadi file appender. name="MyFileAppender" menetapkan nama appender. fileName="C:\Users\Username\Desktop\testlog.txt" menunjukkan jalur ke file log tempat semua data akan ditulis. append="true" menunjukkan apakah data harus ditulis di akhir file. Dalam kasus kami, inilah tepatnya yang akan kami lakukan. Jika Anda menyetel nilainya ke false, maka konten lama dari file log akan dihapus setiap kali program dimulai. <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>menunjukkan pengaturan pemformatan. Di sini kita dapat menggunakan ekspresi reguler untuk menyesuaikan bagaimana teks diformat dalam log kita.

<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
Di sini kami menunjukkan level root. Kami telah menetapkan level "INFO", yang berarti bahwa semua pesan yang levelnya lebih tinggi dari INFO (menurut tabel yang kami lihat di atas) tidak akan dicatat. Program kami akan memiliki 3 pesan: satu INFO, satu WARN dan satu ERROR. Dengan konfigurasi saat ini, ketiga pesan tersebut akan dicatat. Jika Anda mengubah level root ke ERROR, hanya pesan terakhir dari panggilan metode LOGGER.error() yang akan berakhir di log. Selain itu, referensi ke appender juga ada di sini. Untuk membuat referensi seperti itu, Anda perlu membuat tag <ApprenderRef> di dalam tag <Root> dan menambahkan atribut ref='your appender's name' ke dalamnya. Jika Anda lupa, ini adalah tempat kami menetapkan nama appender: <. Dan inilah kode 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!");
       }
   }
}
Tentu saja, ini sedikit aneh (mendapatkan RuntimeException adalah ide yang patut dipertanyakan), tetapi ini sempurna untuk tujuan kita :) Mari jalankan metode main() kita 4 kali berturut-turut dan lihat file testlog.txt kita. Anda 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 lama Anda, menambahkan panggilan logger ke setiap metode. Kemudian lihat log yang dihasilkan :) Ini mempertimbangkan topik logging secara mendalam. Akan sulit untuk membaca semuanya sekaligus. Yang mengatakan, itu memang mengandung banyak informasi berguna tambahan. Misalnya, Anda akan mempelajari cara mengonfigurasi logger sehingga membuat file teks baru jika file testlog.txt mencapai ukuran tertentu :) Dan selesailah kelas kita! Hari ini Anda menjadi akrab dengan topik yang sangat penting, dan pengetahuan ini pasti akan membantu Anda dalam pekerjaan Anda di masa depan. Sampai Lain waktu! :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION