Cómo utilizar AsyncAppender en log4j?


¿Cómo usar AsyncAppender en log4j para escribir un mensaje de registro en el servicio web? ¿Debería crear mi propio Appender que extendería AsyncAppender o simplemente adjuntar appenders personalizados al AsyncAppender? Si la segunda opción es correcta, ¿dónde debo llevar el objeto AsyncAppender? ¿Hay algún ejemplo?

Author: Sergey, 2012-06-20

3 answers

Agregue AsyncAppender en el archivo de configuración log4j que se referirá a un appender real. Para demostración: agregar asyncappender a consola appender en 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>
 38
Author: deepakmodak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-31 16:58:20

Queríamos usar log4j.AsyncAppender pero no pudimos encontrar ningún método setter para adjuntar otros appenders en el archivo log4j.property. Así que extendimos la clase log4j. AsyncAppender y agregamos un setter para agregar otros appenders. Esto ha ayudado al hilo principal del programa a ser independiente de la operación de registro de log4j. Los detalles a continuación.

Log4j entrada:

Define un logger 'com.noPath 'with log4j File Appender, 'FileAppender'. Tenga en cuenta que la ruta del registrador es inmaterial y, por lo tanto, el nombre 'com.noPath '

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

Defina el registrador que necesita el negocio, ' com.business', Adjunte el archivo appender del paso anterior, 'FileAppender', al log4j AsyncAppender a través de una clase personalizada com.registro.AsyncAppenderHelper que extiende log4j AsyncAppender

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

La clase java com.registro.AsyncAppenderHelper extendiendo log4j. AsyncAppender, tenerlo disponible en la ruta de la clase.

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
Author: JobyPGeorge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-28 15:06:08

Respondiendo a mi propia pregunta.

En el archivo de configuración log4j (generalmente es log4j.xml o log4j. properties) deberíamos definir AsyncAppender que se referiría a un appender real(puede ser nuestra propia clase definida como en mi caso).

Así que escribí una clase WebServiceAppender que extiende AppenderSkeleton e implementa 3 métodos abstractos. El método principal es "append" que se conecta al servicio web y le envía toda la información. Eso es.

 -4
Author: Sergey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-20 11:55:51