Foros del Web » Programación para mayores de 30 ;) » Java »

log4j - ruta dinamica para el log

Estas en el tema de log4j - ruta dinamica para el log en el foro de Java en Foros del Web. Buenas gente, estoy agregando los logs de log4j en mi aplicacion y me surgio la necesidad de agregar o inventar una ruta para el archivo ...
  #1 (permalink)  
Antiguo 16/11/2011, 07:02
 
Fecha de Ingreso: febrero-2008
Mensajes: 42
Antigüedad: 16 años, 9 meses
Puntos: 0
log4j - ruta dinamica para el log

Buenas gente, estoy agregando los logs de log4j en mi aplicacion y me surgio la necesidad de agregar o inventar una ruta para el archivo de logs. En otra palabras, quiero que el archivo de logs no este por defecto a donde lo indicamos en el archivo log4j.properties:

Código:
log4j.appender.file.File=C:\\Tools\\apache-tomcat-7.0.21\\webapps\\test-security-client\\loging.log
Por lo que, por ejemplo, me gustaria cargar la ruta dependiendo con que version de tomcat lo ejecute, por que si no, si o si tiene que existir esa ruta (y puede que no).

Eh estado mirando varios post, tratando de buscar una respuesta y la respuesta mas aceptable dice (traducido):

Código:
log.dir=/var/log/foo
rrd.dir=${log.dir}/rrd
datestamp=yyyy-MM-dd/HH:mm:ss.SSS/zzz
roll.pattern.hourly=.yyyy-MM-dd.HH
roll.pattern.daily=.yyyy-MM-dd

# catchAll.log -- Default catch-all.
log4j.rootLogger=DEBUG, defaultLog
log4j.appender.defaultLog=org.apache.log4j.DailyRollingFileAppender
log4j.appender.defaultLog.DatePattern=${roll.pattern.daily}
log4j.appender.defaultLog.File=${log.dir}/catchAll.log
log4j.appender.defaultLog.layout=org.apache.log4j.PatternLayout
log4j.appender.defaultLog.layout.ConversionPattern=%d{${datestamp}} [%t] %-5p %m%n
Cita:
Traduccion: Mucha gente se queja de que log4j te fuerza a hardcodear la ubicacion del archivo de logs. Pero, es posible elegir la ubicacion de este archivo, especialmente si usas la propiedad de sustitucion ${log.dir}, asi es como es:

String dynamicLog = // log directory somehow chosen...
Properties p = new Properties( Config.ETC + "/log4j.properties" );
p.put( "log.dir", dynamicLog ); // overwrite "log.dir"
PropertyConfigurator.configure( p );
Creo que la solucion es lo que ando buscando, el tema es que no se me ocurre de hacerlo!. Y aca me entran las dudas:

1- El archivo log4j.properties de log4j no es lo primero que se carga?
2- Para agregar ese codigo que modifica la variable log.dir, tengo que crear una nueva clase? como hago para ejecutarla antes que se cargue log4j.properties o es despues? (creo que me hice un nudo de conceptos!)

Estoy usando Spring y soy bastante nuevo con todo! jeje...

Alguien me podria tirar un salvavidas o aclararme los conceptos??

Gracias por leer de antemano!! Saludos!
  #2 (permalink)  
Antiguo 16/11/2011, 08:01
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 6 meses
Puntos: 306
Respuesta: log4j - ruta dinamica para el log

En el properties puedes usar rutas relativas para indicar la ubicación del archivo, con eso ya consigues que cada tomcat que lo ejecute tenga su propio log.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #3 (permalink)  
Antiguo 21/11/2011, 11:14
 
Fecha de Ingreso: febrero-2008
Mensajes: 42
Antigüedad: 16 años, 9 meses
Puntos: 0
Respuesta: log4j - ruta dinamica para el log

hmm.. no se bien a lo que te refieres con "usar rutas relativas en el log4j.properties", podrias decirme como??

Bueno yo hice un par de cambios para lograr esto pero todavia no funciona a la perfeccion. Lo que hice primero fue crear un listener como el siguiente:

Código:
public class MyContextListener extends ContextLoaderListener {
	
	public void contextInitialized(ServletContextEvent event) {
        ServletContext context = event.getServletContext();
        System.setProperty("rootPath", context.getRealPath("/"));
	}

	public void contextDestroyed(ServletContextEvent event) {	
		
	}
}
En el listener lo que hago es definir un "system propertie" llamado "rootpath" en el cual guardo el servelet context que es el path del contenedor.. en este caso el path del contenedor de Tomcat.

Y en el archivo web.xml:
Código:
   <listener>
    <listener-class>com.tangoe.test.listeners.SynergyContextListener</listener-class> 
  </listener>
Hago la llamada del listener.

Y en el archivo log4j.properties:
log4j.appender.file.File=${rootPath}WEB-INF/logs/TestLogs.log

Bueno.. esto funciona de maravilla pero no en todos los casos. Es decir:

Tengo el cliente y un serviudor corriendo en Tomcat.
Cuando inicio tomcat con ambas aplicaciones, entonces el archivo no se genera.
Pero cuando re-ejecuto el cliente (en este caso es donde puse las modificaciones de arriba), entonces si se crea el archivo y funciona perfectamente.

Lo que sospecho que esta pasando es que el archivo log4j.properties lo lee antes de que yo ejecute el listener y por ende, antes de que cree ese system propertie. Por lo que cuando re-ejecuto el cliente, la propiedad del sistema permanece, entonces cdo arranca denuevo log4j.properties si se carga bien.

Alguna idea de como resolver esto???
  #4 (permalink)  
Antiguo 21/11/2011, 12:06
 
Fecha de Ingreso: febrero-2008
Mensajes: 42
Antigüedad: 16 años, 9 meses
Puntos: 0
Respuesta: log4j - ruta dinamica para el log

Bueno.. ahi creo que logre solucionar el problema cargando nuevamente las configuraciones despues de setear el path.

Código:
public class MyContextListener extends ContextLoaderListener {
	
	public void contextInitialized(ServletContextEvent event) {
        ServletContext context = event.getServletContext();
        System.setProperty("rootPath", context.getRealPath("/"));
        PropertyConfigurator.configure(System.getProperty("rootPath")+"WEB-INF/classes/log4j.properties");

	}

	public void contextDestroyed(ServletContextEvent event) {	
		
	}
}
Bueno espero que les sirva y si encuentran una solucion mejor! diganme!

Gracias a los q pasaron y se tomaron el tpo de leer!

Etiquetas: dinamica, log, log4j, ruta, string, aplicaciones
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:59.