Sobre la base de Andreas' answer, no puedo pensar en un par de aproximaciones al tema de la única realizar el formateo si los Logger.isDebugEnabled
vuelve true
:
Opción 1: Pasar de una bandera "no formatear"
Una opción es tener un argumento de método que indique si realizar el formateo o no.Un caso de uso podría ser:
System.out.println(lazyFormat(true, "Hello, %s.", "Bob"));
System.out.println(lazyFormat(false, "Hello, %s.", "Dave"));
donde la salida sería:
Hello, Bob.
null
El código para lazyFormat
es:
private String lazyFormat(boolean format, final String s, final Object... o) {
if (format) {
return String.format(s, o);
}
else {
return null;
}
}
En este caso, el String.format
sólo se ejecuta cuando el format
indicador se establece en true
, y si se establece en false
devolverá un null
. Esto detendría el formateo del mensaje de registro y simplemente enviará información "ficticia".
Así que un caso de uso con el registrador podría ser:
logger.debug(lazyFormat(logger.isDebugEnabled(), "Message: %s", someValue));
Este método no se ajusta exactamente el formato que se pide en la pregunta.
Opción 2: Compruebe el registrador
Otro enfoque consiste en pedir al registrador directamente si isDebugEnabled
:
private static String lazyFormat(final String s, final Object... o) {
if (logger.isDebugEnabled()) {
return String.format(s, o);
}
else {
return null;
}
}
En este enfoque, se espera que logger
serán visibles en el lazyFormat
método. Y el beneficio de este enfoque es que la persona que llama no necesita ser verificar la técnica isDebugEnabled
cuando lazyFormat
se llama, por lo que el uso típico puede ser:
logger.debug(lazyFormat("Debug message is %s", someMessage));
Las versiones más nuevas de Log4J permiten la sustitución de parámetros, vea http://stackoverflow.com/a/14078904/620113 – computermacgyver
¿Funciona esto realmente? Formateará la cadena, pero ¿está haciendo lo "flojo"? Hice una pequeña prueba donde los argumentos de lazyFormat son llamadas a una función que se imprime en System.err y parecía que los argumentos en Object ... o se evalúan incluso si String.format (s, o) no lo es. – OneSolitaryNoob
OneSolitaryNoob - No está haciendo la flojera. El proveedor de la respuesta indica que se puede hacer utilizando el método "isDebugEnabled()" en toString() methdod. He proporcionado un patrón de registro perezoso más general en mi respuesta: http://stackoverflow.com/a/18317629/501113 – chaotic3quilibrium