El problema es que cada vez que cambie log4j.properties/log4j.xml, debe reiniciar el tomcat [o decir cualquier otro servidor]. ¿Hay alguna solución para volver a cargar la configuración de log4j?¿Es posible volver a cargar dinámicamente el archivo log4j.xml/log4j.properties en Tomcat?
Respuesta
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).
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.
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
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");
*/
}
}
Es un enfoque limpio. –
Otra forma es configurar de Log4jConfigListener en web.xml
No ayuda en la producción. De la documentación, "ADVERTENCIA: Asume un archivo WAR ampliado" – vsingh
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:
¿Es solo Log4j 2? –
@PeterRader de hecho, este atributo solo se admite en log4j 2 – systemfreund
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í
Otro método consiste en configurar un vigilante de archivo usando WatcherService Java Archivo como se explica a continuación enlace y recargar la configuración de Log4J sobre cualquier modificación de archivos.
https://dzone.com/articles/how-watch-file-system-changes
La recarga se puede hacer uso de las API de DOMConfigurator
https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/DOMConfigurator.html
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.
- 1. ¿Es posible volver a cargar la vista sin reiniciar Django?
- 2. En rieles ¿es posible cargar el diseño de clase dinámicamente?
- 3. ¿Cómo volver a cargar gdbinit?
- 4. JQuery para cargar el archivo Javascript dinámicamente
- 5. Cómo forzar a tomcat a volver a cargar los archivos de clase/guerra compilados recientemente
- 6. Obligar a ConfigurationManager a volver a cargar todas las secciones
- 7. ¿Volver a cargar rubygems en irb?
- 8. ¿Cómo volver a cargar TreeStore?
- 9. Vim autocmd (guardar archivo, ejecutar el formateador de código, volver a cargar el archivo)
- 10. Actualizar/volver a cargar Flot en Javascript
- 11. ¿Cómo volver a cargar el módulo de Python en IDLE?
- 12. ¿Es posible "agregar" dinámicamente a classpath en java?
- 13. ¿Cómo forzar a un script a volver a cargar y volver a ejecutar?
- 14. ¿Cuál es una manera fácil y rápida de volver a cargar una aplicación web en tomcat en entorno de desarrollo?
- 15. JSF en Tomcat: ¿por qué es posible?
- 16. ¿Volver a cargar hojas de estilo CSS sin volver a cargar la página?
- 17. ¿Cómo volver a cargar un div sin volver a cargar toda la página?
- 18. Cómo volver a cargar el perfil de usuario desde el archivo de script en PowerShell
- 19. ¿Puedo descargar y volver a cargar dinámicamente (otras versiones del mismo) JAR?
- 20. Response.Redirect strips Referente del encabezado: ¿es posible volver a agregarlo?
- 21. volver a cargar la página en el teléfono
- 22. ¿Cómo volver a cargar una propiedad de configuración creada dinámicamente la próxima vez?
- 23. ¿Cómo cargar y descargar dinámicamente un archivo DLL nativo?
- 24. ¿Es posible registrar paquetes dinámicamente en Symfony2?
- 25. ¿Hay alguna manera de cargar un archivo JS local dinámicamente?
- 26. ¿Es posible deshabilitar jsessionid en el servlet de tomcat?
- 27. Alternativa a la solicitud de TextPad para volver a cargar el archivo
- 28. ¿Volver a cargar .profile en script bash shell (en Unix)?
- 29. En VIM, ¿es posible usar el texto seleccionado en la cláusula sustituta sin volver a escribirlo?
- 30. ¿Volver a cargar una sola fila jqGrid?
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. –