"Oh, ini kamu! Apakah kamu ingat bahwa kita memiliki pelajaran lain hari ini?"

"Tidak, aku hanya mencarimu. Hampir..."

"Bagus, kalau begitu mari kita mulai. Hari ini saya ingin memberi tahu Anda tentang penebangan."

"Log adalah daftar peristiwa yang telah terjadi. Hampir seperti log kapal atau buku harian. Atau Twitter — mungkin Anda bisa menghubungkannya dengan lebih baik. Tidak mengherankan, logger adalah objek yang Anda gunakan untuk logging."

"Dalam pemrograman, biasanya mencatat hampir semua hal. Dan di Java, kami mencatat semuanya dan bahkan lebih sedikit lagi."

"Faktanya adalah bahwa program Java seringkali merupakan aplikasi server besar tanpa UI, konsol, dll. Mereka memproses ribuan permintaan pengguna pada saat yang sama, dan seringkali terdapat berbagai kesalahan. Terutama ketika utas yang berbeda mulai mengganggu satu sama lain."

"Faktanya, satu-satunya cara untuk mencari bug dan kegagalan yang jarang direproduksi dalam keadaan ini adalah dengan mencatat semua yang terjadi di setiap utas."

"Paling sering, log berisi informasi tentang argumen metode, kesalahan yang tertangkap, dan banyak informasi perantara."

"Semakin lengkap log, semakin mudah mereproduksi urutan kejadian dan melacak penyebab kegagalan atau bug."

"Terkadang log mencapai beberapa gigabyte per hari. Ini normal."

"Beberapa gigabyte? O_o"

"Ya. Paling sering, file log diarsipkan secara otomatis, dengan indikasi tanggal yang relevan."

"Wah."

"Uh-huh. Awalnya, Java tidak memiliki logger sendiri. Akibatnya, beberapa logger independen ditulis. Yang paling umum adalah log4j."

"Beberapa tahun kemudian, Java mendapatkan loggernya sendiri, tetapi fungsinya jauh lebih rendah dan tidak digunakan secara luas."

“Benar bahwa Java memiliki logger resmi, tetapi seluruh komunitas programmer Java lebih memilih menggunakan logger lain.

"Kemudian, beberapa penebang lagi ditulis berdasarkan log4j."

"Kemudian logger universal khusus slf4j, yang sekarang banyak digunakan, ditulis untuk semuanya. Ini sangat mirip dengan log4j, jadi saya akan menggunakannya sebagai contoh saat menjelaskan logging."

"Seluruh proses penebangan terdiri dari tiga bagian."

" Pertama , kumpulkan informasi."

" Kedua , saring informasi yang dikumpulkan."

" Ketiga , catat informasi yang dipilih."

"Mari kita mulai dengan pengumpulan. Ini adalah contoh tipikal kelas yang mencatat log:"

Kelas dengan logging
class Manager
{
 private static final Logger logger = LoggerFactory.getLogger(Manager.class);

 public boolean processTask(Task task)
 {
  logger.debug("processTask id = " + task.getId());
  try
  {
   task.start();
   task.progress();
   task.complete();
   return true;
  }
  catch(Exception e)
  {
   logger.error("Unknown error", e);
   return false;
  }
 }
}

"Perhatikan kata-kata yang disorot dengan warna merah."

" Baris 3  – Buat objek logger . Objek statis semacam itu dibuat di hampir setiap kelas! Nah, kecuali untuk kelas yang tidak melakukan apa pun selain menyimpan data."

" LoggerFactory adalah kelas khusus untuk membuat logger, dan getLogger adalah salah satu metode statisnya. Objek saat ini biasanya diteruskan, tetapi berbagai opsi dimungkinkan."

" Baris 7 – Informasi tentang pemanggilan metode ditulis ke logger. Perhatikan bahwa ini adalah baris pertama dari metode. Segera setelah metode dipanggil, kami segera menulis informasi ke log."

"Kami memanggil metode debug, yang berarti pentingnya informasi adalah tingkat DEBUG. Ini digunakan untuk memfilter. Saya akan memberi tahu Anda tentang itu dalam beberapa menit."

" Baris 17 – Kami menangkap pengecualian dan... segera menulisnya ke log! Inilah yang perlu dilakukan."

"Kali ini kami memanggil metode kesalahan, yang segera menunjukkan bahwa informasinya adalah tingkat ERROR"

Pencatat - 1

"Semuanya tampak jelas untuk saat ini. Yah, sejauh yang bisa dijelaskan di tengah pembicaraan kita."

"Bagus, lalu mari beralih ke pemfilteran pesan."

"Biasanya, setiap pesan log memiliki tingkat kepentingannya sendiri, yang dapat Anda gunakan untuk membuang beberapa pesan. Berikut adalah tingkat kepentingan yang saya sebutkan:"

Tingkat kepentingan Keterangan
SEMUA Semua pesan
JEJAK Pesan debug halus
DEBUG Pesan debug penting
INFO Pesan informasi
MEMPERINGATKAN Peringatan
KESALAHAN Kesalahan
FATAL Kesalahan fatal
MATI Tidak ada pesan

Level ini juga digunakan saat memfilter pesan.

Misalkan Anda menyetel level logging ke WARN. Kemudian semua pesan yang kurang penting dari WARN akan dibuang: TRACE, DEBUG, INFO.

Jika Anda menyetel tingkat pemfilteran ke FATAL, pesan ERROR pun akan dibuang.

"Ada dua tingkat kepentingan lainnya yang digunakan saat memfilter: NONAKTIF, yang membuang semua pesan; dan SEMUA, yang menampilkan semua pesan (tidak ada yang dibuang)."

