Apache Log4j in Java

Geliştirdiğiniz bir uygulamada kullanıcı, backend ile ilgilienen sorumlu insanlara veya kendinize uygulama hakkında bilgi vermek isteyebilirsiniz. Daha edebi olarak; Uygulama bir hikaye olduğunu varsayarsak, bu hikayede neler yaşandı bilmek isterseniz.

Log basımında Java EE platformunda gelen birkaç yöntem var. Log yönetimi ve elverişlilik bakımından ben bunları pek tercih etmiyorum.

Bunlardan birisi System class’ ı altında System.out.println/print()  yöntemi. Bu yöntemde server’ in console çıktısına seri olarak log yazılır. Yani server’ in bir web sayfasına ait olduğunu varsayalım. Kullanıcı girişi loglanıyor olsun. Aynı anda 1000 kullanıcı login olduğunda bu yöntemde tek bir System.out.println/print() satırının 0.00001 ms sürdüğünü varsayarsak 0.00001*1000 zamanlık bir bekleme süresi olacak. Çünkü bahsettiğim gibi seri çalışan bir yapı. Aynı anda 1.000.000.000 login loglanacak olursa bu süreç 1.000.000.000*0.00001 süresi demek ki bu da kullanıcıya epey bir bekleme süresi oluşturur.

e değişkeni bir exception class olduğunu varsayarsak e.printStackTrace() yöntemi trace loglarını basarken paralel bir davranış sergiliyor. Az önceki yaptığımız hesaplama işlemi bu yapıda şu şekilde olacak: 1000 kişi login olurken hata alıyorsa bekleme süresi 1*0.00001ms olacaktır. Bu da farkedilmez bir süreçtir.

Yani exception bilgilerini 2.yöntemle basmak daha mantıklı 🙂

Bazen logları kendiniz yönetmek istersiniz. Saat ve tarih formatları şu şekilde olsun, an itibariyle info loglarını kapatıyım veya trace leri kapatıyım demek istersiniz. Bu yazıyı yazmamdaki amaçta tam olarak buydu, konu konuyu açtı.

Java için bir hayli log yönetim jar’ ları var fakat ben projelerimde kullandığım  ve aralarında en meşhurunu anlatmak istiyorum: Apache nin geliştirdiği log4j (log four jiy)

Özellikleri: Paralel çalışma mekanizmasına sahip. Yönetimi kolay. Entegresi çok basit. Çok performanslı. Detayları için google search yapabilirsiniz.

Maven bir java projesi için: bkz(https://mvnrepository.com/artifact/log4j/log4j)

Yukarıdaki linkten pom.xml in dependecy’ lerine ekleyip update snapshot yaparsanız ilgili jar maven library’ nize inecektir.

[code languange=”java”]

<!– https://mvnrepository.com/artifact/log4j/log4j –>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>

[/code]

Eğer projeniz maven değilse external jar olarakta ekleyebilirsiniz.

Sonraki adım. Bir adet .properties dosyası oluşturmanız. İsmini log4j ile adlandırmanız lazım. (Bu dosyayı java kodu ile bir kere çalıştırıp projenizin bulunduğu resources alanına generate ettirebilir ve ilgili configurasyonları jar ın kendisine yaptırabilirsiniz. Ben çok basit anlamda manuel olarak anlatacağım.)

oluşturduğunuz log4j.properties dosyasının içerisine açağıdaki satırı yapıştırınız.

[code languange=”xml”]

# Logging level
# Root logger option
#log4j.rootLogger=DEBUG, stdout, file
log4j.rootLogger=ALL, stdout, file

# Redirect log messages to console
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} %-5p %c{1}:%L – %m%n

# Redirect log messages to a log file, support file rolling.
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=c:/project/resources/t-output/log4j-application.log
log4j.appender.file.MaxFileSize=5MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L – %m%n

[/code]

En başlardaki

#log4j.rootLogger=DEBUG, stdout, file
log4j.rootLogger=ALL, stdout, file

satırları debug modunda ve standart yöntem ile out yaparak server a atıldığında bir file log basacağını belirtiyor. Ben bunu # ile comment e alıp sadece debug tanımlıları değil tüm logları basmasını istedim. (trace)

Lafı daha fazla uzatmadan log4j kullanımı:

[code languange=”java”]

package com.services;

import org.apache.log4j.Logger;

public class AppMain {
static Logger logger=Logger.getLogger(AppMain.class);//log un basilacagi class in tanimi
public static void main(String[] args) {
logger.error("hata!");
logger.info("bilgi!");
logger.trace("trace");
logger.warn("uyari");
logger.fatal("fatal");
}
}

[/code]

 

output:

[code languange=”xml”]

2018-10-30 17:52:41 ERROR AppMain:8 – hata!
2018-10-30 17:52:41 INFO AppMain:9 – bilgi!
2018-10-30 17:52:41 TRACE AppMain:10 – trace
2018-10-30 17:52:41 WARN AppMain:11 – uyari
2018-10-30 17:52:41 FATAL AppMain:12 – fatal

[/code]

 

Log4j ile weblogic, tomcat vb. serverlarda servername.log veya benzeri bir dosyaya yazdığınız logları basabilirsiniz.

Selamlar,

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir