"Oh, awak ada! Awak ingat kita ada pelajaran lagi hari ini?"

"Tidak, saya hanya mencari awak. Hampir…"

"Cemerlang, maka mari kita mulakan. Hari ini saya ingin memberitahu anda tentang pembalakan."

"Log ialah senarai peristiwa yang telah berlaku. Hampir seperti log kapal atau diari. Atau Twitter — mungkin anda boleh mengaitkannya dengan lebih baik. Tidak mengejutkan, pembalak ialah objek yang anda gunakan untuk pembalakan."

"Dalam pengaturcaraan, adalah kebiasaan untuk log hampir semua. Dan di Java, kami log segala-galanya dan lebih sedikit lagi."

"Hakikatnya ialah program Java adalah aplikasi pelayan yang sangat besar tanpa UI, konsol, dan lain-lain. Mereka memproses beribu-ribu permintaan pengguna pada masa yang sama, dan selalunya terdapat pelbagai ralat. Terutama apabila benang yang berbeza mula mengganggu antara satu sama lain."

"Malah, satu-satunya cara untuk mencari pepijat dan kegagalan yang jarang boleh dihasilkan dalam keadaan ini adalah dengan mencatatkan semua yang berlaku pada setiap utas."

"Selalunya, log mengandungi maklumat tentang hujah kaedah, sebarang ralat yang ditangkap dan banyak maklumat perantaraan."

"Semakin lengkap log, lebih mudah untuk menghasilkan semula urutan peristiwa dan menjejaki punca kegagalan atau pepijat."

"Kadangkala log mencapai beberapa gigabait setiap hari. Ini perkara biasa."

"Beberapa gigabait? O_o"

"Ya. Selalunya, fail log diarkibkan secara automatik, dengan petunjuk tarikh yang berkaitan."

"Wah."

"Uh-huh. Pada mulanya, Java tidak mempunyai pembalak sendiri. Akibatnya, beberapa pembalak bebas telah ditulis. Yang paling biasa ialah log4j."

"Beberapa tahun kemudian, Java mendapat pembalaknya sendiri, tetapi fungsinya jauh lebih rendah dan ia tidak digunakan secara meluas."

"Adalah fakta bahawa Java mempunyai pembalak rasmi, tetapi seluruh komuniti pengaturcara Java lebih suka menggunakan pembalak lain. "

"Kemudian, beberapa lagi pembalak telah ditulis berdasarkan log4j."

"Kemudian logger universal khas slf4j, yang kini digunakan secara meluas, telah ditulis untuk mereka semua. Ia sangat serupa dengan log4j, jadi saya akan menggunakannya sebagai contoh apabila menerangkan pembalakan."

"Keseluruhan proses pembalakan terdiri daripada tiga bahagian."

" Pertama , kumpulkan maklumat."

" Kedua , tapis maklumat yang dikumpul."

" Ketiga , rekod maklumat yang dipilih."

"Mari kita mulakan dengan pengumpulan. Berikut ialah contoh biasa kelas yang log:"

Kelas dengan pembalakan
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;
  }
 }
}

"Beri perhatian kepada perkataan yang diserlahkan dengan warna merah."

" Baris 3  – Buat objek logger . Objek statik sedemikian dicipta dalam hampir setiap kelas! Nah, kecuali untuk kelas yang tidak melakukan apa-apa selain daripada menyimpan data."

" LoggerFactory ialah kelas khas untuk mencipta pembalak, dan getLogger ialah salah satu kaedah statiknya. Objek semasa biasanya diluluskan, tetapi pelbagai pilihan boleh dilakukan."

" Baris 7 – Maklumat tentang panggilan kaedah ditulis kepada pembalak. Ambil perhatian bahawa ini adalah baris pertama kaedah. Sebaik sahaja kaedah dipanggil, kami segera menulis maklumat pada log."

"Kami memanggil kaedah nyahpepijat, yang bermaksud kepentingan maklumat ialah tahap DEBUG. Ini digunakan untuk penapisan. Saya akan memberitahu anda tentang perkara itu dalam beberapa minit."

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

"Kali ini kami memanggil kaedah ralat, yang dengan serta-merta menunjukkan bahawa maklumat adalah tahap ERROR"

Pembalak - 1

"Semuanya nampak jelas buat masa ini. Baiklah, sejauh mana ia boleh jelas di tengah-tengah perbualan kita."

"Bagus, kemudian mari kita beralih kepada penapisan mesej."

"Biasanya, setiap mesej log mempunyai tahap kepentingannya sendiri, yang boleh anda gunakan untuk membuang beberapa mesej. Berikut ialah tahap kepentingan yang saya nyatakan:"

