Si el registrador es estático privado o no


¿El registrador debe ser declarado estático o no? Por lo general, he visto dos tipos de declaración para un registrador :

    protected Log log = new Log4JLogger(aClass.class);

O

    private static Log log = new Log4JLogger(aClass.class);

¿Cuál debe usarse? ¿cuáles son los pros y los contras de ambos?

Author: ROMANIA_engineer, 2010-10-02

4 answers

La ventaja de la forma no estática es que puede declararla en una clase base (abstracta) como sigue sin preocuparse de que se use el nombre de clase correcto:

protected Log log = new Log4JLogger(getClass());

Sin embargo, su desventaja es obviamente que se creará una instancia de logger completamente nueva para cada instancia de la clase. Esto puede no ser costoso per se, pero agrega una sobrecarga significativa. Si desea evitar esto, le gustaría usar el formulario static en su lugar. Pero su desventaja es que usted tiene que declararlo en cada clase individual y tener cuidado en cada clase que el nombre de clase correcto se ha utilizado durante la construcción de logger porque getClass() no se puede utilizar en contexto estático. Sin embargo, en el IDE promedio puede crear una plantilla de autocompletar para esto. E. g. logger + ctrl+space.

Por otro lado, si obtiene el logger por una fábrica que a su vez puede almacenar en caché los loggers ya instanciados, entonces usar la forma no estática no agregará mucha sobrecarga. Log4j por ejemplo tiene un LogManager para este propósito.

protected Log log = LogManager.getLogger(getClass());
 90
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-01 20:37:05

Solía pensar que todos los registradores deberían ser estáticos; sin embargo, este artículo en wiki.apache.org trae algunas preocupaciones importantes de memoria, con respecto a las fugas de classloader. Declarar un logger como estático evita que la clase declarante (y los cargadores de clases asociados) sean basura recolectada en contenedores J2EE que usan un cargador de clases compartido. Esto dará lugar a errores de PermGen si vuelve a implementar su aplicación suficientes veces.

Realmente no veo ninguna manera de evitar este cargador de clases problema de fugas, aparte de declarar a los registradores como no estáticos.

 42
Author: piepera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-30 16:52:42

La diferencia más importante es cómo afecta a sus archivos de registro: ¿en qué categoría van los registros?

  • En su primera opción, los registros de una subclase terminan en la categoría de la superclase. Eso me parece muy contrario a la intuición.
  • Hay una variante de tu primer caso:

    Registro protegido log = new Log4JLogger (getClass ());

    En ese caso, su categoría de registro dice en qué objeto estaba trabajando el código registrado.

  • En tu segundo choice (private static), la categoría de registro es la clase que contiene el código de registro. Así que normalmente la clase que está haciendo lo que se está registrando.

Recomiendo encarecidamente esa última opción. Tiene estas ventajas, en comparación con las otras soluciones:

  • Existe una relación directa entre el registro y el código. Es fácil encontrar de dónde vino un mensaje de registro.
  • Si alguien tiene que ajustar los niveles de registro (que se hace por categoría), es por lo general, porque están interesados (o no) en algunos mensajes particulares, escritos por una clase en particular. Si la categoría no es la clase que está escribiendo los mensajes, es más difícil ajustar los niveles.
  • Puede iniciar sesión en métodos estáticos
  • Los registradores solo necesitan ser inicializados (o buscados) una vez por clase, por lo que al inicio, en lugar de para cada instancia creada.

También tiene desventajas:

  • Necesita ser declarado en cada clase donde se registran mensajes (no reutilización de registradores de superclase).
  • Debe tener cuidado de poner el nombre de clase correcto al inicializar el registrador. (Pero los buenos IDE se ocupan de eso por ti).
 14
Author: Wouter Coekaerts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-02 20:44:51

Utilice la inversión del control y pase el registrador al constructor. Si creas el logger dentro de la clase vas a tener un tiempo difícil con tus pruebas unitarias. Estás escribiendo pruebas unitarias, ¿verdad?

 3
Author: Wayne Allen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-01 20:31:40