Bu Kategoriye İçerik Girin veya Soru Sorun

Kategori İçi Sözlük

Bu Sayfayı Paylaş:

Basit Bir Formatter Örneği Console'a Loglama Yapan HelloWorld Örneği Dosya ve Console'a Loglama Yapan HelloWorld Ö.. FileHandler Dosya Adı Deseni (Pattern) Filter Formatter java.util.logging Paketi Java Logging Paketinde Level Değerleri Level Logger LogHandler Loglama İçin System Sınıfını Kullanmayınız LogRecord

java.util.logging Paketi

Tanım: Java 2 platformunda temel loglama işlevleri için geliştirilmiş paket. Bu paket ile dosya ve console'a text veya XML tipinde veriler loglanabilmektedir

Logger

Tanım: Java Logging paketinde loglama için kullanılan ana sınıf

Level

Tanım: Java Logging paketinde , loglamada kayıtları önem derecesine göre seviyelendirip kontrol edebilmek amacıyla kullanılan sınıf. Bir kayıtın önemliden daha az önemliye doğru seviyeleri SEVERE, WARNING, INFO, CONFIG, FINE, FINER ve FINEST'dır. Loglamayı kapatmak için OFF, tüm log seviyelerini desteklemek için ALL değeri kullanılır

LogRecord

Tanım: Bir log kayıtı ile ilgili bilgiyi içeren sınıf. Log framework'ü ile Log'ları işleyen sınıflar (Handler) arasında kullanılmaktadır. Log kayıtının seviyesi (Level), log mesajı, thread id'si, log'u yapan sınıf bilgisi gibi bilgiler içerebilir

LogHandler

