Java JSF ile Log4j Loglama Kullanımı (Proje Örnek Uygulama)

Java JSF ile Log4j Loglama Kullanımı (Proje Örnek Uygulama)

Log4j ve Loglama nedir ?

Loglama kısaca  bir projedeki uygulama geçmişini takip etmektir.Uygulamada arkaplanda çalışan her adımı her zaman görmek istemeyebiliriz.Bazen çok detay bilgiler gereklidir hata tespiti için bazen sadece hata oluştuğu sürece log görmek yeterlidir.Bunun için loglama yaparken log seviyelerini ayarlamak gereklidir.
Log4j Java’da yazılmış, Apache Yazılım Lisansı altında paylaşılan; hızlı, güvenilir ve esnek bir loglama framework’üdür. Java dışında C, C++, C#, Perl, Python, Ruby, and Eiffel dillerine de taşınmıştır.

Log Seviyeleri

Log4j Kütüphanesi Log Seviyeleri
Log Seviyeleri

Görselden anlaşılacağı gibi logların seviyesini belirleyip ona göre istediğimiz seviye logları kaydedebiliriz.

Log Yazıcılar(Appenders)

Loglama bilgilerini veritabanı,dosya,console vb. gibi istenilen yerde çıktı alınmasını sağlar.Ben örnek projemde FileAppender ve ConsoleAppender beraber kullandım.

Log Düzeni(Layouts)

Loglama yaparken detay bilgileri vermek için (Tarih saat,log atılan sınıf,Log seviyesi) belirli bir düzen verebiliriz.Log çıktısının düzenlenmesi olarak düşünebilriz.

Kısaltma Anlamı
%r Loglama başlayana kadar ne kadar zaman harcandı.
%t Loglama olayını üreten thread’in ismi.
%p Logun seviyesi.
%c  c(1) getLogger() ile ayarladığımız loglama adı.örneğin HelloBean
%x Logun bazı kontrolleri için.
%m Mesaj içeriği
%n Mesaj içeriği geldiğinde alt satıra geç
%L Hangi satırda olduğu bilgisi.
%d Logun üretildiği zaman. {yaylı parantez içinde format verilebilir}

Ben yazımda şu formatı kullandım

<param name="ConversionPattern" value="%d [%-5p] [%t] ..%-40c{3}:%L - %m%n" />
 

Çıktı bu şekilde

2017-09-05 15:07:24,783 [FATAL] [http-nio-8083-exec-4] ..bean.HelloBean :36 – Bu bir FATAL mesajı

 

Loglama Örnek Proje

Önceki derslerde HelloPrimefaces yapmıştık.(Yazıyı Oku)
Bu projeyi indirebilir yada adımları takip ederek oluşturabilirsiniz.

Projemiz oluştuktan sonra su şekilde güncelleyelim.

Pom XML

Öncelikle log4j kütüphanesini ekledim.

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

Pom xml son hali

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.atakancoban</groupId>
	<artifactId>hellojsf</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	<name>Hello JSF</name>



	<!-- PrimeFaces Repository -->
	<repositories>
		<repository>
			<id>prime-repo</id>
			<name>Prime Repo</name>
			<url>http://repository.primefaces.org</url>
		</repository>
	</repositories>






	<!-- JSF Dependency -->
	<dependencies>
		<dependency>
			<groupId>com.sun.faces</groupId>
			<artifactId>jsf-api</artifactId>
			<version>2.2.14</version>
		</dependency>
		<dependency>
			<groupId>com.sun.faces</groupId>
			<artifactId>jsf-impl</artifactId>
			<version>2.2.14</version>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
		</dependency>


		<!-- Primefaces -->
		<dependency>
			<groupId>org.primefaces</groupId>
			<artifactId>primefaces</artifactId>
			<version>6.0</version>
		</dependency>

		<!-- PrimeFaces Theme -->
		<dependency>
			<groupId>org.primefaces.themes</groupId>
			<artifactId>all-themes</artifactId>
			<version>1.0.10</version>
		</dependency>

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


	</dependencies>

	<!-- Build Maven WAR -->
	<build>

		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.6.2</version>
				<configuration>
					<!-- Java version -->
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
		</plugins>

	</build>




</project>

Log4j Config Xml

Log4jConfig dosyasında Appender olarak File ve Console belirttim.
Çıktı formatını yukarıda gösterdiğim şekilde kendi isteğime göre ayarladım.
<root>tagleri arasında log seviyesini ve appenderlarımı tanımladım.

 


<?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="console" class="org.apache.log4j.ConsoleAppender">
		<param name="Target" value="System.out" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%d [%-5p] [%t] ..%-40c{3}:%L - %m%n" />
		</layout>
	</appender>

	<appender name="file" class="org.apache.log4j.FileAppender">
		<param name="File" value="log/atakancoban.log" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%d [%-5p] [%t] ..%-40c{3}:%L - %m%n" />
		</layout>
	</appender>

	<root>
		<level value="all" />
		<appender-ref ref="file" />
		<appender-ref ref="console" />
	</root>

