Quiero usar registros en mi programa. Escuché sobre java.util.logging , pero no sé cómo comenzar.
¿Hay algún ejemplo de qué puedo hacer con el registro? ¿Cómo usaría el registro en mi propio programa?
Quiero usar registros en mi programa. Escuché sobre java.util.logging , pero no sé cómo comenzar.
¿Hay algún ejemplo de qué puedo hacer con el registro? ¿Cómo usaría el registro en mi propio programa?
Respuestas:
java.util.logging
evita que tenga que cargar un archivo jar más con su aplicación, y funciona bien con un buen formateador.
En general, en la parte superior de cada clase , debe tener:
private static final Logger LOGGER = Logger.getLogger( ClassName.class.getName() );
Luego, puede usar varias instalaciones de la clase Logger .
Úselo Level.FINE
para cualquier cosa que esté depurando en el nivel superior del flujo de ejecución:
LOGGER.log( Level.FINE, "processing {0} entries in loop", list.size() );
Uso Level.FINER
/ Level.FINEST
dentro de bucles y en lugares donde no siempre necesita ver tantos detalles al depurar problemas de flujo básicos:
LOGGER.log( Level.FINER, "processing[{0}]: {1}", new Object[]{ i, list.get(i) } );
Use las versiones parametrizadas de las instalaciones de registro para evitar generar toneladas de basura de concatenación de cadenas que GC tendrá que seguir. Object[]
Como arriba es barato, en la pila de asignación por lo general.
Con el manejo de excepciones, siempre registre los detalles completos de la excepción:
try {
...something that can throw an ignorable exception
} catch( Exception ex ) {
LOGGER.log( Level.SEVERE, ex.toString(), ex );
}
Siempre paso ex.toString()
el mensaje aquí, porque cuando " grep -n
" for " Exception
" en los archivos de registro, también puedo ver el mensaje. De lo contrario, estará en la siguiente línea de salida generada por el volcado de la pila, y debe tener un RegEx más avanzado para que coincida también con esa línea, que a menudo le brinda más salida de la que necesita mirar.
.fine()
método para iniciar sesión, pero parece que no puedo hacer que los mensajes se muestren ...
Debería declarar el registrador de esta manera:
private final static Logger LOGGER = Logger.getLogger(MyClass.class.getName());
así que si refactoriza el nombre de su clase, sigue.
Escribí un artículo sobre Java Logger con ejemplos aquí .
Hay muchos ejemplos y también de diferentes tipos para el registro. Eche un vistazo al paquete java.util.logging .
Código de ejemplo:
import java.util.logging.Logger;
public class Main {
private static Logger LOGGER = Logger.getLogger("InfoLogging");
public static void main(String[] args) {
LOGGER.info("Logging an INFO-level message");
}
}
Sin codificar el nombre de la clase :
import java.util.logging.Logger;
public class Main {
private static final Logger LOGGER = Logger.getLogger(
Thread.currentThread().getStackTrace()[0].getClassName() );
public static void main(String[] args) {
LOGGER.info("Logging an INFO-level message");
}
}
Main.class.getSimpleName()
? De esta manera, la herramienta de refactorización la cambiará correctamente si es necesario y, sin embargo, no es tan torpe como su segunda solución.
SLF4J es una mejor fachada de registro que Apache Commons Logging (ACL). Tiene puentes con otros marcos de registro, haciendo que las llamadas directas a ACL, Log4J o Java Util Logging pasen por SLF4J, para que pueda dirigir toda la salida a un archivo de registro si lo desea, con solo un archivo de configuración de registro. ¿Por qué su aplicación usaría múltiples marcos de registro? Porque las bibliotecas de terceros que usa, especialmente las más antiguas, probablemente lo hagan.
SLF4J admite diversas implementaciones de registro. Puede enviar todo a la salida estándar, usar Log4J o Logback (recomendado sobre Log4J).
Sugeriría que utilice la utilidad de registro de recursos comunes de Apache. Es altamente escalable y admite archivos de registro separados para diferentes registradores. Vea aquí .