Pregunta

Me gustaría filtrar los eventos de registro que provienen de un componente específico de una biblioteca de terceros, en función del contenido del mensaje de registro. Solo quiero que este filtrado se aplique cuando el evento de registro es generado por un registrador específico: " org.restlet.Component.LogService " ;. El filtrado en sí mismo es solo una coincidencia básica contra el mensaje del evento de registro.

Tengo un AsyncAppender central que se registra en varios apéndices. En el caso de que los eventos que provienen de LogService no se filtren, me gustaría que sean tratados de la misma manera que ahora, es decir, que se envíen al AsyncAppender. No quiero agregar un filtro al AsyncAppender, porque esto parece terriblemente ineficiente (no necesito filtrar TODOS los eventos, solo los que provienen del registrador LogService).

Entonces, lo que he intentado hacer es asociar el registrador LogService con un Appender personalizado, que a su vez está asociado con un Filtro personalizado:

    <appender name="filtered" class="mystuff.FilteredAppender">
            <filter class="mystuff.EventFilter"/>
            <appender-ref ref="ASYNC"/>
    </appender>

    <logger name="org.restlet.Component.LogService">
            <appender-ref ref="filtered"/>
    </logger>

El error que recibo actualmente ...

  

log4j: ERROR No se ha establecido el diseño para el apéndice llamado [filtrado].

... me dice que hay algo mal con mi diseño: no creo que mi apéndice personalizado deba preocuparse por el diseño, ya que realmente solo necesita pasar o no pasar el evento de registro. Además, este enfoque requiere dos clases personalizadas, y una de ellas (mystuff.FilteredAppender) no agrega ningún valor, solo está ahí para contener el filtro personalizado.

Me encantaría hacer algo mucho más limpio como ...

    <logger name="org.restlet.Component.LogService">
            <filter class="mystuff.EventFilter"/>
    </logger>

... pero esto aparentemente no es compatible con el marco log4j.

¿Hay una buena forma limpia de filtrar eventos de la forma en que quiero hacerlo?

¿Fue útil?

Solución

Este entrada en el tablero de mensajes describe una solución que pude poner a trabajar. Parece una pena tener que usar un AsyncAppender como soporte del filtro, pero parece que esa es la mejor opción sin crear un nuevo Appender personalizado. Así que termino con:

    <appender name="filtered" class="org.apache.log4j.AsyncAppender">
            <filter class="mystuff.EventFilter"/>
            <appender-ref ref="ASYNC"/>
    </appender>

    <logger name="org.restlet.Component.LogService" additivity="false">
            <appender-ref ref="filtered"/>
    </logger>

Pero ciertamente me interesaría si alguien sabe de un enfoque aún mejor. :-)

Otros consejos

Log4J tiene una Biblioteca de extras ( JavaDoc) que proporciona LoggerMatchFilter , para filtrar los nombres de Logger. Establece el nombre del registrador y si acepta o rechaza (el valor predeterminado es aceptar).

En el método decide del filtro, compara el nombre del registrador con LoggingEvent object.getLoggerName () para la igualdad. Es un filtro sorprendentemente simple y obvio y estoy bastante sorprendido de que no venga por defecto con Log4j.

Alternativamente, si solo desea silenciar bibliotecas de terceros, he encontrado que lo siguiente es útil:

<!-- LOGGER NEUTER -->
<logger name="org.apache"><level value="WARN"/></logger>
<logger name="org.springframework"><level value="WARN"/></logger>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top