Buenos ejemplos usando java.util.logging [cerrado]

Quiero usar registros en mi programa. Escuché sobre java.util.logging, pero no sé cómo empezar.

¿Hay ejemplos de lo que puedo hacer con el registro? ¿Cómo usaría el inicio de sesión en mi propio programa?

preguntado el 10 de mayo de 11 a las 13:05

Puedes empezar aquí: slf4j.org/manual.html -

Estoy de acuerdo con Steven Vascellaro. Estoy cansado de ver objetos útiles destruidos debido a la vigilancia de temas sin un fin práctico. Además, no estoy de acuerdo respetuosamente con Jeremy, ya que OP preguntó sobre java.util.logging. También estoy interesado en el registro nativo (¡gracias por la respuesta, grwww!) -

Para registrar datos en una línea: log.log (Level.INFO, "Mi mensaje {0}", nuevo Objeto [] {myDataId}); -

6 Respuestas

java.util.logging evita que tenga que cargar con un archivo jar más con su aplicación, y funciona bien con un buen formateador.

En general, los en la cima de cada clase, Deberías:

private static final Logger LOGGER = Logger.getLogger( ClassName.class.getName() );

Entonces, puede usar varias instalaciones del Logger clase.


Utilización de Level.FINE por cualquier cosa que sea depuración en el nivel superior de flujo de ejecución:

LOGGER.log( Level.FINE, "processing {0} entries in loop", list.size() );

Utilización de Level.FINER / Level.FINEST dentro de los bucles y en lugares donde es posible que no siempre necesite ver tantos detalles al depurar problemas de flujo básicos:

LOGGER.log( Level.FINER, "processing[{0}]: {1}", new Object[]{ i, list.get(i) } );

Utilice las versiones parametrizadas de las instalaciones de registro para evitar generar toneladas de basura de concatenación de cadenas con la que GC tendrá que mantenerse al día. Object[] como el anterior es barato, generalmente en la asignación de pila.


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() como el mensaje aquí, porque entonces cuando yo "grep -n" para "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 pila, y debe tener una expresión regular más avanzada para que coincida con esa línea también, lo que a menudo lo lleva más salida de la que necesita para mirar.

Respondido 18 Jul 16, 22:07

¿Esto escribe en un archivo de algún tipo? Todavía no pude hacer que funcionara en mi programa. Tengo la línea inicial que tienes pero no se ha trabajado nada hasta ahora. - Doug Hauf

¿Cómo ves los registros? Una biblioteca que estoy usando inicializa objetos Logger y usa el .fine() método para iniciar sesión, pero parece que no puedo hacer que los mensajes se muestren ... - Noob anubiano

He estado programando en Java desde 1998. Siempre he encontrado que iniciar sesión en Java es mucho más un dolor de cabeza de lo necesario. 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

Es interesante que nadie haya mencionado dónde se pueden encontrar los archivos de registro. - Ahmedov

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 usando el método addHandler. Asegúrese de llamar a setLevel tanto en el registrador como en el controlador. - Craig Brown

Debería declarar logger así:

private final static Logger LOGGER = Logger.getLogger(MyClass.class.getName());

así que si refactorizas el nombre de tu clase, sigue.

Escribí un artículo sobre Java Logger con ejemplos aquí.

respondido 01 nov., 12:23

Hay muchos ejemplos y también de diferentes tipos de registro. Eche un vistazo al java.util.logging paquete.

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");
  }
}

Respondido 12 ago 17, 01:08

¿Por qué no establecer el nombre del registro como Main.class.getSimpleName()? De esta manera, la herramienta de refactorización lo cambiará correctamente si es necesario y, sin embargo, no es tan torpe como su segunda solución. - Pijusn

Hacer un seguimiento de pila para un nombre de registrador es hack, lento y poco ortodoxo. También se romperá y le dará nombres extraños para los proxies AOP u otra codificación de bytes extraordinaria. - Adam Gent

-1 para el negocio de stacktrace. Es lento y potencialmente evita las optimizaciones del compilador. - phooji

¿Por qué importaría la "lentitud" al inicializar el registrador? Las menciones de lentitud son lo que la mayoría de la gente llamaría optimización prematura (Sí, el código parece un poco pirateado). - mikkom

@AndrewMcKinlay ¿En qué situación se rompe algo? Si se supone que la etiqueta del registrador es el mismo que el nombre de la clase, parece perfectamente correcto hacerlo. Las herramientas de refactorización le cambiarán el nombre automáticamente, mientras que, si se trataba de una cadena codificada, la herramienta de refactorización puede omitirla o decir "¿También quieres cambiar el nombre de esto?". - Pijusn

SLF4J es una mejor fachada de registro que Apache Commons Logging (ACL). Tiene puentes a otros marcos de registro, haciendo llamadas directas a ACL, Log4J o Java Util Logging a través de SLF4J, de modo que puede 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 varias implementaciones de registro. Puede enviar todo a salida estándar, usar Log4J o Logback (recomendado sobre Log4J).

http://www.slf4j.org/

http://logback.qos.ch/

Respondido el 06 de diciembre de 13 a las 13:12

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

Respondido el 06 de enero de 17 a las 20:01

Para una huella mínima, esta es la biblioteca para elegir. - h3xStream

Le sugiero que utilice la utilidad de registro de recursos comunes de Apache. Es altamente escalable y admite archivos de registro separados para diferentes registradores. Mira aquí.

Respondido 30 Abr '14, 02:04

¡Buena sugerencia! sin embargo trata de responder lo que te pregunten, de lo contrario solo deja un comentario;) - Ordiel

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.