Buenos ejemplos usando java.util.logging [cerrado]

273

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?

Renato Dinhani
fuente
77
Puede comenzar aquí: slf4j.org/manual.html
Jeremy
1
Estoy de acuerdo con Steven Vascellaro. Estoy cansado de ver elementos útiles destruidos debido a la vigilancia policial sin un fin práctico. Además, respetuosamente no estoy de acuerdo con Jeremy, ya que OP preguntó sobre java.util.logging. También estoy interesado en el registro nativo (¡gracias por la respuesta, grwww!)
NOP
Para registrar datos en una línea: log.log (Level.INFO, "Mi mensaje {0}", nuevo Objeto [] {myDataId});
Mitja Gustin

Respuestas:

335

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.FINEpara 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.FINESTdentro 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.

grwww
fuente
3
¿Esto escribe en un archivo de algún tipo? No pude hacerlo funcionar todavía en mi programa. Tengo la línea inicial que tienes, pero nada se ha trabajado hasta ahora.
Doug Hauf
55
¿Cómo ves los registros? Una biblioteca que estoy usando inicializa los objetos Logger y usa el .fine()método para iniciar sesión, pero parece que no puedo hacer que los mensajes se muestren ...
Anubian Noob
77
He estado programando en Java desde 1998. Siempre he encontrado que iniciar sesión en Java es mucho más dolor de cabeza de lo que debería ser. Esta es, con mucho, la explicación más sencilla de cómo iniciar sesión en Java que he leído. Conciso también.
Steve McLeod
30
Es interesante que nadie haya mencionado dónde se pueden encontrar los archivos de registro.
Ahmedov
44
Si se pregunta dónde van los registros, asegúrese de haber configurado un controlador para el registrador. Para simplemente enviar registros a la consola, use un nuevo ConsoleHandler y agréguelo a su registrador utilizando el método addHandler. Asegúrese de llamar a setLevel tanto en el registrador como en el controlador.
Craig Brown, el
67

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í .

hanoo
fuente
53

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");
  }
}
Ankit
fuente
15
¿Por qué no establecer el nombre del registro como 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.
Pijusn
3
Hacer un stacktrace para un nombre de registrador es hack, lento y poco ortodoxo. También se romperá y le dará nombres extraños para los proxys de AOP u otros códigos de bytes extraordinarios.
Adam Gent
9
-1 para el negocio de stacktrace. Es lento y potencialmente evita las optimizaciones del compilador.
phooji
44
¿Por qué importaría la "lentitud" al inicializar el registrador? Menciones de lentitud son lo que la mayoría de la gente llamaría optimización prematura (Sí, el código parece un poco hack).
mikkom
3
@AndrewMcKinlay ¿En qué situación se rompe algo? Si se supone que la etiqueta del registrador es la misma que el nombre de la clase, parece perfectamente correcto hacerlo. Las herramientas de refactorización van a cambiarle el nombre automáticamente mientras que, si se trata de una cadena codificada, la herramienta de refactorización puede omitirla o decir "¿También quieres cambiarle el nombre?".
Pijusn
23

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).

http://www.slf4j.org/

http://logback.qos.ch/

bcody
fuente
9

Yo usaría minlog , personalmente. Es extremadamente simple, ya que la clase de registro es unos pocos cientos de líneas de código.

Chris Dennett
fuente
3
Para una huella mínima, esta es la biblioteca para elegir.
h3xStream
0

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í .

nIKUNJ
fuente
11
¡Buena sugerencia! sin embargo, trate de responder lo que preguntan, de lo contrario solo deje un comentario;)
Ordiel