util logger how example create java logging

how - logger java import



Cambiar la configuraciĆ³n global para las instancias de Logger (4)

Así que no me gustan todas las respuestas aquí, así que voy a entrar.

Uso del archivo de configuración

Está viendo muchas respuestas que le dicen que use el archivo de configuración porque es la mejor práctica. Quiero explicar mejor cómo hacer esto programáticamente, pero antes de hacerlo, quiero decir que puedo ver de dónde vienen, y en el ánimo de ser objetivo, lo iluminaré un poco (especialmente porque nadie dice por qué es una mala práctica). De hecho, quiero compartir lo que alguien dijo en una respuesta separada de StackOverflow que está relacionada con la configuración programática del nivel de registrador ( ¿Por qué no se muestran los mensajes de registro Level.FINE? ):

Esto no se recomienda, ya que daría como resultado la anulación de la configuración global. Usar esto en su base de código dará como resultado una configuración de registrador posiblemente inmanejable.

En ese sentido, creo que Andy Thomas tiene una buena respuesta relacionada con no hacerlo de manera no programática.

Programar el nivel de forma

Dicho esto, quiero entrar en detalles con respecto a hacerlo programáticamente, porque creo que tiene sus aplicaciones.

Imagine un escenario en el que está escribiendo algo con una interfaz de línea de comando y tiene la opción de especificar la verbosidad de su ejecución, o incluso a dónde va (como en los archivos de registro dinámicos). Puede que me equivoque, pero probablemente no quieras hacerlo estáticamente en un archivo .conf. Especialmente si no desea que su base de usuarios sea responsable de establecer estas cosas (por la razón arbitraria) en el archivo de configuración. Esto ocurre a expensas de la cita anterior, sin embargo. Aquí hay un ejemplo de cómo puede hacerlo programáticamente, manteniendo todos los manejadores existentes en cualquier nivel, y solo FileHandler asume el nuevo nivel:

public static void setDebugLevel(Level newLvl) { Logger rootLogger = LogManager.getLogManager().getLogger(""); Handler[] handlers = rootLogger.getHandlers(); rootLogger.setLevel(newLvl); for (Handler h : handlers) { if(h instanceof FileHandler) h.setLevel(newLvl); } }

Quería ampliar esto sobre la respuesta aceptada por una razón en particular. Cuando lo hace programaticamente, solo quiere asegurarse de establecer el nivel para el registrador y el controlador (es). La forma en que funciona, es que verificará si la solicitud es demasiado baja para el registrador, y si lo es, lo descartará. Luego, los controladores tienen la misma verificación, por lo que querrá asegurarse de que tanto los registradores como los manejadores estén configurados al nivel que desea.

Estoy usando java.util.logging.Logger como motor de registro para mi aplicación. Cada clase usa su propio registrador, es decir, cada clase tiene:

private final Logger logger = Logger.getLogger(this.getClass().getName());

Quiero establecer un nivel de registro para todas mis clases, y ser capaz de cambiarlo (es decir, tener la configuración en un solo lugar). ¿Hay alguna manera de hacer esto, otra que usar una variable de Level global y configurar manualmente cada registrador?


Como Andy answered , en la mayoría de los casos debe usar el archivo de propiedad y el argumento VM, por lo tanto, es independiente de su código.

Pero si quiere ir a un programa por alguna razón (yo mismo tenía una buena razón en un caso), también puede acceder a los Manejadores de esta manera:

Logger rootLogger = LogManager.getLogManager().getLogger(""); rootLogger.setLevel(Level.INFO); for (Handler h : rootLogger.getHandlers()) { h.setLevel(Level.INFO); }

EDITAR Agregué el setLevel al registrador de raíz como lo indicaba searchengine27 en su answer .

Los Handlers son File o Console Handlers que configura mediante las propiedades o también programáticamente.

O cambie los filtros como este:

Logger rootLogger = LogManager.getLogManager().getLogger(""); rootLogger.setFilter(new Filter() { @Override public boolean isLoggable(LogRecord record) { return "something".equals(record.getLoggerName()); } });


Un acercamiento de Java 8 de una línea a la respuesta de Morja :

Arrays.stream(LogManager.getLogManager().getLogger("").getHandlers()).forEach(h -> h.setLevel(Level.INFO));


Una manera fácil es usar un archivo de propiedades de registro, al incluir este argumento de VM:

-Djava.util.logging.config.file="logging.properties"

donde "logging.properties" es la ruta a un archivo que contiene la configuración de registro. Para rutas relativas, el directorio de trabajo del proceso es significativo.

En ese archivo, incluye una línea como esta:

.level= INFO

Esto establece el nivel global, que puede ser anulado para manejadores y registradores específicos. Por ejemplo, el nivel de un registrador específico puede anularse así:

com.xyz.foo.level = SEVERE

Puede obtener una plantilla para un archivo de propiedades de registro de jre6 / lib / logging.properties .