</log4j:configuration>

Logger Tanımlanması

Logger xml dosyamı sayfa açılırken init() metodu içinde configure metoduna yolladım.Burada src/main/webapp/WEB-INF/log4jconfig.xml
şeklinde bir path verdim bu yol tomcat serverınızdaki çalışma ortamına göre değişir ben proje klasörünü launch configuration olarak seçmiştim. Bu ayarı bu yazımda anlatmıştım Tomcat Launch Configuration ile çalışma ortamı ayarlanması kısmı.

 
private static void loadLog4jConfig() {
		DOMConfigurator.configureAndWatch("src/main/webapp/WEB-INF/log4jconfig.xml");
		logger= Logger.getLogger(HelloBean.class);
	}

Butona basıldığında örnek loglar yazdırdım

 
public void onClick() {
		System.out.println("bu mesaj > system.out.print");
		logger.trace("Bu bir TRACE mesajı ");
		logger.debug("Bu bir DEBUG mesajı ");
		logger.info("Bu bir INFO mesajı ");
		logger.warn("Bu bir WARN mesajı ");
		logger.error("Bu bir ERROR mesajı ");
		logger.fatal("Bu bir FATAL mesajı ");
		
		exceptionTest();//örnek exception oluşturdum.ERROR seviyesinde log olarak bastım

	}

Hello Bean son hali

package bean;

import java.io.Serializable;
import java.util.ArrayList;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

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

@ManagedBean
@SessionScoped
public class HelloBean implements Serializable {

	private static final long serialVersionUID = -4823295172962937652L;

	static Logger logger;
	private String message = "www.atakancoban.com";

	@PostConstruct
	public void init() {
		// Log4j kütüphanemizi etkinleştir
		loadLog4jConfig();
		System.out.println("init()");
	}

	public void onClick() {
		System.out.println("bu mesaj > system.out.print");
		logger.trace("Bu bir TRACE mesajı ");
		logger.debug("Bu bir DEBUG mesajı ");
		logger.info("Bu bir INFO mesajı ");
		logger.warn("Bu bir WARN mesajı ");
		logger.error("Bu bir ERROR mesajı ");
		logger.fatal("Bu bir FATAL mesajı ");
		
		exceptionTest();

	}

	private static void loadLog4jConfig() {
		DOMConfigurator.configureAndWatch("src/main/webapp/WEB-INF/log4jconfig.xml");
		logger= Logger.getLogger(HelloBean.class);
	}

	public void exceptionTest() {
		try {
			ArrayList<String> testArray = new ArrayList<>();
			testArray.get(10);//Hata oluşsun
		
		} catch (Exception e) {
			logger.error("exceptionTest() mesajı oluştu. "+e.getMessage(),e);
		}
	}

	// Getter Setter
	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}
}


 

Örnek Proje Çıktıları

Log Seviyesi : ALL

Log Seviyesi : ALL durumunda konsol çıktısı
Log Seviyesi : ALL durumunda konsol çıktısı

 

Log Seviyesi : DEBUG

Log Seviyesi : Debug durumunda konsol çıktısı
Log Seviyesi : Debug durumunda konsol çıktısı

Log seviyesi debug durumunda log dosyasındaki çıktı bu şekilde.Bu çıktıda örnek exceptionda oluşturdum oda log içinde yazmakta.Çıktının formatı console ile aynı verdiğim için aynı.Burada aslında iki Appender çalıştı(File Appender ve Console Appender) birisi consoleda logları gösterdi bir tanesi de atakancoban.log dosyasına logları yazdırdı.Burada  console log resmine dikkat edin System.Out.Println ile bir çıktı yazdım ve atakancoban.log kısmında gözükmeyecek atakancoban.log dosyasına yazılması için logger kullanılarak bir mesaj basılması gerekir.

 

Log Seviyesi : INFO

Log Seviyesi : INFO durumunda konsol çıktısı
Log Seviyesi : INFO durumunda konsol çıktısı

 

Log Seviyesi : WARN

Log Seviyesi : WARN durumunda konsol çıktısı
Log Seviyesi : WARN durumunda konsol çıktısı

 

Log Seviyesi : ERROR

Log Seviyesi : ERROR durumunda konsol çıktısı
Log Seviyesi : ERROR durumunda konsol çıktısı

Log Seviyesi : FATAL

Log Seviyesi : FATAL durumunda konsol çıktısı
Log Seviyesi : FATAL durumunda konsol çıktısı

Örnek exception mesajımı ERROR seviyesinde yazmıştım.Bu nedenle FATAL seviyesinde  exceptiondan haberim yok.

Log Seviyesi : OFF

Tahmin ettiğiniz gibi sizleri tertemiz bir log sayfası bekler 😀

logger.info(“Kolay Gelsin. 🙂 ” );

Projenin kaynak kodlarını indir

Yazıyı yazarken yararlandığım bloglar : sukrucakmak , yusuf-cakmak

Bir cevap yazın

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