Log4j Konfigürasyon

Apache log4j şu yazıda da bahsettiğim gibi bir loglama mekanızmasıdır ve bize şu soruların cevaplarını verir;

  1. Kim?
  2. Ne?
  3. Ne zaman?
  4. Nerede?

Şimdi bilmemiz gereken temel kavramlardan biraz bahsetmenin zamanıdır.

Log Seviyeleri (LEVELS)
TRACE,
DEBUG,
INFO,
WARN,
ERROR,
FATAL olmasına rağmen, kendi log seviyenizi de yazabilirsiniz ama önerilmediğini de belirteyim.

Seviyeler arasındaki sıralama da şu şekilde DEBUG < INFO < WARN < ERROR < FATAL. Bu sıralamanın ne işe yaradığını aşağıdaki örnekte daha iyi anlayacağız.

Log Yazıcılar (APPENDERS)
Logları çeşitli ortamlara yazmak mümkün, aşağıda birkaçının adı var. Ben, daha çok dosyaya ve console ortamına yazıyorum.

  • FileAppender
  • ConsoleAppender
  • SocketAppender
  • SyslogAppender
  • NTEventLogAppender
  • SMTPAppender

Düzen (LAYOUTS)
Logun nasıl görüneceğine dair bilgileri içerir; zaman logun neresinde yazsın, hangi metod olduğu neresinde vb.

Kısaltma Anlamı
%r Loglama başlayana kadar ne kadar zaman harcandı.
%t Loglama olayını üreten thread’in ismi.
%p Logun seviyesi.
%c Logun kategorisi yani üretildiği sınıfın paket bilgisi vb.
%x Logun bazı kontrolleri için.
%m Mesaj
%n Yeni satıra geçmek için.
%L Hangi satırda olduğu bilgisi.
%d Logun üretildiği zaman.

Şimdi bu kadar teorik bilgi ile çalışan bir uygulama yapacağım. Projemin altına “config” adında bir klasör açıyorum altına da “log4j.xml” adını verdiğim aşağıdaki dosyayı hazırlıyorum.

[xml]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//LOGGER" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration>

<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %5p %c{1}:%L – %m %n" />
</layout>
</appender>

<root>
<appender-ref ref="stdout" />
</root>

</log4j:configuration>
[/xml]

Şimdi yukarıdaki xml’i biraz açıklayayım; Program bu xml’i okumaya başlarken önce root altına bakar ve bir appender arar ki oraya log’u yazabilsin. Bizimkinin stdout isminde bir tane var, gider onu appenderlar arasında bulur, bizimkinin ConsoleAppender yani console’a yazan bir appender olduğunu anlar, pattern‘ine göre appender üzerine yazar. Hikaye bu şekilde 🙂

Şimdi de pattern’i biraz açalım;

  • %d – Çalışma zamanını göster (herhangi bir formatter vermedim ama yaylı parantezler içinde istediğiniz date format patterni yazabilirsiniz)
  • [%t] – Hangi metodun çalıştığını göster, “[” ve “]” karakterleri arasına al.
  • %5p – Logun seviyesini göster.
  • %c{1} – Logun kategorisini 1. seviyeye kadar göster. (Bir de kaldırıp deneyin 🙂 )
  • %L – Hangi satırın çalıştığını göster.
  • %m – Mesajı yaz.
  • %n – Yeni gelen mesajı bir alt satırda yaz.

Şimdi log4j’yi kullanalım. Önce bir sınıf yazalım.

[java]
package org.sukru.log4j;

public class Student {

private Long studentNumber;
private String firstName;
private String lastName;

public Student(Long studentNumber, String firstName, String lastName) {
this.studentNumber = studentNumber;
this.firstName = firstName;
this.lastName = lastName;
}
// getters and setters
}
[/java]

Log4j için test sınıfımız.

[java]
package org.sukru.log4j;

import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;

public class Log4jTest {

private static Logger logger;

public static void main(String[] args) {
configureLog4j(); //log4j’yi ayağa kaldırması için bu metodu yazdım.
logger.info("Initializing a new Student…");
Student student = new Student(100L, "Tuncay", "Uzun");
logger.info("new Student initialized: "+student.getFirstName()+" "+student.getLastName());
}

private static void configureLog4j() {
DOMConfigurator.configureAndWatch("config/log4j.xml"); //log4j konfigürasyon dosyasının projedeki yerini veriyoruz.
logger = Logger.getLogger(Log4jTest.class);
}
}
[/java]

