Ajoutez dynamiquement l'appender avec slf4j et log4j2

Je veux créer dynamiquement un appender et l'ajouter à un enregistreur. Cependant, cela ne semble pas être possible avec slf4j. Je peux ajouter à mon appender à un enregistreur de log4j, mais ensuite je n'arrive pas à récupérer l'enregistreur, l'slf4j LoggerFactoy.

Ce que je veux faire: j'ai créer une classe de test (pas de test jUnit) et passer un enregistreur dans le constructeur de la classe de test à utiliser. Chaque instance de la classe de test a besoin de son propre enregistreur et appender qui enregistre le fichier journal de sorte qu'il peut être utilisé plus tard dans un rapport HTML.

Ce que j'ai essayé (pour des raisons de simplicité, j'ai créé un test jUnit):

  import static org.junit.Assert.assertEquals;

  import java.util.LinkedList;
  import java.util.List;

  import org.apache.logging.log4j.core.LogEvent;
  import org.junit.Test;
  import org.slf4j.helpers.Log4jLoggerFactory;

  import ch.fides.fusion.logging.ListAppender;

  public class ListAppenderTest {

      @Test
      public void test() {

          String testName = "test1";

          //the log messages are to be inserted in this list
          List<LogEvent> testLog = new LinkedList<>();

          //create log4j logger
          org.apache.logging.log4j.core.Logger log4jlogger = (org.apache.logging.log4j.core.Logger) org.apache.logging.log4j.LogManager
                                          .getLogger("Test:" + testName);

          //create appender and add it to the logger
          ListAppender listAppender = new ListAppender("Test:" + testName + ":MemoryAppender", testLog);
          log4jlogger.addAppender(listAppender);

          //get the slf4j logger
          org.slf4j.helpers.Log4jLoggerFactory loggerFactory = new Log4jLoggerFactory();
          org.slf4j.Logger testLogger = loggerFactory.getLogger("Test:" + testName);

          //test it
          final String TEST_MESSAGE = "test message";
          testLogger.info(TEST_MESSAGE);

          assertEquals(1, testLog.size());
          LogEvent logEvent = testLog.get(0);
          assertEquals(TEST_MESSAGE, logEvent.getMessage().getFormattedMessage() );
      }

  }

et c'est mon appender:

 package ch.fides.fusion.logging;

  import java.util.List;

  import org.apache.logging.log4j.core.LogEvent;
  import org.apache.logging.log4j.core.appender.AbstractAppender;

  public class ListAppender extends AbstractAppender {

      private final List<LogEvent> log;

      public ListAppender(String name, List<LogEvent> testLog) {
          super(name, null, null);
          this.log = testLog;
      }

      @Override
      public void append(LogEvent logEvent) {
          log.add(new TestLogEvent(logEvent));
      }

  }

Que puis-je faire pour obtenir que cela fonctionne? Peut-être que je me rapproche de ce sous un mauvais angle, mais je voudrais éviter de créer mon propre enregistreur de classe. Toute aide est grandement appréciée.

source d'informationauteur Daniele Torino | 2014-04-04