Tahap kepentingan Penerangan
SEMUA Semua mesej
JEJAK Mesej nyahpepijat berbutir halus
DEBUG Mesej nyahpepijat penting
INFO Mesej maklumat
AMARAN Amaran
RALAT Kesilapan
MAUT Kesilapan maut
DIMATIKAN Tiada mesej

Tahap ini juga digunakan semasa menapis mesej.

Katakan anda menetapkan tahap pengelogan kepada AMARAN. Kemudian semua mesej yang kurang penting daripada WARN akan dibuang: TRACE, DEBUG, INFO.

Jika anda menetapkan tahap penapisan kepada FATAL, maka mesej ERROR pun akan dibuang.

"Terdapat dua lagi tahap kepentingan yang digunakan semasa menapis: MATI, yang membuang semua mesej; dan SEMUA, yang menunjukkan semua mesej (tiada apa-apa yang dibuang)."

"Bagaimana dan di mana saya hendak menyediakan penapisan?"

"Saya akan beritahu awak tanpa berlengah lagi."

"Biasanya, tetapan logger log4j ditentukan dalam fail log4j.properties."

Anda boleh menentukan berbilang objek appender dalam fail ini. Data ditulis kepada objek ini. Terdapat sumber data, dan terdapat penambah — objek yang mempunyai tujuan yang bertentangan. Objek yang data mengalir ke dalam seperti air.

"Berikut adalah beberapa contoh:"

Log 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 ulasan

Baris 2 - Kami menunjukkan tahap pembalakan yang kami mahu. Semua tahap yang kurang penting (DEBUG, TRACE) akan dibuang.

Di tempat yang sama, kami menambah koma dan kemudian menunjukkan nama objek (yang kami hasilkan sendiri) yang log akan ditulis. Baris 5-9 mengandungi tetapannya.

Baris 5 – Kami menentukan jenis pelengkap ( ConsoleAppender ).

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

Baris 7 – Kami menetapkan kelas yang akan pengurus corak penukaran (PatternLayout).

Baris 8 – Kami menetapkan corak penukaran yang akan digunakan untuk menulis. Dalam contoh di atas, ia adalah tarikh dan masa.

"Dan inilah rupa penulisan pada fail:"

Log masuk ke fail
# 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 menetapkan tahap penapisan mesej dan nama objek penambah (sinki)."

"Baris 5 – Kami menentukan jenis penambah fail ( RollingFileAppender )."

"Baris 6 – Kami menentukan nama fail yang akan ditulis log."

"Baris 7 – Kami menentukan saiz log maksimum. Apabila had saiz ini melebihi, fail baharu dibuat."

"Baris 8 – Kami menentukan bilangan fail log lama untuk disimpan."

"Barisan 9-10 – Tetapkan corak penukaran."

"Saya tidak tahu apa yang berlaku di sini, tetapi saya boleh meneka. Itu menggalakkan."

"Itu bagus. Kemudian berikut ialah contoh cara menulis log pada fail dan konsol:"

Log masuk ke konsol dan fail
# 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 awak boleh buat macam tu? Baguslah!"

"Ya. Anda boleh mengisytiharkan seberapa banyak penambah yang anda mahu dan menyesuaikan setiap satu."

Tambahan pula, setiap penambah boleh mempunyai tetapan yang sangat fleksibel untuk penapisan mesej. Kami bukan sahaja boleh menetapkan tahap penapisan mesej individu kepada setiap penambah, tetapi kami juga boleh menapis mesej mengikut pakej! Itulah sebabnya anda perlu menentukan kelas semasa membuat pembalak (saya bercakap tentang LoggerFactory.getLogger ).

"Sebagai contoh:"

Log masuk ke konsol dan fail
# 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

"Barisan 6 dan 15 – Kami menetapkan tahap penapisan kami sendiri untuk setiap penambah."

"Barisan 20-23 – Kami menentukan nama pakej dan tahap penapisan untuk mesejnya. Log4j.logger ialah awalan: nama pakej diserlahkan dalam oren."

"Betul ke? Awak pun boleh buat macam tu. Well, cool!"

"Sebenarnya, log4j mahupun slf4j tidak disertakan dalam JDK. Anda perlu memuat turunnya secara berasingan. Anda boleh melakukannya di sini . Tetapi ada cara lain:"

" Langkah 1 .Tambah import pada kelas:"

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

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

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

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

" Langkah 5 . Tentukan tempat untuk memuat turun perpustakaan (jar)"

" Langkah 6 . Gunakan kelas yang anda perlukan."

"Wah! Sungguh hari ini. Begitu banyak yang baru dan begitu banyak yang menarik!"

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

"Baiklah, itu sudah cukup. Pergi berehat, pengaturcara."