example ejemplo java log4j appender

java - ejemplo - ¿Cómo crear mi propio appender en log4j?



log4j2 ejemplo (5)

Soy nuevo en log4j. ¿Alguien puede explicar cómo crear mi propio Appender? es decir, cómo implementar las clases e interfaces y cómo anularlo?


Debe extender la clase AppenderSkeleton, que (citando javadoc) "proporciona el código para funcionalidades comunes, como soporte para filtrado de umbrales y soporte para filtros generales".

Si lees el código de AppenderSkeleton, verás que maneja casi todo, y te deja solo:

  1. apéndice de vacío protegido (evento LoggingEvent)
  2. vacío público cerca ()
  3. public boolean requiresLayout ()

El método central es agregar. Recuerde que no necesita implementar la lógica de filtrado porque ya está implementado en doAppend que a su vez incluye append. Aquí hice una clase (bastante inútil) que almacena las entradas de registro en una ArrayList, solo como una demostración.

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

Ok, probemos:

public static void main (String [] 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()); } }

Debería imprimir "primero", "segundo", "tercero"; el cuarto mensaje no debe imprimirse ya que el nivel de registro del registrador de raíz es la depuración mientras que el nivel del evento es el rastreo. Esto demuestra que AbstractSkeleton implementa la "gestión de niveles" correctamente para nosotros. Así que definitivamente parece ser el camino a seguir ... ahora la pregunta: ¿por qué necesita un appender personalizado, mientras que hay muchos integrados en ese registro a casi cualquier destino? (por cierto, un buen lugar para comenzar con log4j: http://logging.apache.org/log4j/1.2/manual.html )



Me gustaría utilizar @AgostinoX para apoyar la configuración del archivo pro y la capacidad de iniciar y detener la captura del registro:

public class StringBufferAppender extends org.apache.log4j.AppenderSkeleton { StringBuffer logs = new StringBuffer(); 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("[StringBufferAppender|start] - Start capturing logs"); StringBuffer logs = new StringBuffer(); captureMode.set(true); } public StringBuffer stop() { //System.out.println("[StringBufferAppender|start] - Stop capturing logs"); captureMode.set(false); StringBuffer data = new StringBuffer(logs); logs = null; return data; } }

Ahora todo lo que tiene que hacer es definir en el archivo log4j.property

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

que cuando quieras habilitarlo durante runtume:

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

y si bien quieres detenerlo:

StringBuffer sb = appender.stop();



Si desea hacer algunas manipulaciones o decisiones, puede hacerlo así:

@Override protected void append(LoggingEvent event) { String message = null; if(event.locationInformationExists()){ StringBuilder formatedMessage = new StringBuilder(); 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().toString()); message = formatedMessage.toString(); }else{ message = event.getMessage().toString(); } 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; } }