2012-06-20 10 views
21

¿Cómo se usa AsyncAppender en log4j para escribir un mensaje de registro en el servicio web? ¿Debo crear mi propio Appender que extienda AsyncAppender o simplemente adjunte appenders personalizados al AsyncAppender? Si la segunda opción es correcta, ¿dónde debería tomar el objeto AsyncAppender? ¿Hay algún ejemplo?Cómo utilizar AsyncAppender en log4j?

Respuesta

-4

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 amplía AppenderSkeleton e implementa 3 métodos abstractos. El método principal es "agregar" que se conecta al servicio web y le envía toda la información. Eso es.

+19

Por favor, proporcione su código de ejemplo para otros usuarios. gracias – philipp

+2

¿puede por favor proporcionar el código o algunas líneas? –

35

Agregue AsyncAppender en el archivo de configuración log4j que se referirá a un appender real. Para demo: asyncappender añadiendo a la 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> 
+3

Por razones de rendimiento, es mejor restringir siempre la prioridad de raíz a un nivel superior. Ver http://stackoverflow.com/a/13144054/603516. – Vadzim

+2

¿Puede proporcionar el mismo ejemplo pero en formato de archivo log4j.properties? –

+0

el número de línea no mostrará – fudy

9

Queríamos utilizar log4j.AsyncAppender pero no se han encontrado métodos setter para unir 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 a que el hilo del programa principal sea independiente de la operación de registro de log4j. Los detalles a continuación.

entrada log4j:

definir un 'com.noPath' registrador con log4j Archivo Appender de, 'FileAppender'. Tenga en cuenta que el camino registrador es inmaterial y de ahí el nombre 'com.noPath'

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

Definir el registrador que las necesidades de negocio, 'com.business', conecte el archivo de appender paso anterior, 'FileAppender', a la log4j AsyncAppender a través de un com.log.AsyncAppenderHelper clase personalizada que se extiende log4j AsyncAppender

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

el com.log.AsyncAppenderHelper clase Java que se extiende log4j.AsyncAppender, lo tiene disponible en la ruta de 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)); 
     } 

    } 
} 
+2

buen ejemplo de cómo usar el appender asincrónico en log4j.properties – hudi

+0

Cuidado, esto puede romperse fácilmente. Intenté esto pero el PropertyConfigurator quita los appenders y los vuelve a agregar mientras que procesa. Mi AsyncAppenderHelper terminó con un appender cerrado. Es por eso que necesita usar DomConfigurator (xml) para usarlo. –

+1

@AlanYackel no hay opción de cómo usarlo con log4j.properties? No puedo usar el archivo xml – hudi