"Bagaimana dan di mana saya menyiapkan pemfilteran?"

"Aku akan memberitahumu tanpa basa-basi lagi."

"Biasanya, pengaturan log4j logger ditentukan dalam file log4j.properties."

Anda dapat menentukan beberapa objek appender dalam file ini. Data ditulis ke objek-objek ini. Ada sumber data, dan ada tambahan — objek yang memiliki tujuan berlawanan. Objek tempat data mengalir seperti air.

"Ini beberapa contohnya:"

Masuk ke konsol
# Root logger option
log4j.rootLogger = INFO, stdout

# Direct log messages to stdout
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}

Baris 1 dan 4 – Ini adalah komentar

Baris 2 – Kami menunjukkan level logging yang kami inginkan. Semua level yang kurang penting (DEBUG, TRACE) akan dibuang.

Di tempat yang sama, kami menambahkan koma dan kemudian menunjukkan nama objek (yang kami buat sendiri) tempat log akan ditulis. Baris 5-9 berisi pengaturannya.

Baris 5 – Kami menentukan jenis appender ( ConsoleAppender ).

Baris 6 – Kami menunjukkan dengan tepat di mana kami menulis ( System.out. ).

Baris 7 – Kami menetapkan kelas yang akan mengelola pola konversi (PatternLayout).

Baris 8 – Kami mengatur pola konversi yang akan digunakan untuk menulis. Dalam contoh di atas, ini adalah tanggal dan waktu.

"Dan inilah yang terlihat seperti menulis ke file:"

Masuk ke file
# Root logger option
log4j.rootLogger = INFO, file

# Direct log messages to a log file
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File = C:\\loging.log
log4j.appender.file.MaxFileSize = 1MB
log4j.appender.file.MaxBackupIndex = 1
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %-5p %c{1}:%L - %m%n

"Baris 2 menyetel tingkat pemfilteran pesan dan nama objek appender (tenggelam)."

"Baris 5 – Kami menentukan jenis pemberi file ( RollingFileAppender )."

"Baris 6 – Kami menentukan nama file tempat log akan ditulis."

"Baris 7 – Kami menentukan ukuran log maksimum. Ketika batas ukuran ini terlampaui, file baru akan dibuat."

"Baris 8 – Kami menentukan jumlah file log lama yang akan disimpan."

"Baris 9-10 – Tetapkan pola konversi."

"Saya tidak tahu apa yang terjadi di sini, tapi saya bisa menebak. Itu membesarkan hati."

"Itu bagus. Lalu inilah contoh cara menulis log ke file dan konsol:"

Masuk ke konsol dan file
# Root logger option
log4j.rootLogger = INFO, file, stdout

# Direct log messages to a log file
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File = C:\\loging.log
log4j.appender.file.MaxFileSize = 1MB
log4j.appender.file.MaxBackupIndex = 1
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %-5p %c{1}:%L - %m%n

# Direct log messages to stdout
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}

"Ah, jadi kamu bisa melakukan itu? Hebat!"

"Ya. Anda dapat mendeklarasikan sebanyak mungkin tambahan yang Anda inginkan dan menyesuaikan masing-masing."

Selain itu, setiap appender dapat memiliki pengaturan yang sangat fleksibel untuk pemfilteran pesan. Kami tidak hanya dapat menetapkan tingkat pemfilteran pesan individu untuk setiap appender, tetapi kami juga dapat memfilter pesan berdasarkan paket! Itu sebabnya Anda perlu menentukan kelas saat membuat logger (saya berbicara tentang LoggerFactory.getLogger ).

"Misalnya:"

Masuk ke konsol dan file
# Root logger option
log4j.rootLogger = INFO, file, stdout

# Direct log messages to a log file
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.threshold = DEBUG
log4j.appender.file.File = C:\\loging.log
log4j.appender.file.MaxFileSize = 1MB
log4j.appender.file.MaxBackupIndex = 1
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %-5p %c{1}:%L - %m%n

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.threshold = ERROR
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}

log4j.logger.org.springframework = ERROR
log4j.logger.org.hibernate = ERROR
log4j.logger.com.codegym = DEBUG
log4j.logger.org.apache.cxf = ERROR

"Baris 6 dan 15 – Kami menetapkan tingkat pemfilteran kami sendiri untuk setiap penambah."

"Baris 20-23 – Kami menentukan nama paket dan tingkat pemfilteran untuk pesannya. Log4j.logger adalah awalan: nama paket disorot dengan warna oranye."

"Benarkah? Kamu bahkan bisa melakukan itu. Wah, keren!"

"Ngomong-ngomong, baik log4j maupun slf4j tidak termasuk dalam JDK. Anda harus mengunduhnya secara terpisah. Anda dapat melakukannya di sini . Tapi ada cara lain:"

" Langkah 1 .Tambahkan impor ke kelas:"

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

" Langkah 2. Letakkan kursor pada baris ini dan tekan Alt+Enter di IntelliJ IDEA"

" Langkah 3 . Pilih item menu 'File jar di web».'

" Langkah 4. Pilih 'slf4j-log4j13.jar'"

" Langkah 5. Tentukan tempat mendownload library (jar)"

" Langkah 6. Gunakan kelas yang Anda butuhkan."

"Wah! Hari yang luar biasa ini. Begitu banyak yang baru dan begitu banyak yang keren!"

"Inilah artikel bagus lainnya tentang logging: https://docs.Oracle.com/javase/10/core/java-logging-overview.htm#JSCOR-GUID-48004124-2C00-49F7-A640-0C0DDA271DBC "

"Baiklah, sudah cukup. Santai saja, programmer."