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
Vous devez vous connecter pour publier un commentaire.
L'accès et la manipulation log4j2 plus de slf4j par code/au moment de l'exécution:
Référence: https://logging.apache.org/log4j/2.x/manual/customconfig.html
Je pense que vous êtes d'avoir un scénario semblable à la nôtre. De plus en plus complexe l'exploitation forestière dans la production, mais plus simple, au cours de JUnit test, de sorte que nous pouvons affirmer qu'il n'y a pas eu d'erreurs.
Il y a des solutions plus propres à l'aide de constructeurs si vous utilisez log4j2 > 2.4 (mais alors, pas de support pour Java6), mais c'est le seul que j'ai eu à travailler avec log4j2 2.3:
Important de noter que nous avons besoin de passer des "faux" lors de l'appel de getContext, sinon il ne semble pas être le même contexte que slf4j.
Daniele, un ListAppender existe dans Log4J-2.0 (paquet
org.apache.logging.log4j.test.appender
). Il fait partie de la distribution, mais c'est dans le log4j-core-essais de jar. Il est surtout utilisé pour les tests JUnit. Le test JUnit source a également des exemples de configurations montrant comment configurer avec cette ListAppender.Un exemple de config ressemble à quelque chose comme ceci: