"Ah, işte buradasın! Bugün başka bir dersimiz olduğunu hatırladın mı?"

"Hayır, sadece seni arıyordum. Neredeyse..."

"Harika, o zaman başlayalım. Bugün size günlük kaydından bahsetmek istiyorum."

"Günlük, meydana gelen olayların bir listesidir. Neredeyse bir geminin günlüğü veya günlüğü gibi. Veya Twitter - belki bununla daha iyi ilişki kurabilirsiniz. Şaşırtıcı olmayan bir şekilde, bir kaydedici, günlük kaydı için kullandığınız bir nesnedir."

"Programlamada, neredeyse her şeyi günlüğe kaydetmek adettendir. Java'da ise her şeyi ve hatta biraz daha fazlasını günlüğe kaydederiz."

"Gerçek şu ki, Java programları genellikle bir kullanıcı arayüzü, konsol vb.

"Aslında, bu koşullarda nadiren tekrarlanabilen hataları ve hataları aramanın tek yolu, her iş parçacığında olan her şeyi günlüğe kaydetmektir."

"Çoğu zaman, günlük, yöntem bağımsız değişkenleri, yakalanan hatalar ve birçok ara bilgi hakkında bilgi içerir."

"Günlük ne kadar eksiksiz olursa, bir dizi olayı yeniden oluşturmak ve arızaların veya hataların nedenlerini izlemek o kadar kolay olur."

"Bazen günlükler günde birkaç gigabayta ulaşır. Bu normaldir."

"Birkaç gigabayt mı? O_o"

"Evet. Çoğu zaman, günlük dosyaları, ilgili tarih belirtilerek otomatik olarak arşivlenir."

"Vay."

"Hı hı. Başlangıçta Java'nın kendi günlüğü yoktu. Sonuç olarak, birkaç bağımsız günlükçü yazıldı. Bunlardan en yaygın olanı log4j idi."

"Birkaç yıl sonra, Java'nın kendine ait bir kaydedicisi oldu, ancak işlevselliği çok düşüktü ve yaygın olarak kullanılmıyordu."

"Java'nın resmi bir kaydediciye sahip olduğu bir gerçektir , ancak tüm Java programcıları topluluğu diğer günlükçüleri kullanmayı tercih eder. "

"Daha sonra, log4j'ye dayalı olarak birkaç günlükçü daha yazıldı."

"Ardından, artık yaygın olarak kullanılan özel evrensel kaydedici slf4j hepsi için yazılmıştır. Log4j'ye çok benzer, bu nedenle günlük kaydını açıklarken örnek olarak kullanacağım."

"Günlüğe kaydetme işleminin tamamı üç bölümden oluşur."

" Önce bilgi topla."

" İkinci olarak , toplanan bilgileri filtreleyin."

" Üçüncüsü , seçilen bilgileri kaydedin."

"Koleksiyonla başlayalım. İşte günlük tutan tipik bir sınıf örneği:"

Günlük kaydı olan sınıf
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.compleate();
   return true;
  }
  catch(Exception e)
  {
   logger.error("Unknown error", e);
   return false;
  }
 }
}

"Kırmızı ile vurgulanan kelimelere dikkat edin."

" 3. Satır – Günlükçü nesnesini  oluşturun . Böyle statik bir nesne hemen hemen her sınıfta oluşturulur! Veri depolamaktan başka bir şey yapmayan sınıflar hariç."

" LoggerFactory, kaydedici oluşturmak için özel bir sınıftır ve getLogger, bunun statik yöntemlerinden biridir. Geçerli nesne genellikle iletilir, ancak çeşitli seçenekler mümkündür."

" Satır 7 – Metod çağrısı ile ilgili bilgiler günlükçüye yazılır. Bunun metodun ilk satırı olduğuna dikkat edin. Metot çağrıldığı anda bilgileri hemen günlüğe yazarız."

"Debug yöntemini diyoruz, yani bilginin önemi DEBUG seviyesinde. Bu filtreleme için kullanılıyor. Bunu size birkaç dakika içinde anlatacağım."

" Satır 17 – Bir istisna yakalıyoruz ve... bunu hemen günlüğe yazıyoruz! Yapılması gereken de tam olarak bu."

"Bu sefer, bilginin ERROR düzeyinde olduğunu hemen gösteren error yöntemini çağırıyoruz"

Kaydedici - 1

"Şimdilik her şey açık görünüyor. Eh, konuşmamızın ortasında netleşebildiği kadarıyla."

"Harika, o zaman mesaj filtrelemeye geçelim."

"Genellikle, her günlük iletisinin kendi önem düzeyi vardır ve bu düzeyi bazı iletileri silmek için kullanabilirsiniz. Bahsettiğim önem düzeyleri şunlardır:"

Önem düzeyi Tanım
TÜM Tüm mesajlar
İZ Ayrıntılı hata ayıklama mesajları
HATA AYIKLAMA Önemli hata ayıklama mesajları
BİLGİ bilgi mesajları
UYARMAK uyarılar
HATA Hatalar
ÖLÜMCÜL Önemli hatalar
KAPALI Mesaj yok

Bu düzeyler, iletileri filtrelerken de kullanılır.

