2009-12-15 7 views
36

Quiero configurar un appender al inicio y luego agregarlo y eliminarlo dinámicamente de varios registradores bajo demanda. Prefiero que log4j configure este appender, y solo haga una referencia cuando sea necesario. Si eso no es posible, tendré que crear una instancia del appender y retenerlo.¿Cómo puedo acceder a los apiladores Log4J configurados en tiempo de ejecución?

+0

Quiero hacer exactamente lo mismo. Quiero configurar los appenders en log4j.properties y luego seleccionar algunos y agregarlos a rootLogger dinámicamente en tiempo de ejecución. – Joel

Respuesta

3

La clase Logger tiene métodos para getAllAppenders(), getAppender(), addAppender(), y removeAppender() métodos, heredado de la clase Category. Sin embargo, la clase Categoría está en desuso, y además de eso, nunca he intentado hacer esto antes, pero este podría ser un punto de partida útil.

+2

'Category' ha sido reemplazado por la clase' Logger'. 'Logger' solo hereda de' Category'. Entonces, si el método de 'Category' no está en desuso, está perfectamente bien de usar. –

+1

¿No supone el uso de getAppender() o getAllAppenders() que el appender ya está en el registrador? Quiero configurar el Appender al inicio, pero no adjuntarlo a ninguna categoría al inicio. Solo en tiempo de ejecución podría tomarlo para llamar a addAppender() en un Logger. –

+0

Puede hacer un Appender bajo demanda y agregarlo. –

23

Los apéndices se agregan generalmente al registrador de raíz. He aquí algunos pseudocódigo

// get the root logger and remove the appender we want 
Logger logger = Logger.getRootLogger(); 
Appender appender = logger.getAppender("foo"); 
logger.removeAppender(appender) 

// when we want to add it back... 
logger.addAppender(appender); 

Estoy bastante seguro de que usted puede hacer esto en otros madereros que el registrador de la raíz, así, aunque nunca he intentado.

+8

Correcto, sé que puedo recuperar un appender de un Logger si ya está configurado para adjuntarlo. Sin embargo, estoy buscando una forma de agarrar un appender configurado al inicio que * NO * ya está conectado a un registrador. –

3

Quiero hacer exactamente lo mismo. Quiero configurar los appenders en log4j.properties y luego seleccionar algunos y agregarlos a rootLogger dinámicamente en tiempo de ejecución.

no podía encontrar la manera de acceder a las appenders distintos a través de un registrador a la que habían sido unidas, por lo que acabó creando un registrador simulado, y adjuntando los appenders a ella, así que podría recuperarlos dinámicamente. Sin embargo, esto no es ideal, ya que todos los recursos utilizados por los agregados (por ejemplo, los archivos) se crean por adelantado, incluso si no se utilizan.

+0

Creo que esta es realmente la única solución. El registro del appender es privado para [PropertyConfigurator] (http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PropertyConfigurator.html) o [DOMConfigurator] (http://logging.apache.org /log4j/1.2/apidocs/org/apache/log4j/xml/DOMConfigurator.html). PropertyConfigurator incluso borra su registro una vez que está hecho. – James

0

lo haría de esta manera:

  1. has appender especificado en log4j.properties, pero no se añade a registrador de la raíz.
  2. en tiempo de ejecución, cuando sea necesario, capture log4j.properties, extraiga de ella las propiedades que necesita, cree una instancia de su appender y configure sus opciones leyendo las propiedades extraídas.
  3. activar el appender
  4. Logger.getRootLogger(). AddAppender (appender);
  5. Kick que cuando termine de usarlo -. Logger.getRootLogger() removeAppender (..)

Ahora, si este es su propia appender, haciendo (2) sería fácil, ya que se conoce el significado de las propiedades y saben qué esperar. De lo contrario, es probable que desee utilizar la reflexión para crear una instancia de la clase y llamar a sus definidores de propiedades antes de hacer (3).

0

Si está habilitando/deshabilitando Appenders en tiempo de ejecución que desea hacer, entonces encontré otra solución (aunque no muy elegante). Usando la configuración de log4j agregue todos los Appenders que necesitaría como lo hace normalmente.

En tiempo de ejecución cuando desea "deshabilitar" un appender, agregue un filtro (org.apache.log4j.spi) que devuelve Filter.DENY para cada mensaje de registro. De esta forma, ningún mensaje llega a este Appender. Cuando quiera "habilitar" el Appender, simplemente borre el filtro que agregó arriba.

He probado esto y funciona bien para nosotros (log4j 1.2).

Cuestiones relacionadas