JSF Spring ile Log4j kullanımı ve Örnek Proje

JSF Spring ile Log4j kullanımı ve Örnek Proje

Spring ve Log4j Hakkında

Daha önceki yazımda log4j nedir nasıl kullanılır açıklamıştım.(Yazıyı Oku)
Bu yazımda spring framework içinde nasıl loglama yapacağımızı açıklayacağım.
Daha önceki yazımda örnek JSF,Spring projesi oluşturmuştum.(Yazıyı Oku) isterseniz o yazıdaki projeyi indirin veya baştan adımlar ile oluşturun. Ben o proje üzerinde log kütüphanesi ekleyeceğim.

 

Örnek Proje Anlatımı

Pom XML

Log4j kütüphanesini projemize ekledim.Pom xml uzun olduğu için tümünü eklemedim.
Proje githubda olduğu için indirebilir tam halini oradan görebilirsiniz.

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

		<!-- LOG4J END -->

 

Log4j Config XML

Bu xml dosyamızda logların dosyaya ve konsol üzerinde hangi seviyelerde yazılacağını ayarlıyoruz.Bu değişikliklerin sonuçları nasıl değiştireceğini yazının devamında ekran görüntüleri ile anlattı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>

	<!-- Appenders -->
	<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>
	<!-- Appenders END -->

	<!-- Category -->
	<category name="org.springframework" additivity="false">
		<priority value="error" />
		<appender-ref ref="console" />
		<appender-ref ref="file" />
	</category>
	<category name="org.hibernate" additivity="false">
		<priority value="error" />
		<appender-ref ref="console" />
		<appender-ref ref="file" />
	</category>
	<category name="com.mchange" additivity="false">
		<priority value="error" />
		<appender-ref ref="console" />
		<appender-ref ref="file" />
	</category>
	<category name="com.atakancoban" additivity="false">
		<priority value="all" />
		<appender-ref ref="console" />
		<appender-ref ref="file" />
	</category>
	<!-- Category END -->
	<root>
		<level value="error" />
		<appender-ref ref="file" />
		<appender-ref ref="console" />
	</root>

</log4j:configuration>

 

Web XML

Spring projemizde log4x config xml dosyamızın hangisi olduğunu tanıtıyoruz ve listener bağlıyoruz.Bu sayede proje çalıştığı zaman log kütüphanesi de başlatılır ve kütüphaneden gelen loglar konsol veya dosyaya log seviyesine göre düşmeye başlar.

 
<!-- Loh4j Config and Listener -->
	<context-param>
		<param-name>log4jConfigLocation</param-name>
		<param-value>/WEB-INF/log4jconfig.xml</param-value>
	</context-param>

	<listener>
		<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
	</listener>
	<!-- Loh4j Config and Listener End -->

web xml son hali

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
	<display-name>hellojsf</display-name>
	<welcome-file-list>
		<welcome-file>index.xhtml</welcome-file>
	</welcome-file-list>

	<!-- Primefaces Select Theme -->
	<context-param>
		<param-name>primefaces.THEME</param-name>
		<param-value>glass-x</param-value>
	</context-param>


<!-- Spring Listener -->
  
<listener>
	<listener-class>
		org.springframework.web.context.ContextLoaderListener
	</listener-class>
</listener>
<listener>
	<listener-class>
		org.springframework.web.context.request.RequestContextListener
	</listener-class>
</listener>
<!-- Serve Saving Mode -->
<context-param>
		<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
		<param-value>server</param-value>
	</context-param>
	
	<context-param>
		<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
		<param-value>.xhtml</param-value>
	</context-param>
	<servlet>
		<servlet-name>Faces Servlet</servlet-name>
		<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>*.xhtml</url-pattern>
	</servlet-mapping>
<!-- Faces Config -->
 <context-param>
    <param-name>javax.faces.CONFIG_FILES</param-name>
    <param-value>
        WEB-INF/faces-config.xml
    </param-value>
  </context-param>
<!-- Application Context -->  
  <context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/applicationContext.xml</param-value>
	</context-param>



	<!-- Loh4j Config and Listener -->
	<context-param>
		<param-name>log4jConfigLocation</param-name>
		<param-value>/WEB-INF/log4jconfig.xml</param-value>
	</context-param>

	<listener>
		<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
	</listener>
	<!-- Loh4j Config and Listener End -->


	
	
	
	
</web-app>

 

Hello Bean 

