"Oh, sampeyan iki! Apa sampeyan kelingan yen dina iki kita ana pelajaran maneh?"

"Ora, aku mung nggoleki sampeyan. Meh..."

"Apik banget, banjur ayo miwiti. Dina iki aku arep ngomong babagan logging."

"Log kasebut minangka dhaptar acara sing wis kedadeyan. Meh kaya log kapal utawa buku harian. Utawa Twitter - bisa uga sampeyan bisa luwih apik.

"Ing pemrograman, umume nyathet meh kabeh. Lan ing Jawa, kita nyathet kabeh lan luwih sithik."

"Kasunyatan iku program Jawa asring banget aplikasi server gedhe tanpa UI, console, etc. Padha proses ewu panjalukan pangguna ing wektu sing padha, lan ana asring macem-macem kasalahan. Utamané nalika Utas beda wiwit interfering karo saben liyane."

"Nyatane, siji-sijine cara kanggo nggoleki kewan omo lan kegagalan sing arang bisa direproduksi ing kahanan kasebut yaiku nyathet kabeh sing kedadeyan ing saben utas."

"Paling asring, log ngemot informasi babagan argumen metode, kesalahan sing kejiret, lan akeh informasi penengah."

"Log sing luwih lengkap, luwih gampang ngasilake urutan acara lan nglacak panyebab kegagalan utawa kewan omo."

"Kadhangkala log tekan sawetara gigabyte saben dina. Iki normal."

"Sawetara gigabyte? O_o"

"Ya. Paling asring, file log diarsipake kanthi otomatis, kanthi indikasi tanggal sing cocog."

"Wah."

"Uh-huh. Wiwitane, Jawa ora duwe logger dhewe. Akibate, sawetara penebang independen ditulis. Sing paling umum yaiku log4j."

"Sawetara taun sabanjure, Jawa entuk logger dhewe, nanging fungsine luwih sithik lan ora digunakake kanthi akeh."

"Iku kasunyatan yen Jawa duwe logger resmi, nanging kabeh komunitas programer Jawa luwih seneng nggunakake logger liyane. "

"Mengko, sawetara penebang liyane ditulis adhedhasar log4j."

"Banjur logger universal khusus slf4j, sing saiki akeh digunakake, ditulis kanggo kabeh. Iku meh padha karo log4j, mula aku bakal nggunakake minangka conto nalika nerangake logging."

"Kabeh proses logging kasusun saka telung bagean."

" Pisanan , ngumpulake informasi."

" Kapindho , nyaring informasi sing diklumpukake."

" Kaping telu , rekam informasi sing dipilih."

"Ayo miwiti karo koleksi. Punika conto khas saka kelas sing log:"

Kelas karo 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;
  }
 }
}

"Nggatekake tembung sing disorot abang."

" Baris 3  - Nggawe obyek logger . Obyek statis kuwi digawe ing meh saben kelas! Inggih, kajaba kanggo kelas sing ora nindakake apa-apa liyane saka nyimpen data."

" LoggerFactory minangka kelas khusus kanggo nggawe logger, lan getLogger minangka salah sawijining metode statis. Objek saiki biasane dilewati, nanging macem-macem opsi bisa."

" Baris 7 - Informasi babagan panggilan metode ditulis menyang logger. Elinga yen iki minangka baris pisanan saka metode kasebut. Sanalika metode kasebut diarani, kita langsung nulis informasi menyang log."

"We nelpon cara debug, kang tegese wigati informasi punika tingkat DEBUG. Iki digunakake kanggo nyaring. Aku bakal pitutur marang kowe bab sing ing sawetara menit."

" Baris 17 - We nyekel pangecualian lan ... langsung nulis menyang log! Iki persis apa sing kudu dilakoni."

"Wektu iki kita nelpon metode kesalahan, sing langsung nuduhake yen informasi kasebut tingkat ERROR"

Pencatat - 1

"Saiki kabeh katon jelas. Nah, nganti bisa jelas ing tengah-tengah obrolan kita."

"Apik, banjur pindhah menyang nyaring pesen."

"Biasane, saben pesen log duwe tingkat wigati dhewe, sing bisa digunakake kanggo mbuang sawetara pesen. Ing ngisor iki tingkat wigati sing dakkandhakake: "

Tingkat wigati Katrangan
KABEH Kabeh pesen
TRACE Pesen debug sing apik
DEBUG Pesen debug penting
INFO Pesen informasi
WARNING Pènget
ERROR Kasalahan
FATAL kesalahan fatal
OFF Ora ana pesen

Tingkat kasebut uga digunakake nalika nyaring pesen.

