Pregunta

Me gustaría construir un Appender (o algo similar) que inspeccione Eventos y, en ciertas condiciones, cree registros de Eventos nuevos.

Un ejemplo sería un Apéndice escalador que verifica si se registra una cierta cantidad de eventos idénticos y, de ser así, registra el evento con un nivel de registro más alto. Entonces, podría definir algo como: Si obtiene más de 10 Advertencias idénticas en este registrador, conviértalo en un Error.

Entonces mis preguntas son:

  1. ¿Ya existe algo como esto?

  2. ¿Es un Appender la clase correcta para implementar este comportamiento?

  3. ¿Hay alguna trampa en la que puedas pensar?

Aclaración: Estoy bien con el algoritmo de recopilar y analizar los eventos. Lo haré con una colección dentro del appender. La persistencia no es necesaria para mi propósito. Mi pregunta # 2 es: ¿es un appender el lugar correcto para esto? Después de todo, no es un comportamiento normal crear entradas de registro para un apéndice.

¿Fue útil?

Solución

Logback (sucesor de log4j) le permitirá habilitar el registro de cualquier evento a través de TurboFilters . Por ejemplo, suponiendo que el mismo evento ocurra N o más veces en un período de tiempo determinado, podría forzar la aceptación del evento (independientemente de su nivel). Consulte también DuplicateMessageFilter que hace el inverso (negando eventos recurrentes).

Sin embargo, incluso el inicio de sesión no permitirá que se incremente el nivel del evento de registro. Log4j tampoco lo hará. Ninguno de los marcos está diseñado para esto y le desanimaría de intentar aumentar el nivel sobre la marcha y dentro del mismo hilo. Por otro lado, incrementar el nivel durante el procesamiento posterior es un asunto completamente diferente. Señalar otro hilo para generar un nuevo evento de registro con un nivel superior es una posibilidad adicional. (Haga que su turbo-filtro señale otro hilo para generar un nuevo evento de registro con un nivel superior).

No estaba claro en su pregunta por qué deseaba que se incrementara el nivel. ¿Fue el incremento del nivel una razón en sí misma o fue un medio para un objetivo, que es tener el evento registrado independientemente de su nivel? Si es lo último, entonces los TurboFilters de logback son el camino a seguir.

HTH,

Otros consejos

Puede crear su propio apéndice implementando la interfaz Appender proporcionada por log4j.

http://logging.apache.org /log4j/1.2/apidocs/org/apache/log4j/Appender.html

Ese sería un enfoque. Otra sería usar un apéndice existente y luego escribir algún código que monitoree el registro. Por ejemplo, podría iniciar sesión en la base de datos y luego escribir un proceso que supervise las entradas de registro en la base de datos y cree metaeventos basados ??en lo que ve.

Depende más de con qué se sienta cómodo. Una pregunta con la que tendrá que lidiar es cómo mirar hacia atrás en el registro para crear sus metaeventos. O tendrá que acumular eventos en su apéndice o persistirlos en algún lugar que pueda consultar para construir sus metaeventos. El problema con acumularlos es que si detiene e inicia su proceso, tendrá que volcarlos en algún lugar para que se vuelvan a recoger o comenzar de nuevo cada vez que se reinicie el proceso.

Por ejemplo, supongamos que quiero crear una entrada de registro cada 10 veces que se arroja una NullPointerException . Si tengo las entradas de registro en una base de datos de algún tipo, cada vez que se lanza un NPE ejecuto una consulta para ver cuántos NPE se han lanzado desde la última vez que creé una entrada de registro para ellos. Si solo los cuento en la memoria cada vez que se lanza uno, si reinicio la aplicación después de lanzar 5, si no persisto ese número, perderé la cuenta.

Como Rafe ya señaló, el mayor desafío sería persistir los eventos reales en el Appender , para que sepa que ha llegado el momento de activar su evento (por ejemplo, escalar el nivel de registro).

Por lo tanto, propongo una siguiente estrategia:

  1. Utilice un JDBCAppender personalizado . A diferencia del que se incluye con Log4j, este puede registrar excepciones.
  2. Configure una base de datos incorporada, como HSQLDB , y configure una base de datos con una tabla para el registro de eventos . Resuelve el problema de persistencia, ya que puede usar SQL para buscar tipos de eventos que ocurrieron.
  3. Ejecute un subproceso independiente que supervisa la base de datos y detecta los patrones de eventos deseados.
  4. Utilice un LogManager para acceder Logger s deseado y establezca su nivel manualmente .
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top