Como criar meu próprio Appender no log4j?

Eu sou novo em log4j. Alguém pode explicar como criar meu próprio Appender? ou seja, como implementar as classs e interfaces e como substituí-lo?

Você deve estender a class AppenderSkeleton, que (citando javadoc) “fornece o código para funcionalidade comum, como suporte para filtragem de limite e suporte para filtros gerais”.

Se você ler o código do AppenderSkeleton, verá que ele manipula quase todos, deixando apenas para você:

  1. anexo void protegido (evento LoggingEvent)
  2. public void close ()
  3. public boolean requiresLayout ()

O método central é anexado. Lembre-se de que você não precisa implementar a lógica de filtragem porque ela já está implementada no doAppend que, por sua vez, chama o append. Aqui eu fiz uma class (bastante inútil) que armazena as inputs de log em uma ArrayList, apenas como uma demonstração.

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

Ok, vamos testar:

 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()); } } 

Você deve ter “primeiro”, “segundo”, “terceiro” impresso; a quarta mensagem não deve ser impressa, pois o nível de log do criador de logs raiz é depurado, enquanto o nível do evento é rastreio. Isso prova que o AbstractSkeleton implementa o “gerenciamento de níveis” corretamente para nós. Então, isso definitivamente parece ser o caminho a percorrer … agora a pergunta: por que você precisa de um appender personalizado enquanto há muitos construídos nesse log em quase qualquer destino? (btw um bom lugar para começar com log4j: http://logging.apache.org/log4j/1.2/manual.html )

Se você gostaria de fazer algumas manipulações ou decisões, você pode fazer assim:

 @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; } } 

Para criar um próprio Appender, basta implementar a interface do Appender e apenas substituí-la. E também estudar este log de início de link

Eu gostaria de gastar a resposta do @AgostinoX para apoiar a configuração do arquivo pro e a capacidade de iniciar e parar a captura de 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; } } 

Agora tudo que você precisa fazer é definir no arquivo log4j.property

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

do que quando você quiser habilitá-lo durante o runtume:

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

e enquanto quiser parar:

 StringBuffer sb = appender.stop(); 

Você encontra um exemplo legal e muito útil em:

http://blog.kimb3r.com/2008/07/improving-log4j-dailyrollingfileappende.html

    Intereting Posts