Günlük düzeyini WARN olarak ayarladığınızı varsayalım. Ardından, WARN'den daha az önemli olan tüm mesajlar atılacaktır: TRACE, DEBUG, INFO.

Filtreleme seviyesini FATAL olarak ayarlarsanız, HATA mesajları bile atılacaktır.

"Filtreleme sırasında kullanılan iki önem düzeyi daha vardır: KAPALI, tüm mesajları atar; ve TÜM, tüm mesajları gösterir (hiçbir şey atılmaz).

"Filtrelemeyi nasıl ve nerede kurarım?"

"Daha fazla uzatmadan anlatacağım."

"Genellikle, log4j kaydedici ayarları log4j.properties dosyasında belirtilir."

Bu dosyada birden çok ek nesne belirtebilirsiniz. Veriler bu nesnelere yazılır. Veri kaynakları vardır ve zıt amaçları olan nesneler olan ekleyiciler vardır. Verilerin su gibi aktığı nesneler.

"İşte bazı örnekler:"

Konsolda oturum açma
# 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}

1. ve 4. satırlar – Bunlar yorumlardır

Satır 2 – İstediğimiz loglama seviyesini belirtiyoruz. Tüm daha az önemli düzeyler (DEBUG, TRACE) atılacaktır.

Aynı yere bir virgül ekliyor ve ardından logun yazılacağı (kendimiz bulduğumuz) nesnenin adını belirtiyoruz. 5-9 satırları ayarlarını içerir.

Satır 5 – Ekleyicinin türünü belirtiyoruz ( ConsoleAppender ).

Satır 6 – Tam olarak nereye yazdığımızı belirtiyoruz ( System.out. ).

7. Satır – Dönüşüm kalıplarını yönetecek sınıfı (PatternLayout) ayarlıyoruz.

Satır 8 – Yazmak için kullanılacak dönüştürme modelini belirliyoruz. Yukarıdaki örnekte tarih ve saattir.

"Ve işte bir dosyaya yazmak şöyle görünür:"

Bir dosyaya kayıt
# 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

"2. Satır, mesaj filtreleme düzeyini ve ek nesnenin (havuz) adını ayarlar."

"Satır 5 – Dosya ekleyici türünü ( RollingFileAppender ) belirtiyoruz ."

"6. Satır - Günlüğün yazılacağı dosyanın adını belirtiyoruz."

"7. Satır - Maksimum günlük boyutunu belirtiyoruz. Bu boyut sınırı aşıldığında yeni bir dosya oluşturulur."

"Satır 8 – Saklanacak eski günlük dosyalarının sayısını belirtiyoruz."

"Satır 9-10 – Dönüştürme modelini ayarlayın."

"Burada neler olduğunu bilmiyorum ama tahmin edebiliyorum. Bu cesaret verici."

"Bu harika. O zaman işte bir dosyaya ve konsola nasıl günlük yazılacağına dair bir örnek:"

Konsolda ve bir dosyada oturum açma
# 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, yani bunu yapabilir misin? Bu harika!"

"Evet. İstediğiniz kadar ek bildirebilir ve her birini özelleştirebilirsiniz."

Ayrıca, her ekleyici, mesaj filtreleme için çok esnek ayarlara sahip olabilir. Her bir ekleyiciye yalnızca ayrı bir mesaj filtreleme düzeyi atayamayız, aynı zamanda mesajları pakete göre de filtreleyebiliriz! Bu yüzden bir kaydedici oluştururken bir sınıf belirtmeniz gerekir ( LoggerFactory.getLogger'dan bahsediyorum ).

"Örneğin:"

Konsolda ve bir dosyada oturum açma
# 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

"6. ve 15. Satırlar - Her bir ekleyici için kendi filtreleme düzeyimizi belirliyoruz."

"Satır 20-23 – Paket adını ve mesajları için filtreleme seviyesini belirtiyoruz. Log4j.logger bir önek: paket adı turuncu renkle vurgulanmıştır."

"Gerçekten mi? Bunu bile yapabilirsin. Harika!"

"Bu arada, ne log4j ne de slf4j JDK'ya dahil değil. Bunları ayrı olarak indirmen gerekecek. Bunu buradan yapabilirsin . Ama başka bir yol daha var:"

" 1. Adım .Sınıfa ithalat ekleyin:"

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

" 2. Adım . İmleci bu satırların üzerine getirin ve IntelliJ IDEA'da Alt+Enter tuşlarına basın"

" 3. Adım . 'Web'de dosya kavanozu» menü öğesini seçin.

" 4. Adım . 'slf4j-log4j13.jar'ı seçin"

" 5. Adım . Kitaplığın (jar) nereye indirileceğini belirtin"

" 6. Adım . İhtiyacınız olan sınıfları kullanın."

"Vay canına! Ne gündü bugün. O kadar çok yeni ve o kadar çok harika!"

"Günlüğe kaydetmeyle ilgili başka bir güzel makale: https://docs.oracle.com/javase/10/core/java-logging-overview.htm#JSCOR-GUID-48004124-2C00-49F7-A640-0C0DDA271DBC "

"Pekala, bu kadar yeter. Rahatla, programcı."