2012-03-30 39 views
10

creo que el idioma común para la creación de instancias de java.util.logging.Logger es la siguiente:¿Cómo se evita que se repita al crear un registrador?

public class SomeClassName { 

    private static final Logger LOG = Logger.getLogger(SomeClassName.class.getName()); 

} 

Mi IDE gestionará el cambio de la línea apropiada cuando refactorizar mi código (cambiar el nombre de la clase, por ejemplo). Sin embargo, todavía me molesta que tenga que repetir el nombre de la clase. Lo que realmente me gustaría hacer es algo como Logger.getLogger(getName()) o Logger.getLogger(class.getName()), pero esto no es legal Java en una iniciación estática.

¿Hay una forma mejor de acceder a un registrador que no implique repetirme?

+0

'Logger logger = new logger.getLogger' - ¡Estaría más preocupado por el inminente apocalipsis! –

+0

Para su información, consulte una explicación en las [preguntas frecuentes de sl4j] (http://www.slf4j.org/faq.html#declaration_pattern), marco diferente pero probablemente el mismo razonamiento. – assylias

+0

Gracias, @assylias! Las preguntas frecuentes abordan mi preocupación específica muy claramente. A saber, que "la expresión de la declaración del registrador anterior no es resistente al corte y pegado entre clases". Sin embargo, no proporciona una solución. –

Respuesta

10

Issue 137 of The Java Specialists' Newsletter se ocupa de este problema. Recomienda aplicar una fábrica de registradores, que puede detectar el nombre de clase real, p. generando una excepción y analizando la pila de llamadas.

Encuentro esto personalmente peor que el problema original, pero esto es solo mis 2 centavos. En cualquier caso, técnicamente es interesante, así que aquí está:

public class LoggerFactory { 
    public static Logger make() { 
    Throwable t = new Throwable(); 
    StackTraceElement directCaller = t.getStackTrace()[1]; 
    return Logger.getLogger(directCaller.getClassName()); 
    } 
} 

... 

public class BetterApplication { 
    private final static Logger logger = LoggerFactory.make(); 

    ... 
} 
+2

¿Y el motivo de la votación negativa es ...? –

+1

Esto aborda mi preocupación específica, pero estoy de acuerdo en que es peor que el problema original y no lo utilizaré en mi código. ¡Gracias por la ... solución interesante, sin embargo! :) –

8

Creo una plantilla de código Eclipse y la uso cada vez.

enter image description here

sólo hay que teclear logger y pulse Ctrl +espacio para activarlo.

+3

No creo que sea eso lo que se preguntó, ya que OP menciona específicamente que su IDE lo gestiona. –

+2

Creo que la sugerencia de plantilla de código es válida, ya que el OP menciona que su IDE gestiona los cambios en el nombre de clase, no la generación original de la línea. – davidfrancis

+1

PD Ahora puede incluir importaciones en la plantilla de código Eclipse, lo hace aún más fácil. – davidfrancis

1

Hacemos esto:

private Logger log = Logger.getLogger(this.getClass()); 
+4

Esto no funciona para los registradores 'estáticos'. –

1

uso un plugin llamado log4e que es útil para la explotación forestal.

http://log4e.jayefem.de/

Se puede utilizar para añadir automáticamente antes/después de acceder a un método o una clase entera.
También puede obtenerlo para reemplazar automáticamente System.out.println con declaraciones de logger.
Muy útil.

0

Hay un truco para obtener el nombre de la clase actual de un contexto static, no puede citar de la memoria, pero se trataba de lanzar una excepción dentro del bloque estático y la lectura de seguimiento de la pila para llegar al nombre de la clase. Sin embargo, es bastante complicado, así que en la práctica me repito a mí mismo mejor que jugar esos trucos.

Cuestiones relacionadas