Tanım: Logger sınıfından aldığı Log bilgilerini (kayıtlarını) işleyen sınıfların türediği abstract sınıf. Bu sınıftan ConsoleHandler (logları console'da gösterir), FileHandler (logları dosyaya yazar), MemoryHandler (logları hafızaya buffer'lar (yazar)) , SocketHandler (logları bir network socket'ine verir) gibi sınıflar türetilmiştir

Formatter

Tanım: Log kayıtlarını biçimlendirmek (LogRecord sınıfındaki değerlerden bir String üretmek) için kullanılan sınıfların türetildiği abstract sınıf. Bu sınıftan SimpleFormatter (İnsanların anlayabileceği formatta biçimlendirir) ve XMLFormatter (XML formatında biçimlendirir) sınıfları türetilmiştir. Formatter sınıfın türetilerek yeni bir Formatter yaratılabilir

Filter

Tanım: Bir log kayıtının (LogRecord) Logger veya LogHandler tarafından loglanıp loglanmayacağını kod ile karar verebilmek için kullanılan interface. boolean isLoggable(LogRecord record) şeklinde tek bir fonksiyonu vardır ve bu fonksiyondan gelen cevap göre loglama yapılır veya yapılmaz.

Java Logging Paketinde Level Değerleri

Java Logging paketinde level değerleri önemliden önemsize göre aşağıdaki gibidir : 

  • SEVERE : Ciddi bir hata olduğundan tercih edilmeli
  • WARNING : Uyarı için tercih edilmeli
  • INFO : Bilgilendirme amacıyla kullanılmalı
  • CONFIG : Konfigurasyon mesajları için
  • FINE : Bir işlem başarılı olduğunda tercih edilmeli
  • FINER : Başarılı bir işlemde ayrıntılı bir mesaj vermek için tercih edilmeli
  • FINEST : Başarılı bir işlemde en yüksek ayrıntıda bir mesaj vermek için tercih edilmeli

Diğer iki Level ise : 

  • ALL : Tüm mesajların seviyesi ne olursa olsun loglanması için
  • OFF : Loglamayı kapatmak için


FileHandler Dosya Adı Deseni (Pattern)

FileHandler'da logların yazılacağı dosyalar için ibr desen oluşturulabilir. Nomral durumda her yeni dosyada 1, 2, 3 şeklinde numara değeri bir arttırılmak suretiyle devam eder. Dosya ismi için aşağaki ifadeler kullanılabilir :
  • "/" : Local yolu belirtir
  • "%t" : Sistemin (İşletim sistemi) varsayılan temp klasörünü gösterir
  • "%h" : Sistemin (İşletim sistemi) "user.home" özelliğinin belirtir.
  • "%g" : Sürekli artan bir numara verilmesini sağlar
  • "%u" : Herhangi bir dosya ismi kesişmesinde kullanılmak içindir
  • "%%" : Tek bir % işareti için kullanılır.

Örneğin , %t/log%g.log şeklindeki bir desen verildiğinde temp klasörü içinde dosya isimleri log0.log, log1.log, log2.log .. şeklinde devam edecektir

Console'a Loglama Yapan HelloWorld Örneği

Console'a log atan en basit örnek aşağıdaki gibidir:
package com.fibiler.log; 
import java.util.logging.*; 
public class LogHelloWorldTestApp  
{ 
    public static void main( String[] args ) { 
    Logger logger = Logger. 
            getLogger("com.fibiler.log.LogHelloWorldTestApp"); 
    logger.log(Level.INFO, "Hello World"); 
    } 
}
Yukarıdaki çalıştırıldığında console'da aşağıdaki gibi bir görüntü olacaktır :
Nis 27, 2013 3:40:57 PM com.fibiler.log.LogHelloWorldTestApp main
INFO: Hello World

Logger logger = Logger.getLogger("com.fibiler.log.LogHelloWorldTestApp") ile yaratılan Logger için herhangi bir Handler (Console'a , dosyaya veya hafıza gibi başka bir yere yazılması) verilmemiştir. Ancak parent logger varsayılan olarak bir tane ConsoleHandler bulundurur. Her Logger için otomatik olarak bir ConsoleHandler'ı bulunmaktadır. Varsayılan olarak gelen ConsoleHandler ise varsayılan olarak bir SimpleFormatter sınıfını barındırır. SimpleFormatter biçimi yukarıda görülmektedir.

Dosya ve Console'a Loglama Yapan HelloWorld Örneği

Logger varsayılan olarak sadece Console'a loglama yapmaktadır. Bir dosyay loglama yapması için FileHandler eklemek gerekmetedir. Aşağıda örnek görülmektedir :
package com.fibiler.log; 
import java.io.*; 
import java.util.logging.*; 
public class LogHelloWorldToFileTestApp  
{ 
    public static void main( String[] args )
 throws SecurityException, IOException{
        Logger logger = Logger.
getLogger("com.fibiler.log.LogHelloWorldToFileTestApp");
        FileHandler fileHandler=new FileHandler("C:/Log"); 
        logger.addHandler(fileHandler); 
        logger.log(Level.INFO, "Hello World"); 
    } 
}
Yukarıdaki örnekte bir FileHandler yaratılmış ve C içinde Log dosyasına yazılması gerektiği verilmiştir. Uygulama çalıştırıldığında ekranda aşağıdaki gibi çıktı gözükecektir :
Nis 27, 2013 3:52:25 PM com.fibiler.log.LogHelloWorldToFileTestApp main
INFO: Hello World
C sürücüsü içindeki Log dosyası içeriği ise aşağıdaki gibi olacaktır :
<xml version="1.0" encoding="UTF-8" standalone="no"?> 
<!DOCTYPE log SYSTEM "logger.dtd"> 
<log> 
<record> 
  <date>2013-04-27T15:52:25</date> 
  <millis>1367067145281</millis> 
  <sequence>0</sequence> 
  <logger>com.fibiler.log.LogHelloWorldTestApp</logger> 
  <level>INFO</level> 
  <class>com.fibiler.log.LogHelloWorldToFileTestApp</class> 
  <method>main</method> 
  <thread>1</thread> 
  <message>Hello World</message> 
</record> 
</log>
Görüldüğü gibi log XML olarak eklenmiştir.
Eğer uygulama ikinci kez çalıştırılırsa Log dosyasının içeriği silenecek ve tekrar oluşturulacaktır. Bunu engellemek için FileHandler'ın append değerini true yapmak gerekmektedir :
FileHandler fileHandler=new FileHandler("C:/Log",true);

Bu şekilde devamlı Log dosyasına ekleme yapılacaktır. Eğer dosya boyutu belirli bir değere ulaştığında logların yeni bir dosyadan devam edilmesi isteniyorsa FileHandler kurucusunda limit değeri verilebilir. Belirli bir sayıda dosyadan sonraki dosyaların silinmesi içinde count değeri kurucuda verilebilir.

Basit Bir Formatter Örneği

Eğer herhangi bir formatter verilmezse Console'a log aşağıdaki formatta atılır : pre:/listing Nis 27, 2013 5:20:31 PM com.fibiler.log.LogHelloWorldToFileTestApp main INFO: Hello World pre/: Bu format değiştirilebilir. Aşağıda bir formetter örneği görülmektedir : code:/java package com.fibiler.log; import java.io.*; import java.text.*; import java.util.*; import java.util.logging.*; public class LogFormatter extends java.util.logging.Formatter { @Override public String format(LogRecord record) { SimpleDateFormat dateFormat=new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); String formatDate=dateFormat.format(new Date()); StringBuilder sb = new StringBuilder(); sb.append(formatDate).append(" - "). append(formatMessage(record)). append(System.getProperty("line.separator")); if (record.getThrown() != null) { try { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); record.getThrown().printStackTrace(pw); pw.close(); sb.append(sw.toString()); } catch (Exception ex) { ex.printStackTrace(); } } return sb.toString(); } } code/: Bu formatter ile tarih formatı dd.MM.yyyy HH:mm:ss şeklinde yapılmaktadır. Önce tarih yazılmakta ardından mesajın varsayılan biçimlendirmes yapılmakta ve yeni satır karakteri eklenmektedir. Örneğin üç kere peşpeşe HelloWorld yapıldığında eski sistem aşağıdaki gibi basacaktır : pre:/listing Nis 27, 2013 5:24:44 PM com.fibiler.log.LogHelloWorldToFileTestApp main INFO: Hello World Nis 27, 2013 5:24:44 PM com.fibiler.log.LogHelloWorldToFileTestApp main INFO: Hello World2 Nis 27, 2013 5:24:44 PM com.fibiler.log.LogHelloWorldToFileTestApp main INFO: Hello World3 pre/: Yeni yapılan LogFormatter aşağıdaki örnekte görüldüğü gibi set edilebilir : code:/java package com.fibiler.log; import java.io.*; import java.util.logging.*; public class LogHelloWorldToFileTestApp { public static void main( String[] args ) throws SecurityException, IOException { Logger logger = Logger. getLogger("com.fibiler.log.LogHelloWorldTestApp"); FileHandler fileHandler=new FileHandler("C:/Log",true); logger.addHandler(fileHandler); ConsoleHandler consoleHandler=new ConsoleHandler(); consoleHandler.setFormatter(new LogFormatter()); logger.setUseParentHandlers(false); logger.addHandler(consoleHandler); logger.log(Level.INFO, "Hello World"); logger.log(Level.INFO, "Hello World2"); logger.log(Level.INFO, "Hello World3"); } } code/: Yeni bir ConsoleHandler yaratılıp formatter olarak daha önce yarattığımız formatter verilmektedir. setUseParentHandlers ile üst sınıfın console handler'ı devre dışı bırakılmıştır. Yukarıdaki örnek çalıştırıldığında ise aşağıdaki gibi bir ekran görüntüsü olacaktır : pre:/listing 27.04.2013 17:25:44 - Hello World 27.04.2013 17:25:44 - Hello World2 27.04.2013 17:25:44 - Hello World3 pre/: Örneğin Level bilgisi aşağıdaki gibi bir kod değişikliğiyle eklenebilir : code/:java sb.append(formatDate).append(" - "). append(record.getLevel()).append(" - "). append(formatMessage(record)). append(System.getProperty("line.separator")); code/: Bu ekleme yaptıktan sonra aşağıdaki gibi görülecektir: pre:/listing 27.04.2013 17:28:51 - INFO - Hello World 27.04.2013 17:28:51 - INFO - Hello World2 27.04.2013 17:28:51 - INFO - Hello World3 pre/:

Loglama İçin System Sınıfını Kullanmayınız

Loglama amaçlı hiç bir zaman System.out veya System.err kullanmayınız. Permormans düşükliğü, kolay bir şekilde açılıp kapanamaması , loglama seviyesininin olmaması vb.. nedenlerde kullanılmamalıdır.

Basit Bir Formatter Örneği Console'a Loglama Yapan HelloWorld Örneği Dosya ve Console'a Loglama Yapan HelloWorld Ö.. FileHandler Dosya Adı Deseni (Pattern) Filter Formatter java.util.logging Paketi Java Logging Paketinde Level Değerleri Level Logger LogHandler Loglama İçin System Sınıfını Kullanmayınız LogRecord



Bu Sayfayı Paylaş:

İletişim Bilgileri

Takip Et

Her Hakkı Saklıdır. Bu sitede yayınlanan tüm bilgi ve fikirlerin kullanımından fibiler.com sorumlu değildir. Bu sitede üretilmiş , derlenmiş içerikleri, fibiler.com'u kaynak göstermek koşuluyla kendi sitenizde kullanılabilirsiniz. Ancak telif hakkı olan içeriklerin hakları sahiplerine aittir