Logger avec Lombok

De EjnTricks

Dans tout projet Java des traces sont mises en place à l'aide de Logger. Il existe un grand nombre de framework pour générer les traces, mais la mise en place est toujours la même par l'initialisation d'une instance du logger, bien souvent en statique.

Lombok permet de s'affranchir de l'initialisation des loggers et cela sur une large palette de frameworks. Cet article présente des exemples sur trois framework courant.

Le code source est disponible à l'adresse suivante: http://www.svn.jouvinio.net/study/trunk/lombok, et en particulier les classes du package fr.ejn.tutorial.java.lombok.logger.

Hand-icon.png Votre avis

Nobody voted on this yet

 You need to enable JavaScript to vote


Logo LOG4J.jpg Log4J

Log4J a été un framework populaire dans les projets. L'annotation Log4j permet de mettre à disposition une variable log basée sur l'implémentation Log4J comme démontré dans la classe ServiceWithLog4j.

package fr.ejn.tutorial.java.lombok.logger;

import lombok.extern.log4j.Log4j;

/**
 * Tutorial class to illustrate logger with Log4J.
 *
 * @author Etienne Jouvin
 *
 */
@Log4j
public class ServiceWithLog4j {

  public void logMessage(String message) {
    log.info(message);
  }

}

Il est nécessaire d'avoir une configuration du logger disponible, comme celle mise à disposition dans le fichier log4j.properties pour les tests unitaires.

# Root logger option
log4j.rootLogger=INFO, stdout

# Direct log messages to stdout
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

Cette configuration permet de logger les messages au niveau de la console, illustré dans le test ServiceWithLog4jTest.

package fr.ejn.tutorial.java.lombok.logger;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

public class ServiceWithLog4jTest {

  @BeforeClass
  public static void setUpBeforeClass() throws Exception {
  }

  @AfterClass
  public static void tearDownAfterClass() throws Exception {
  }

  @Before
  public void setUp() throws Exception {
  }

  @After
  public void tearDown() throws Exception {
  }

  @Test
  public void testLogMessage() throws Exception {
    ServiceWithLog4j instance = new ServiceWithLog4j();
    instance.logMessage("---> Start with log4j service");
    instance.logMessage("my message");
    instance.logMessage("---> End with log4j service");
  }

}


Logo Commons Logging.png Apache Commons Logging

Le framework Apache Commons Logging est un des tous premiers qui introduisait une couche par dessus les différents frameworks, dont l'implémentation est sélectionnée en fonction du fichier de configuration.

L'utilisation de l'annotation CommonsLog permet de rendre disponible une variable log comme démontré dans la classe ServiceWithCommonsLogging.

package fr.ejn.tutorial.java.lombok.logger;

import lombok.extern.apachecommons.CommonsLog;

/**
 * Tutorial class to illustrate logger with commons-logging.
 *
 * @author Etienne Jouvin
 *
 */
@CommonsLog
public class ServiceWithCommonsLogging {

  public void logMessage(String message) {
    log.info(message);
  }

}

Il est nécessaire d'avoir une configuration du logger disponible, comme celle mise à disposition dans le fichier commons-logging.properties pour les tests unitaires.

org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger

# jdk handlers
handlers=java.util.logging.FileHandler, java.util.logging.ConsoleHandler

# default log level
.level=INFO

Cette configuration permet de logger les messages au niveau de la console avec le framework Jdk14Logger, illustré dans le test ServiceWithCommonsLoggingTest.

package fr.ejn.tutorial.java.lombok.logger;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

public class ServiceWithCommonsLoggingTest {

  @BeforeClass
  public static void setUpBeforeClass() throws Exception {
  }

  @AfterClass
  public static void tearDownAfterClass() throws Exception {
  }

  @Before
  public void setUp() throws Exception {
  }

  @After
  public void tearDown() throws Exception {
  }

  @Test
  public void testLogMessage() throws Exception {
    ServiceWithCommonsLogging instance = new ServiceWithCommonsLogging();
    instance.logMessage("---> Start with commons-logging service");
    instance.logMessage("my message");
    instance.logMessage("---> End with commons-logging service");
  }

}


Logo SLF4J.jpg SLF4J

Le framework SLF4J est similaire à Commons Logging mais plus récent et très populaire, du fait du grand nombre d'implémentations.

L'utilisation de l'annotation SLF4J permet de rendre disponible une variable log comme démontré dans la classe ServiceWithSlf4j.

package fr.ejn.tutorial.java.lombok.logger;

import lombok.extern.slf4j.Slf4j;

/**
 * Tutorial class to illustrate logger with SLF4J.
 *
 * @author Etienne Jouvin
 *
 */
@Slf4j
public class ServiceWithSlf4j {

  public void logMessage(String message) {
    log.info(message);
  }

}

Aucun fichier de configuration n'est nécessaire pour le framework SLF4J, cela se base sur l'implémentation disponible dans le classpath. Pour ce projet, l'implémentation slf4j-simple est utilisée pour sa simplicité. Le test unitaire ServiceWithSlf4jTest illustre l'utilisation.

package fr.ejn.tutorial.java.lombok.logger;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

public class ServiceWithSlf4jTest {

  @BeforeClass
  public static void setUpBeforeClass() throws Exception {
  }

  @AfterClass
  public static void tearDownAfterClass() throws Exception {
  }

  @Before
  public void setUp() throws Exception {
  }

  @After
  public void tearDown() throws Exception {
  }

  @Test
  public void testLogMessage() throws Exception {
    ServiceWithSlf4j instance = new ServiceWithSlf4j();
    instance.logMessage("---> Start with slf4j service");
    instance.logMessage("my message");
    instance.logMessage("---> End with slf4j service");
  }

}


Viewer icon.png Voir aussi

Documentation officielle: https://projectlombok.org/features/log