Comment créer mon propre Appender dans log4j?

Je suis nouveau dans log4j. Quelqu’un peut-il expliquer comment créer mon propre Appender? c’est-à-dire comment implémenter les classes et les interfaces et comment les remplacer?

Vous devez étendre la classe AppenderSkeleton, qui (en javadoc) “fournit le code pour les fonctionnalités courantes, telles que la prise en charge du filtrage de seuil et la prise en charge des filtres généraux”.

Si vous lisez le code de AppenderSkeleton, vous verrez qu’il gère presque tout, vous laissant juste:

  1. append void protégé (événement LoggingEvent)
  2. void public close ()
  3. booléen public requiredLayout ()

La méthode de base est ajoutée. Rappelez-vous que vous n’avez pas besoin d’implémenter la logique de filtrage car elle est déjà implémentée dans doAppend, qui à son tour les ajoute. Ici, j’ai créé une classe (assez inutile) qui stocke les entrées de journal dans une ArrayList, juste comme une démo.

public /*static*/ class MyAppender extends AppenderSkeleton { ArrayList eventsList = new ArrayList(); @Override protected void append(LoggingEvent event) { eventsList.add(event); } public void close() { } public boolean requiresLayout() { return false; } } 

Ok, testons le:

 public static void main (Ssortingng [] args) { Logger l = Logger.getLogger("test"); MyAppender app = new MyAppender(); l.addAppender(app); l.warn("first"); l.warn("second"); l.warn("third"); l.trace("fourth shouldn't be printed"); for (LoggingEvent le: app.eventsList) { System.out.println("***" + le.getMessage()); } } 

Vous devriez avoir “premier”, “deuxième”, “troisième” imprimé; Le quasortingème message ne doit pas être imprimé car le niveau de journalisation du journal racine est débogué pendant que le niveau de l’événement est suivi. Cela prouve que AbstractSkeleton implémente correctement la “gestion des niveaux”. Donc, cela semble définitivement être la voie à suivre … maintenant, la question: pourquoi avez-vous besoin d’un appender personnalisé alors qu’il y a beaucoup de journaux intégrés dans presque toutes les destinations? (btw un bon endroit pour commencer avec log4j: http://logging.apache.org/log4j/1.2/manual.html )

Si vous souhaitez faire des manipulations ou prendre des décisions, vous pouvez le faire comme ceci:

 @Override protected void append(LoggingEvent event) { Ssortingng message = null; if(event.locationInformationExists()){ SsortingngBuilder formatedMessage = new SsortingngBuilder(); formatedMessage.append(event.getLocationInformation().getClassName()); formatedMessage.append("."); formatedMessage.append(event.getLocationInformation().getMethodName()); formatedMessage.append(":"); formatedMessage.append(event.getLocationInformation().getLineNumber()); formatedMessage.append(" - "); formatedMessage.append(event.getMessage().toSsortingng()); message = formatedMessage.toSsortingng(); }else{ message = event.getMessage().toSsortingng(); } switch(event.getLevel().toInt()){ case Level.INFO_INT: //your decision break; case Level.DEBUG_INT: //your decision break; case Level.ERROR_INT: //your decision break; case Level.WARN_INT: //your decision break; case Level.TRACE_INT: //your decision break; default: //your decision break; } } 

Pour créer un propre Appender, il vous suffit d’implémenter l’interface Appender et de la remplacer. Et aussi étudier ce lien

Je voudrais utiliser la réponse de @AgostinoX pour prendre en charge la configuration de fichiers pro et la possibilité de démarrer et d’arrêter la capture de journalisation:

 public class SsortingngBufferAppender extends org.apache.log4j.AppenderSkeleton { SsortingngBuffer logs = new SsortingngBuffer(); AtomicBoolean captureMode = new AtomicBoolean(false); public void close() { // TODO Auto-generated method stub } public boolean requiresLayout() { // TODO Auto-generated method stub return false; } @Override protected void append(LoggingEvent event) { if(captureMode.get()) logs.append(event.getMessage()); } public void start() { //System.out.println("[SsortingngBufferAppender|start] - Start capturing logs"); SsortingngBuffer logs = new SsortingngBuffer(); captureMode.set(true); } public SsortingngBuffer stop() { //System.out.println("[SsortingngBufferAppender|start] - Stop capturing logs"); captureMode.set(false); SsortingngBuffer data = new SsortingngBuffer(logs); logs = null; return data; } } 

Il ne rest plus qu’à définir dans le fichier log4j.property

 log4j.rootLogger=...., myAppender # here you adding your appendr name log4j.appender.myAppender=com.roi.log.SsortingngBufferAppender # pointing it to the implementation 

que quand vous voulez l’activer pendant l’exécution:

 Logger logger = Logger.getRootLogger(); SsortingngBufferAppender appender = (SsortingngBufferAppender)logger.getAppender("myAppender"); appender.start(); 

et alors que vous voulez l’arrêter:

 SsortingngBuffer sb = appender.stop(); 

Vous trouvez un exemple sympa et très utile sous:

http://blog.kimb3r.com/2008/07/improving-log4j-dailyrollingfileappende.html