Upaminipun sampeyan nyetel tingkat logging kanggo WARN. Banjur kabeh pesen sing kurang penting tinimbang WARN bakal dibuwang: TRACE, DEBUG, INFO.

Yen sampeyan nyetel tingkat panyaring menyang FATAL, malah pesen ERROR bakal dibuwang.

"Ana rong tingkat penting sing digunakake nalika nyaring: OFF, sing mbuwang kabeh pesen; lan ALL, sing nuduhake kabeh pesen (ora ana sing dibuwang)."

"Carane lan ing ngendi aku nyiyapake nyaring?"

"Aku bakal ngomong tanpa ado maneh."

"Biasane, setelan logger log4j ditemtokake ing file log4j.properties."

Sampeyan bisa nemtokake sawetara obyek appender ing file iki. Data ditulis kanggo obyek kasebut. Ana sumber data, lan ana appenders - obyek sing duwe tujuan ngelawan. Obyek sing data mili menyang kaya banyu.

"Iki sawetara conto:"

Log menyang console
# 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 lan 4 - Iki minangka komentar

Baris 2 - Kita nuduhake level logging sing dikarepake. Kabeh level sing kurang penting (DEBUG, TRACE) bakal dibuwang.

Ing panggonan sing padha, kita nambah koma lan banjur nuduhake jeneng obyek (sing kita teka munggah karo dhéwé) sing log bakal ditulis. Baris 5-9 ngemot setelane.

Baris 5 - Kita nemtokake jinis appender ( ConsoleAppender ).

Baris 6 - Kita nuduhake persis ing ngendi kita nulis ( System.out. ).

Baris 7 - Kita nyetel kelas sing bakal ngatur pola konversi (PatternLayout).

Baris 8 - Kita nyetel pola konversi sing bakal digunakake kanggo nulis. Ing conto ing ndhuwur, iku tanggal lan wektu.

"Lan iki kaya apa nulis menyang file:"

Mlebu menyang 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

"Line 2 nyetel tingkat nyaring pesen lan jeneng obyek appender (sink)."

"Line 5 - Kita nemtokake jinis appender file ( RollingFileAppender )."

"Line 6 - Kita nemtokake jeneng file sing bakal ditulis log."

"Line 7 - Kita nemtokake ukuran log maksimum. Nalika watesan ukuran iki ngluwihi, file anyar digawe."

"Line 8 - Kita nemtokake jumlah file log lawas sing bakal disimpen."

"Baris 9-10 - Setel pola konversi."

"Aku ora ngerti apa sing kedadeyan ing kene, nanging aku bisa ngira. Sing nyemangati."

"Iku apik. Banjur iki conto carane nulis log menyang file lan console: "

Log menyang console lan 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, dadi sampeyan bisa nindakake iku? Apik banget!"

"Yep. Sampeyan bisa ngumumake minangka akeh appenders sing pengin lan ngatur saben siji."

Salajengipun, saben appender bisa duwe setelan sing fleksibel banget kanggo nyaring pesen. Ora mung bisa nemtokake tingkat nyaring pesen individu kanggo saben appender, nanging uga bisa nyaring pesen miturut paket! Mulane sampeyan kudu nemtokake kelas nalika nggawe logger (Aku ngomong babagan LoggerFactory.getLogger ).

"Tuladhane:"

Log menyang console lan 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 lan 15 - Kita nyetel tingkat nyaring dhewe kanggo saben appender."

"Baris 20-23 - Kita nemtokake jeneng paket lan tingkat panyaring kanggo pesen kasebut. Log4j.logger minangka awalan: jeneng paket disorot warna oranye."

"Tenan? Sampeyan malah bisa nglakoni. Wah, keren!"

"Oalah, log4j utawa slf4j ora kalebu ing JDK. Sampeyan kudu ngundhuh kanthi kapisah. Sampeyan bisa nindakake ing kene . Nanging ana cara liya: "

" Langkah 1 .Tambah impor menyang kelas:"

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

" Langkah 2. Sijine kursor ing baris iki banjur pencet Alt + Enter ing IntelliJ IDEA"

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

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

" Langkah 5. Nemtokake ngendi kanggo ngundhuh perpustakaan (jar)"

" Langkah 6. Gunakake kelas sing sampeyan butuhake."

"Wah! Apa dina iki. Dadi akeh sing anyar lan akeh sing keren!"

"Iki artikel liyane sing apik babagan logging: https://docs.oracle.com/javase/10/core/java-logging-overview.htm#JSCOR-GUID-48004124-2C00-49F7-A640-0C0DDA271DBC "

"Wis, wis cukup. Ayo santai, programmer."