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.
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.
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/: