web-dev-qa-db-fra.com

Comment utiliser AsyncAppender dans log4j?

Comment utiliser AsyncAppender dans log4j afin d'écrire un message de journal sur le service Web? Dois-je créer mon propre Appender pour étendre AsyncAppender ou simplement attacher des appender personnalisés à AsyncAppender? Si le deuxième choix est correct, où dois-je prendre l'objet AsyncAppender? Y a-t-il un exemple?

25
Sergey

Ajoutez AsyncAppender dans le fichier de configuration log4j qui fera référence à un véritable appender. Pour la démonstration: ajouter asyncappender à la console 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>
41
deepakmodak

Nous voulions utiliser log4j.AsyncAppender mais n'avons trouvé aucune méthode de définition pour attacher 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 aidé le thread principal du programme à être indépendant de l'opération de journalisation de log4j. Les détails ci-dessous.

entrée log4j:

Définissez un enregistreur 'com.noPath' avec log4j File Appender, 'fileAppender'. Notez que le chemin de l'enregistreur est immatériel et donc 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éfinissez l'enregistreur dont l'entreprise a besoin, "com.business", attachez l'appendice de fichier de l'étape précédente, "fileAppender" au log4j AsyncAppender via une classe personnalisée com.log.AsyncAppenderHelper 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 classe com.log.AsyncAppenderHelper étendant log4j.AsyncAppender, la met à disposition dans le chemin de 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));
        }

     }
}
9
JobyPGeorge