Bu bean sayfamda sadece örnek log bastırdım.Hangi seviyede hangi loglar ekrana düşüyor önceki log4j kullanımı yazımda detaylı göstermiştim.Onuda okuyun.

Log yazmak istediğiniz sayfada Logger nesnesi oluşturmalısınız.

 
static Logger logger = Logger.getLogger(HelloBean.class);

Buton tıklandığında yazdığım örnek loglar

public void onClick() {
		try {

			System.out.println("Araba Listesi  : " + carService.getCarDetails());

			System.out.println("Veritabanı ile çekilen zaman   : " + carService.getSystemTime());
			 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ı ");
		} catch (Exception e) {
			System.out.println("Exception onClick() " + e.getMessage());
		}
	}

Hello bean sınıfı tam hali

package com.atakancoban.bean;

import java.io.Serializable;
import java.util.jar.Attributes.Name;

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

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.atakancoban.service.CarService;

@ManagedBean
@SessionScoped
public class HelloBean implements Serializable {

	private static final long serialVersionUID = -4823295172962937652L;

	@ManagedProperty("#{carService}")
	private CarService carService;

	static Logger logger = Logger.getLogger(HelloBean.class);

	private String message = "www.atakancoban.com";

	@PostConstruct
	public void init() {
		System.out.println("init()");
	}

	public void onClick() {
		try {

			System.out.println("Araba Listesi  : " + carService.getCarDetails());

			System.out.println("Veritabanı ile çekilen zaman   : " + carService.getSystemTime());
			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ı ");
		} catch (Exception e) {
			System.out.println("Exception onClick() " + e.getMessage());
		}
	}

	public String getMessage() {
		return message;
	}

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

	public CarService getCarService() {
		return carService;
	}

	public void setCarService(CarService carService) {
		this.carService = carService;
	}

}

Örnek Proje Sonuçları

log4jconfig.xml dosyasında log seviyelerini ayarlıyoruz demiştik. Şimdi bazı seviyeleri değiştirelim log olarak neler değişti bakalaım.

Örnek 1

com.mchange paketinde connection ile ilgili loglar atıyor.
com.atakancoban  paketi benim projem ve attığım logları kontrol ediyor.
Şimdi mchange ALL ve atakancoban ERROR durumunda logları kontrol etmek zor çüngü mchangedeki debug seviyesindeki bilgi sürekli konsolda ve şuan onlara ihtiyacım yok.mchange seviyesini yukarı çekip sadece Error göster demek istersem burayı değiştirmem gerekir.

com.atakancoban paketimde error ve üstü loglarımı getirdi.

Burada root seviyesi ALL durumunda fakat biz paket belirterek seviye verirsek(com.mchange, com.atakancoban vs) root kontrolünden çıkar özelleştirdiğimiz seviye ne ise onu basar.Özellikle seviye belirtmediğimiz pakletler örneğin com.xxx kütüphanesi olsun bunun log seviyesi rootun seviyesidir.

Spring log4j category düzenlenmesi örneği
Spring log4j category düzenlenmesi örneği

 

Örnek 2

com.mchange paketimi ERROR seviyesine çektim.
com.atakancoban INFO seviyesine getirdim.

Konsola baktığımızda önceki resimdeki mchange Debug logları yok ERROR durumunda mchange logları görürüm.
com.atakancoban paketine baktığımızda ise INFO ve üstü loglarımı gördüm.

Spring log4j kullanımı örneği
Spring log4j category düzenlenmesi örneği 2

 

Örnek 3

Burada root ve özellikle belirttğim log seviyesi hiyerarşisine bakalım

root seviyesi ERROR
com.atakancoban ALL
Durumunda şekildeki gibi özellikle belirttiğim com.atakancoban seviye olarak root u kullanmadı.

Eğer com.atakancoban şeklinde category belirtmeseydim o pakette root ne ise ona göre loglamaya devam edecekti.Umarım anlatabilmişimdir.

Spring log4j category düzenlenmesi örneği 2
Spring log4j category düzenlenmesi örneği 3

Tabiki bu konsol loglarının aynısı WEB-INF/log/atakancoban.log dosyasına da yazılıyor ben örnek olsun diye resmini paylaşayım

spring ve log4j kullanımı
Spring ve Log4j kullanımı

logger.debug(“İyi Çalışmalar…”);

Projenin kaynak kodlarını indirebilirsiniz.

>spring,hibernate,jsf,log4j>sukrucakmak

Bir cevap yazın

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