Creo que una buena solución sería que el código sería eficiente como.
Tenga en cuenta que log4j está en desuso. Su autor lo dejó como está, para evitar romper la compatibilidad, pero creó uno nuevo, SLF4J (http://www.slf4j.org/). Proporciona tanto una fachada como una implementación, de acuerdo con la distinción commons-logging/log4j, pero sin los defectos de cada ...
Creo que, en esta nueva instalación de registro, puede enviar parámetros de Objeto al registro , y que el nivel se evalúa antes de convertir los Objetos (a Cadena u otros). La idea es usar una cadena de formato y parámetros.
Nuestro código no utiliza slf4j, pero tenemos métodos de utilidad que hacen exactamente eso. Se codifica más o menos de la siguiente manera (de memoria):
public enum LogLevel {
FATAL, ERROR, WARNING, INFO, DEBUG;
public void log(Logger logger, String format, Object... parameters) {
if (isEnabled(logger)) {
logImpl(logger, String.format(format, parameters));
}
}
public boolean isEnabled(Logger logger) {
switch(this) {
case WARNING : return logger.isWarningEnabled();
case INFO : return logger.isInfoEnabled();
case DEBUG : return logger.isDebugEnabled();
default: return true;
}
}
private void logImpl(Logger logger, String message) {
switch(this) {
case WARNING : logger.warn(message);
// other cases
}
}
}
Se utiliza como:
public void myMethod(Object param) {
LogLevel.WARNING.log(LOGGER, "What is my message ....", "myMethod", param);
}
ACTUALIZACIÓN: Si necesita llamar a un método en el registro .. .
Una posibilidad es utilizar toString
método. Esto es apropiado si su registro es 'técnico', y se utilizará también cuando se depure.
Si su registro es más funcional (no dirigida a la developper), sugiero para definir una interfaz (es funcionalmente sonido en ese caso, lo que es útil para proporcionar significado):
public interface Detailable { // the name could also suggest logging?
String getFullDetails();
}
Implemente esa interfaz en cualquier objeto que necesite pasar como objeto de registro, con un cálculo complejo para compilar el registro.
No estoy seguro de que log4j no lo haga ya (comprobación interna que esDebugEnabled = true antes de imprimir una gran cantidad y tiempo para evaluar cosas) ... ¿lo has comprobado? –
log4j no comprueba el nivel de registro en sí (por supuesto). La razón por la cual las personas están usando el indicador 'isDebugEnabled()' es que quieren evitar la sobrecarga causada por la construcción de cadenas ('" Interesante, mis foojes están equivocados: "+ getFullDetails()' en el ejemplo) y similares . – sfussenegger
log4j hace check isDebugEnabled primero. Estoy tratando de evitar la evaluación getFullDetails si Debug no está habilitado. –