20 Ocak 2019 Pazar

SLF4J - Simple Logging Facade for Java

Maven
SLF4J bir sürü backend ile kullanılabilir. logback-classic, log4j, JUL (java.util.logging), JCL (Jakarta Commons Logging) vs.

logback-classic
Logback yazısına taşıdım.

SLF4J ile logback-classic backend'i kullanmak için Maven'da şöyle yaparız.
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
</dependency>
Pattern
 %m - Bizim mesajımızı gösterir.
%t
 - Thread ismini gösterir.

SLF4J Logger Sınıfı
info metodu
Çalışma mantığı şöyle.
public void log(int logLevel, String ... msg) {
  if (logLevel >= currentLogLevel) {
    for (String m : msg) {
      ...
    }
  }
}
// calling
log(2, "text1", var1, "text2");
String birleştirmekten kaçtığı için şöyle yapmamalıyız.
logger.info("List size is: " + list.size());
String birleştirme yapmadığı için çağrının maliyeti düşük. Açıklaması şöyle
You can turn off logging entirely by setting the level of the root logger to Level.OFF, the highest possible level. When logging is turned off entirely, the cost of a log request consists of a method invocation plus an integer comparison. On a 3.2Ghz Pentium D machine this cost is typically around 20 nanoseconds.
info metodu - template string
Template yeri için {} karakterleri kullanılır.

Örnek - 1 parametre
Template string yöntemini kullanarak şöyle yaparız.
log.info("Something like this {}", variable);
Şöyle yaparız.
Object entry = new SomeObject(); 
logger.debug("The entry is {}.", entry);
Örnek - 2 parametre
Şöyle yaparız.
log.info("ID: {} NAME: {}", id, name);
Şöyle yaparız.
log.info("A is {} and B is {}. The difference is {}.", a, b, a-b);
Örnek - 3 parametre
Şöyle yaparız.
Object[] paramArray = {newVal, below, above};
logger.debug("Value {} was inserted between {} and {}.", paramArray);


SLF4J LoggerFactory Sınıfı
getLogger metodu
Root logger'î almak için şöyle yaparız.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main
{
  static final Logger logger = LoggerFactory.getLogger(Main.class);

  public static void main(String[] args)
  {
    logger.info("Main started");
  }
}
Örnek
Elimizde şöyle bir xml olsun
<?xml version="1.0"?>
<configuration>
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>logfile.log</file>
        <append>true</append>
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
        </encoder>
    </appender>
    <appender name="ANALYTICS-FILE" class="ch.qos.logback.core.FileAppender">
        <file>analytics.log</file>
        <append>true</append>
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
        </encoder>
    </appender>
    <!-- additivity=false ensures analytics data only goes to the analytics log -->
    <logger name="analytics" level="DEBUG" additivity="false">
        <appender-ref ref="ANALYTICS-FILE"/>
    </logger>
    <root>
        <appender-ref ref="FILE"/>
    </root>
</configuration>
Belli bir logger'a isim ile erişmek için şöyle yaparız
Logger analytics = LoggerFactory.getLogger("analytics");
SLF4J Mapped Diagnostic Context (MDC) 
Örnek
Elimizde şöyle bir appender olsun. %X{key} ile MDC nesnesine "key" isimli bir alan ekleyeceğimizi belirtiriz.
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> 
  <layout>
    <Pattern>%X{key}  - %m%n</Pattern>
  </layout> 
</appender>
Şöyle yaparız.
public String doAnyAction(long key) 
{
  MDC.put("key", key);
  logger.info(key);
}

Hiç yorum yok:

Yorum Gönder