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

  • usted necesita para implementar el appender interfaz. pero usted debe probablemente a la subclase de uno de los appenders y reemplazar los métodos, por ejemplo, doAppend(LoggingEvent), para satisfacer sus necesidades.
  • lo que si es que la existente appender es la final?
InformationsquelleAutor unknown | 2011-05-20

4 Comentarios

  1. 72

    Debe extender AppenderSkeleton clase, que (citando a javadoc) «proporciona el código para la funcionalidad común, tales como el apoyo para el umbral de filtrado y el apoyo general de los filtros.»

    Si usted lee el código de AppenderSkeleton, verás que se encarga de casi todo, dejando a usted:

    1. protected void append(LoggingEvent evento)
    2. public void cerrar()
    3. public boolean requiresLayout()

    El núcleo es el método append. Recuerde que usted no necesita implementar el filtrado de la lógica, porque ya se ha implementado en doAppend que a su vez llama a anexar.
    Aquí he hecho una (bastante inútil) de la clase que almacena las entradas del registro en un ArrayList, así como una demo.

    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, vamos a probarlo:

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

    Debe tener «primero», «segundo», «tercero» impreso; el cuarto mensaje no debe ser impreso desde el nivel de registro de raíz registrador de depuración, mientras que el nivel de evento es de traza. Esto demuestra que AbstractSkeleton implementa el «nivel de gestión» correctamente para nosotros. Así que, definitivamente, parece el camino a seguir… ahora la pregunta: ¿por qué usted necesita una costumbre appender mientras que hay muchos construidos en dicho registro a casi cualquier destino? (por cierto, un buen lugar para comenzar con log4j: http://logging.apache.org/log4j/1.2/manual.html)

    • he utilizado la clase anterior,no hay Error,.. ¿cómo puedo identificar nuevas Appender se creó?Cómo puedo usarlo?
    • ver la actualización a mi respuesta 🙂
    • ok es cualquier cambio en log4j archivo de propiedades?
    • esta prueba funciona sin cualquier log4j archivo de propiedades
    • Desde logging.apache.org/log4j/1.2/manual.html»Un solicitud de registro de nivel de p en un registrador (sea asignado o heredado, wichever es apropiado) nivel de q, está habilitado si p>=q». La solicitud de registro es de nivel «traza», mientras que el registrador de nivel de «depuración», que es más alto que traza, de modo que no se registra. Recuerde que el registrador no está asignado un nivel, por lo que hereda el nivel de la raíz del registrador. Tener el registrador de registro del nivel de seguimiento de las solicitudes(máximo nivel de detalle!) puede establecer mediante programación(l.setLevel(de Nivel.TRACE);) o(mejor) a través de la propiedad de los archivos que el nivel de «registrador» o de la raíz del registrador.
    • cómo llamar a los servicios web utilizando este Appender..
    • he creado un servicio web,ahora quiero cal el servicio web mediante el uso de este Appender.¿cómo puedo cal?
    • ¿Te refieres a cómo utilizar este Appender desde dentro del servidor web?
    • ya dentro del servidor web..mi servidor web es wowza
    • No sé su servidor web específico. ¿Has probado con las sugerencias de «Inicialización Predeterminada bajo Tomcat» que viene en logging.apache.org/log4j/1.2/manual.html ?
    • ok, Cuando el servidor se inicia ,los archivos de registro de impresión de la instrucción de salida..¿cómo puedo imprimir el que la instrucción de registro en mi propio archivo?
    • Eso no es lo que usted pidió en su pregunta inicial. Si usted tiene que crear su propio Appender subclase, usted debe proporcionar el código para escribir en el disco. Probablemente usted no necesita una costumbre Adicionador de la clase, usted sólo necesita una FileAppender, que los registros en el disco de la caja. Usted acaba de proporcionar el nombre del archivo.
    • Gracias AgostinoX
    • eres bienvenido. Ha resuelto su problema con log4j? Han de extender AppenderSkeleton o utiliza algunos siempre Appender?
    • Ya he creado un propio Appender ,y luego llamé al servicio Web..
    • Mi problema es que aquí enlace
    • Hola ¿sabes cómo hacer esto en las versiones más recientes? Yo estoy pidiendo ya que este no funciona para mí ahora. Me sale un error de que el registrador no tiene una función de «addAppender».

  2. 6

    Si quieres hacer algún tipo de manipulación o decisiones que usted puede hacer esto de esta manera:

    @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;
            }
    }
  3. 2

    Para crear una propia Appender que acaba de implementar el Adicionador de la Interfaz y acaba de anular la misma.
    Y también el estudio de este enlace inicio registro de

  4. 2

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

    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 tienes que hacer es definir en el log4j.archivo de propiedades de

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

    que cuando alguna vez usted quiere habilitar durante runtume:

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

    y mientras quieras pararlo:

    StringBuffer sb = appender.stop();
    • Error: Eliminar «StringBuffer» de la siguiente: StringBuffer registros = new StringBuffer();
    • no es un error.

Dejar respuesta

Please enter your comment!
Please enter your name here