Bakalım nasıl bir log elde ettik – bence gayet açıklayıcı- 🙂

[shell]

2011-06-27 14:42:19,507 [main] INFO Log4jTest:12 – Initializing a new Student…
2011-06-27 14:42:19,511 [main] INFO Log4jTest:14 – new Student initialized: Tuncay Uzun

[/shell]

Şimdi xml dosyası ile biraz oynayalım ve root altına şu ifadeyi yazarak log seviyemizi info dan daha az kapsamlı warna çekelim. (Yukarıda sıralamasını yazmıştım 😉 )
[xml]<level value="warn" />[/xml]
Şimdi tekrar çalıştırırsak, herhangi bir log yazmadığını görürüz 🙂 Yani xml deki tek bir ifade ile tüm projedeki log seviyesini warn yaptık ve bizim info olara baktıklarımızın loga yazılmasını engelledik, varsa eğer warn ve üzeri ifadeler görülecek 😉

Kolay gelsin.

Java, Logging kategorisine gönderildi | , , , , ile etiketlendi | 3 Yorum

Apache log4j

Apache loj4j Java tabanlı bir log (sistem günlüğü) tutma mekanizmasıdır. Sektörde sevilir, kullanışlıdır. Projelere entegre edilmesi ve kullanması da kolay sayılabilir.
Apache log4j
Yapmamız gerekenler;

  • jar dosyasını indirip projemizin kütüphaneleri arasına eklemek
  • projemizin build path’ine bu jarı göstermek.

Bu adımlardan sonra log4j ile çalışmaya hazırız. Örnek olması açısından bir “Student” sınıfı yazıp, onu loglamaya çalışacağım. Uygulama çok temek olacak, hatta o kadar temel olacak ki, normalde 2 çeşit log4j ayarlama yolu var;

  1. property file hazırlayarak
  2. XML dosyası hazırlayıp

fakat ben log4j’nin sağlamış olduğu “BasicConfigurator” sınıfının “configure()” metodu yardımıyla herhangi bir dosya kullanmadan log4j’i ayağa kaldıracağım.
[java]
package org.sukru.log4j;

public class Student {

private Long studentNumber;
private String firstName;
private String lastName;

public Student(Long studentNumber, String firstName, String lastName) {
this.studentNumber = studentNumber;
this.firstName = firstName;
this.lastName = lastName;
}
// getters and setters
}
[/java]

Loj4j’yi ayağa kaldırıp, kullandığımız test sınıfımızı da yazalım.

[java]
package org.sukru.log4j;

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;

public class Log4jTest {

public static void main(String[] args) {
BasicConfigurator.configure(); // log4j’yi ayağa kaldıralım.
Logger logger = Logger.getLogger(Student.class); // hangi sınıfı takip edeceğimizi belirtelim.
logger.info("Initializing new Student…");
Student student = new Student(100L, "Yunus Emre", "Aslan");
logger.info("new Student initialized: "+student.getFirstName()+" "+student.getLastName());
}
}
[/java]

Bu sınıfı çalıştırdığımız zaman çıktısı şu şekilde olacaktır.

[shell]
0 [main] INFO org.sukru.log4j.Student – Initializing a new Student…
2 [main] INFO org.sukru.log4j.Student – new Student initialized: Yunus Emre Aslan
[/shell]

Bilgi amaçlı “info(Object message)” metodunu kullandım ama isteğe ve amaca göre şu metodlar kullanılabilir;

  • fatal()
  • error()
  • warn()
  • debug()
  • trace()
  • info()

Diğer yapılandırma usüllerini başka bir yazıda anlatacağım. Giriş için bunun yeterli olacağını düşünüyorum. Kolay gelsin.

Java, Logging kategorisine gönderildi | , , , ile etiketlendi | 4 Yorum

XStream – Java to XML, XML to Java

 

 

Java nesnesinin XML çıktısını almak ya da XML olarak verdiğimiz bilgiyi Java nesnesine çevirmek için kullanabileceğimiz çok şık bir kütüphane. http://xstream.codehaus.org/ adresinde ikamet ediyor.

Yapılması gereken gayet basit, ilgili jarları indirip projemizin kütüphaneleri arasına ekliyoruz.

Kütüphanenin kullanımını anlaşılmasını kolaylaştırmak için “Ders” ve “Ogretmen” isimli iki nesne üzerinden aşağıda anlattım, kodları siz de kendi ortamınızda çalıştırabilirsiniz.

