2012-06-20 3 views
21

Comment utiliser AsyncAppender dans log4j pour écrire un message de journal sur le service Web? Devrais-je créer mon propre Appender qui étendrait AsyncAppender ou juste attacher des appenders personnalisés à AsyncAppender? Si le second choix est correct, où dois-je prendre l'objet AsyncAppender? Y a-t-il un exemple?Comment utiliser AsyncAppender dans log4j?

Répondre

-4

Répondre à ma propre question.

Dans le fichier de configuration log4j (habituellement c'est log4j.xml ou log4j.properties), nous devrions définir AsyncAppender qui se réfèrerait à un réel appender (il peut s'agir de notre propre classe définie comme dans mon cas). J'ai donc écrit une classe WebServiceAppender qui étend AppenderSkeleton et implémente 3 méthodes abstraites. La méthode principale est "append" qui se connecte au service Web et lui envoie toutes les informations. C'est tout.

+19

Veuillez fournir votre exemple de code pour d'autres utilisateurs. merci – philipp

+2

pouvez-vous s'il vous plaît fournir le code ou quelques lignes? –

35

Ajouter AsyncAppender dans le fichier de configuration log4j qui se référera à un réel appender. Pour démonstration: l'ajout asyncappender pour consoler appender dans log4j.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" > 
<log4j:configuration> 
<appender name="console" class="org.apache.log4j.ConsoleAppender"> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="[%p] %d{dd MMM hh:mm:ss aa} %t [%l] %m%n"/> 
    </layout> 
</appender> 
<appender name="async" class="org.apache.log4j.AsyncAppender"> 
    <param name="BufferSize" value="500"/> 
    <appender-ref ref="console"/> 
</appender> 
<root> 
    <priority value="all"></priority> 
    <appender-ref ref="async"/> 
</root> 
</log4j:configuration> 
+3

Pour des raisons de performances, il est préférable de toujours limiter la priorité racine à un niveau supérieur. Voir http://stackoverflow.com/a/13144054/603516. – Vadzim

+2

Pouvez-vous fournir le même exemple mais dans le format de fichier log4j.properties? –

+0

le numéro de ligne ne montrera pas – fudy

9

Nous voulions utiliser log4j.AsyncAppender mais n'a pas pu trouver aucune méthode setter pour fixer d'autres appenders au fichier log4j.property. Nous avons donc étendu la classe log4j.AsyncAppender et ajouté un setter pour ajouter d'autres appenders. Cela a permis au thread principal du programme d'être indépendant de l'opération de journalisation de log4j. Les détails ci-dessous.

entrée log4j:

Définir un enregistreur 'com.noPath' avec log4j fichier Appender, 'FileAppender'. Notez que le chemin de l'enregistreur est immatérielle et d'où le nom « com.noPath »

log4j.logger.com.noPath=DEBUG,fileAppender 
log4j.appender.fileAppender=org.apache.log4j.RollingFileAppender 
log4j.appender.fileAppender.File=c:/test.log 

Définir l'enregistreur que les besoins d'affaires, « com.business », fixez le appender fichier de l'étape précédente, « FileAppender », au log4j AsyncAppender par un com.log.AsyncAppenderHelper de classe personnalisée qui étend log4j AsyncAppender

log4j.logger.com.business=DEBUG,asyncLog 
log4j.appender.asyncLog=com.log.AsyncAppenderHelper 
log4j.appender.asyncLog.appenderFromLogger=com.noPath 

la classe java com.log.AsyncAppenderHelper extension log4j.AsyncAppender, ont disponible dans le chemin de la classe.

package com.log 
import java.util.Enumeration; 
import org.apache.log4j.Appender; 
import org.apache.log4j.AsyncAppender; 
import org.apache.log4j.Logger; 

/* 
* This class helps configure to AsyncAppender from log4j as part of log4j.properties 
* You can inject other appenders to AsyncAppender using the AsyncAppenderHelper 
* This would free up the main program thread to be independent of log4j's logging operation 
* @Author http://www.linkedin.com/in/jobypgeorge 
*/ 

public class AsyncAppenderHelper extends AsyncAppender{ 

    public AsyncAppenderHelper(){ 
     super(); 
    } 

    public void setAppenderFromLogger(String name){ 
     Logger l = Logger.getLogger(name); 

     Enumeration<Appender> e = l.getAllAppenders(); 

     while(e.hasMoreElements()){ 
      Appender a = e.nextElement(); 
      this.addAppender(a); 
      System.out.println("The newAppender "+a.getName() +" attach status "+this.isAttached(a)); 
     } 

    } 
} 
+2

bel exemple comment utiliser async appender dans log4j.properties – hudi

+0

Attention, cela peut facilement casser. J'ai essayé ceci mais le PropertyConfigurator enlève des appenders et les ajoute de nouveau pendant qu'il traite. Mon AsyncAppenderHelper s'est retrouvé avec un appender fermé. C'est pourquoi vous devez utiliser DomConfigurator (xml) pour l'utiliser. –

+1

@AlanYackel il n'y a pas d'option comment l'utiliser avec log4j.properties? Je ne peux pas utiliser le fichier xml – hudi