Asdfasf

Sunday, July 15, 2012

Logging & LogBack & Slf4j

Loglamanin, bir yazilim projesi icin ne kadar onemli oldugunu biliyoruz. Yapilan arastirmalar, bir projesinin, %4'luk kisminin loglama'ya ayrildigini gosteriyor ki hacim olarak hic de azimsanmayacak bir deger.

Bir loglama framework'u olarak LogBack urununun kullanimini paylasacagim, Ceki Gulcu tarafindan gelistirilmis ve slf4j'nin kiz kardesi. Slf4j, loglama framework'unden bagimsiz olarak kodumuzu gelistirmemizi saglayan bir onyuz (facade) saglarken, logback, bizatihi loglama framework'unun kendisi.

Slf4j 'yi daha iyi ifade eden yine kendi sitesinden : The Simple Logging Facade for Java or (SLF4J) serves as a simple facade or abstraction for various logging frameworks, e.g. java.util.logging, log4j and logback, allowing the end user to plug in the desired logging framework at deployment time:

Hemen uygulamaya gecelim. Eclipse'de maven projemizi olusturuyoruz. Pom.xml'e girecegimiz dependency'ler su sekilde: 
<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.0.6</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.0.6</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-access</artifactId>
        <version>1.0.6</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.6.6</version>
    </dependency>            
  </dependencies>

logback.xml'imizi hazirliyoruz. LogBack'in configurasyon dosyasini bulabilmesi icin, logback.xml'in classpath'de olmasi gerekiyor.

Maven der ki, configurasyon dosyalarinizi src->main->config altina koyun ki biz de oyle yapiyoruz.

<configuration debug="true" scan="true" scanPeriod="10 seconds" >

    
  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>testFile.log</file>
    <append>true</append>
    <!-- encoders are assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
  </appender>
        
  <root level="DEBUG">
    <appender-ref ref="FILE" />
  </root>
  
  
  
</configuration>


Peki eclipse logback.xml'i nasil classpath'e ekleyecek? Java Build Path -> Libraries -> Add External Class Folder:

En basit bir HelloWorld uygulamasi su sekilde:

package com.ferhat.logback_work;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorld1 {

    static Logger logger = LoggerFactory.getLogger(HelloWorld1.class);

    public static void main(String[] args) {
        logger.debug("Hello world. {}", getString());
    }

    public static String getString() {
        return "ferhat";
    }
}

Dikkat ederseniz, kod icinde direk logBack dependency'si yok, slf4j hangi logging framework'u kullanacagini, classpath'imizde bulacagi logging framework'une gore karar veriyor ki biz logback jar'larini classpath'imizde bulunduruyoruz.

Logback kullanimi ile alakali detaylari burdan bulabilirsiniz.

logback.xml'deki bir-iki ufak detay dan bahsedeyim
<configuration debug="true" scan="true" scanPeriod="10 seconds" >

1.)debug="true" oldugu durumda, uygulamamiz baslarken logback, sistemde buldugu configurasyon dosyalari ve varsa hatalar hakkinda log basiyor ki faydali olacaktir.


2.)scan="true" oldugu durumda, logback belli araliklarla (scanPeriod="10 seconds"), logback.xml dosyasina goz atip var ise degisiklikleri uyguluyor.

3.)Log metodunun cagrildigi satir numarasini yazdirmak icin [%file:%line] ekliyoruz ancak runtime'da satir numarasi bilgisine ulasmanin maliyetli bir is oldugunu eklemekte fayda var:
<pattern>%-4relative [%thread] %-5level %logger{35} [%file:%line] - %msg%n</pattern>


No comments: