2010-01-22 8 views

Respuesta

22

De http://logging.apache.org/log4j/1.2/faq.html#3.6

¿Hay una manera de conseguir a log4j recargar automáticamente un archivo de configuración si cambia?

Sí. Tanto el DOMConfigurator como el PropertyConfigurator admiten la recarga automática a través del configureAndWatch method. Consulte el API documentation para obtener más detalles sobre .

Debido a que el configureAndWatch lanza un hilo wathdog separada, y porque no hay manera de detener este hilo en log4j 1.2, el método configureAndWatch no es seguro para su uso en J2EE envrironments donde las aplicaciones se reciclados.

Dijo que utilicé con éxito el método PropertyConfigurator # configureAndWatch en un entorno Java EE (Servidor web Sun One, no Tomcat).

+11

Es posible que no note el problema hasta que la aplicación se haya reiniciado o reaplicado un par de veces. El subproceso u otras fugas de recursos pueden terminar derribando su servidor de aplicaciones. –

5

Puede escribir un poco de código de inicialización con los siguientes pasos cortos:

  • escuchar el "BEFORE_START_EVENT",
  • cuando ocurra el evento (una vez por Tomcat reinicio), iniciar log4j utilizando el método configureAndWatch
  • también no se olvide de instalar un gancho de cierre para la limpieza de la rosca observador

Ver esta entrada del blog para más detalles - reload log4j configuration in tomcat

También lo movieron a github.

+2

Si aprueba su respuesta ya que la solución es más útil para mí, pero para mejorar la respuesta (y para mantener los estándares SO), le sugiero que agregue algunos detalles aquí en la respuesta misma. Aquí, déjame editar esa respuesta :) – Zlatko

4

Puede crear una acción de columna o un servlet que vuelva a cargar el archivo de propiedades. Entonces, después de editar el archivo log4j.properties, deberá llamar al servlet para volver a cargarlo.

Por ejemplo:

public class Log4JServlet extends HttpServlet{ 
    private static final long serialVersionUID = 1L; 
    protected static Logger log = Logger.getLogger(Log4JTestServlet.class); 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    response.setContentType("text/html"); 
    PrintWriter out = response.getWriter(); 
    out.println("Reload Log4J prop file"); 
    String path = "C:\\GlassFishESBv22\\glassfish\\domains\\domain1\\config\\log4j.properties"; 
    PropertyConfigurator.configure(path); 

    /* 
    log.debug("debug message"); 
    log.info("info message"); 
    log.warn("warn message"); 
    log.error("error message"); 
    log.fatal("fatal message"); 
    */ 

    } 
} 
+0

Es un enfoque limpio. –

3

Otra forma es configurar de Log4jConfigListener en web.xml

+0

No ayuda en la producción. De la documentación, "ADVERTENCIA: Asume un archivo WAR ampliado" – vsingh

14

Spring Framework A partir de 2.x log4j se puede recargar la configuración periódicamente, en este ejemplo cada 30 segundos:

<configuration monitorInterval="30"> 

Eche un vistazo a here para obtener más información sobre la configuración de log4j 2.x:

+3

¿Es solo Log4j 2? –

+0

@PeterRader de hecho, este atributo solo se admite en log4j 2 – systemfreund

2

Actualización: Si está utilizando lg4j2.xml, la configuración es la única cosa que se necesita para log4j ser gestionado en tiempo de ejecución

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="INFO" monitorInterval="30"> 
    <Loggers> 
------- 
    </Loggers> 
</Configuration> 

intervalo de Monitor de 30 cargas de la log4j cambia cada 30 segundos.

La siguiente solución es si usted está en una versión anterior de log4j.

Sí, puede cambiar el nivel de log4j en tiempo de ejecución sin la necesidad de reiniciar el servidor, siempre que esté utilizando la primavera.

public class OptionalLog4jConfigurer extends Log4jConfigurer implements 
InitializingBean { 

public static final Long DEFAULT_REFRESH = 30000L; 
private static final Log LOG = LogFactory 
.getLog(OptionalLog4jConfigurer.class); 

private String configLocation; 
private Long refreshInterval; 

public OptionalLog4jConfigurer(final String configLocation, 
final Long refreshInterval) { 
this.configLocation = configLocation; 

if (refreshInterval == null) { 
this.refreshInterval = DEFAULT_REFRESH; 
} 
else { 
this.refreshInterval = refreshInterval; 
} 
} 


public void afterPropertiesSet() throws Exception { 
if (!StringUtils.isEmpty(this.configLocation)) { 
LOG.info("Log4J configuration is being customized."); 

this.initLoggingInternal(); 
} 
else { 
LOG 
.info("Using default Log4J configuration. No customization requested"); 
} 
} 

public String getConfigLocation() { 
return this.configLocation; 
} 

public Long getRefreshInterval() { 
return this.refreshInterval; 
} 

} 

A continuación, realice estos cambios en applicationContext.

<bean id="optionalLog4jInitialization" class="com.skg.jetm.OptionalLog4jConfigurer"> 
<constructor-arg index="0" type="java.lang.String" value="${log4j.configuration}" /> 
<constructor-arg index="1" type="java.lang.Long" value="100" /> 
</bean> 

código completo y explicación se puede encontrar aquí

Changing log4j Level dynamically

0

La respuesta Guido García es bastante en el blanco.

Log4j 1 ofrece una forma de volver a cargar la configuración de log4j en un generador de hilos no JEE.

Así que si usted está en un continer JEE, puede resolver su problema trivial por:

(A) Crear el temporizador EJB @Singleton analizar con regularidad su archivo log4j.properties

(b) mira en la implementación del log log4j reloj dado por log4j. Lo que lo hace cuando es el momento de relaoad un archivo es bastante sencilla y cómoda, lo siguiente:

nueva PropertyConfigurator().doConfigure(filename,LogManager.getLoggerRepository());

Simplemente hacer lo mismo, si la marca de tiempo en ustedes cambios en los archivos de configuración. Eso es todo.

Cuestiones relacionadas