java - org - ¿Cómo puedo acceder a los apiladores Log4J configurados en tiempo de ejecución?
org/apache/logging/log4j/logmanager (5)
Quiero configurar un appender en el 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.
La clase Logger tiene métodos para getAllAppenders() , getAppender() , addAppender() y removeAppender() métodos heredados 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.
Lo haría de esta manera:
- has appender especificado en log4j.properties, pero no se ha agregado al registrador de raíz.
- en tiempo de ejecución, cuando sea necesario, tome log4j.properties, extraiga de él las propiedades que necesita, cree una instancia de su appender y establezca sus opciones leyendo las propiedades extraídas.
- activar el appender
- Logger.getRootLogger (). AddAppender (appender);
- Quítelo cuando termine de usarlo - Logger.getRootLogger (). RemoveAppender (..)
Ahora, si este es su propio appender, hacer (2) sería fácil ya que conoce el significado de las propiedades y sabe 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).
Los apéndices generalmente se agregan al registrador de raíz. Aquí hay un 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 puedes hacer esto en otros registradores además del registrador de raíz, aunque nunca lo he intentado.
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 pude encontrar la forma de acceder a los appenders, excepto a través de un registrador al que se habían adjuntado, así que terminé creando un registrador ficticio y adjuntando los apéndices para poder recuperarlos dinámicamente. Sin embargo, esto no es ideal ya que los recursos utilizados por los appenders (por ejemplo, los archivos) se crean por adelantado, incluso si no se utilizan.
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.
Probé esto y funciona bien para nosotros (log4j 1.2).