Yo, soy asin Yo en el universo
El Weblog de ese insignificante ser llamado David Bonilla
M2012

20050404 Monday April 04, 2005

¿ Bugcito en log4j ?
Yo, keko y muchos mas extendemos log4j para ampliarlo y adaptarlo a nuestras aplicaciones. En concreto, yo no utilizo el objeto Logger sino un objeto Log que extiende del mismo y facilita la gestion de push y pop del mismo entre otras muchas cosas.

Para poder utilizar tu propia clase extendida de Logger tienes que crear una clase que herede de LogFactory y, en concreto, sobreescribir el metodo makeNewLoggerInstance que devuelve un Logger para que devuelva una nueva instancia de tu objeto extendido. Despues, cuando quieres instanciar un objeto extendido de Logger, en vez de hacer el clasico Logger.getLogger(String) utilizas Logger.getLogger(String, LogFactory) donde LogFactory es tu factoria extendida.
Como veis, sencillo y elegante, sin embargo algo obscuro se esconde bajo la superficie ;).

Normalmente, cuando se instancia un log, se califica el mismo con el nombre de la clase en la que se instancia (Ej. Logger.getLogger("com.foo.Bar")) aunque se puede calificar "solo" con el nombre del paquete, o con lo que queramos ("pepino", "jarroncho", etc.).

Nosotros, ademas de extender log4j tenemos un pequeño "cache" de logs que guarda las distintas instancias de Logger por eso, solemos calificar por paquetes en vez de por clases, se crea una instancia por paquete en vez de por cada una de las clases que contienen. Y AQUI PUEDE APARECER EL PROBLEMA.

Si te instancias un objeto Logger, calificandolo con el mismo nombre de la categoria que has puesto en tu log4.properties, te sale una CascotazoDeLaMuerteException. Es decir, imaginemos que en nuestro log4j.properties tenemos una categoria tal que asi:

- log4j.logger.com.varma.util.database=DEBUG

Bien, cuando yo me instancio mi objeto que hereda de Logger (en mi caso Log) puedo hacer esto:

        Log log = Log.getLog("com.varma.util.database.otropaquete");

o esto otro:

        Log log = Log.getLog("com.varma.util.database.Miclase");

Pero como haga esto, la aplicacion se me muere;

        Log log = Log.getLog("com.varma.util.database");

¿ Curioso ? ¿ Os ha pasado ?. La verdad es que me parece demasiado increible como para que sea cierto, seguiremos investigando.

(2005-04-04 13:22:17.0) Permalink Comentarios [3]



Archivos
Busca en el weblog
Navegacion
  Get Firefox
   Bitacoras.com
De donde venis