[java title=”<strong>Ders sınıfı</strong>”]
package org.sukru.xstream.entity;

public class Ders {

public Long id;
public String ad;
public Ogretmen ogretmen;

public Ders(Long id, String ad, Ogretmen ogretmen) {
this.id = id;
this.ad = ad;
this.ogretmen = ogretmen;
}
//getters and setters
}

[/java]

[java title=”<strong>Ogretmen sınıfı</strong>”]
package org.sukru.xstream.entity;

public class Ogretmen {

public String ad;
public String soyad;

public Ogretmen(String ad, String soyad) {
this.ad = ad;
this.soyad = soyad;
}
//getters and setters

@Override
public String toString() {
return "Ogretmen [ad=" + ad + ", soyad=" + soyad + "]";
}
}

[/java]

[java title=”<strong>XStream'i kullanmaya başlayalım…</strong>”]
package org.sukru.xstream.test;

import org.sukru.xstream.entity.Ders;
import org.sukru.xstream.entity.Ogretmen;

import com.thoughtworks.xstream.XStream;

public class XStreamTest {
public static void main(String[] args) {
// Yeni bir öğretmen üretelim.
Ogretmen ogretmen = new Ogretmen("Yasin", "Kenar");
// Yeni bir ders üretip öğretmenini belirtelim.
Ders ders = new Ders((Long) 1L, "Software Engineering", ogretmen);

// XStream sihiri şimdi başlıyor.
XStream xstream = new XStream();
xstream.alias("Ders", Ders.class); // Ders sınıfı için bir isim verdik,
// yoksa paket isimlerini de dahil
// ediyor.
String xml = xstream.toXML(ders); // ders nesnesini xml’e çevir diyoruz.
// Bakalım nasıl bir xml ürettik.
System.out.println(xml);

// Şimdi de oluşan xml i verip nesne alalım.
Ders xmldenDers = (Ders) xstream.fromXML(xml);
System.out.println("\n XML den Ders: "+xmldenDers.getId()+" – "+xmldenDers.getAd()+" – "+xmldenDers.getOgretmen().toString());
}
}
[/java]

ve XML çıktısı da aşağıdaki gibi oluyor.

[xml]
<Ders>
<id>1</id>
<ad>Software Engineering</ad>
<ogretmen>
<ad>Yasin</ad>
<soyad>Kenar</soyad>
</ogretmen>
</Ders>
[/xml]

XML’den oluşturduğumuz nesneyi konsola bastırdığımız zaman aşağıdaki gibi olduğunu görürüz.
[plain]XML den Ders: 1 – Software Engineering – Ogretmen [ad=Yasin, soyad=Kenar][/plain]

Java, XML kategorisine gönderildi | , , , ile etiketlendi | 5 Yorum

Concurrency – Aynı Anda Kullanım

Java’da “Concurrency” yani “Aynı Anda Kullanım” kavramı, aynı zamanda birden fazla iş yapmak gerektiği zaman kullanılır.

İki temel işlemi vardır;

  1. Processes
  2. Threads

Aslında hemen akla “Threads” gelir. Her bir “thread” başlıbaşına bir “process”tir. Yeni bir “thread” başlatmanın 2 tür yolu var; birincisi “Runnable” arayüzünden türetmek, ikincisi “Thread” nesnesinin alt sınıfı yapmak. Aşağıda 2 örnek de mevcut;

[java title=”<strong>1. Provide a Runnable object</strong>”]
public class HelloRunnable implements Runnable {

@Override
public void run() {
System.out.println("Hello from a thread!");
}

public static void main(String args[]) {
Thread t = new Thread(new HelloRunnable());
t.start();
System.out.println("ID: "+ t.getId());
System.out.println("NAME: "+ t.getName());
}
}
[/java]

[java title=”<strong>2. Subclass of Thread</strong>”]
public class HelloThread extends Thread {

public void run() {
System.out.println("Hello from a thread!");
}

public static void main(String[] args) {
(new HelloThread()).start();

}
}
[/java]

Her iki örnekte de görüldüğü üzere “Thread.start()” ifadesi ile thread çalışmaya başlıyor. Thread çalışmaya başlayınca “run()” metodunu tetikliyor.

Not: http://download.oracle.com/javase/tutorial/essential/concurrency/index.html adresinden faydalanılmıştır.

Concurrency, Java kategorisine gönderildi | , , ile etiketlendi | Yorum yapın