¿Cómo configurar el registro de Java usando un archivo de propiedades? (java.util.logging)

82

Tengo un problema estúpido de registro de Java: estoy cargando la configuración de registro desde el archivo de configuración de mi aplicación, pero simplemente no registra nada después de leer el archivo (que se parece mucho a los ejemplos que encontrará en la red, excepto por el configuración adicional de la aplicación; eliminar esto tampoco ayuda). La línea de registro "inicializando ..." parece estar bien, pero la "aplicación de inicio" y cualquier otro mensaje no se registran en la consola, ni se crea el archivo de registro. ¿Que me estoy perdiendo aqui?

El código de Logger se ve así:

...
Logger log = Logger.getLogger("myApp");
log.setLevel(Level.ALL);
log.info("initializing - trying to load configuration file ...");

Properties preferences = new Properties();
try {
    FileInputStream configFile = new FileInputStream("/path/to/app.properties");
    preferences.load(configFile);
    LogManager.getLogManager().readConfiguration(configFile);
} catch (IOException ex)
{
    System.out.println("WARNING: Could not open configuration file");
    System.out.println("WARNING: Logging not configured (console output only)");
}
log.info("starting myApp");
...

Y este es el archivo de configuración:

appconfig1 = foo
appconfig2 = bar

# Logging
handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler
.level = ALL

# File Logging
java.util.logging.FileHandler.pattern = %h/myApp.log
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.level = INFO

# Console Logging
java.util.logging.ConsoleHandler.level = ALL
VolkA
fuente

Respuestas:

28

Bien, la primera intuición está aquí:

handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler
.level = ALL

El analizador de archivos de prop de Java no es tan inteligente, no estoy seguro de que pueda manejar esto. Pero volveré a ver los documentos ...

Mientras tanto, intente:

handlers = java.util.logging.FileHandler
java.util.logging.ConsoleHandler.level = ALL

Actualizar

No, duh, necesitaba más café. No importa.

Si bien pienso más, tenga en cuenta que puede usar los métodos en Propiedades para cargar e imprimir un archivo de apoyo: podría valer la pena escribir un programa mínimo para ver qué cree Java que lee en ese archivo.


Otra actualización

Esta línea:

    FileInputStream configFile = new FileInputStream("/path/to/app.properties"));

tiene un par final extra. No se compilará. Asegúrese de estar trabajando con el archivo de clase que cree que está.

Charlie martin
fuente
Bueno, parece que tiene algo que ver con la línea readConfiguration. Pasé por esto con un depurador y todas las propiedades del LogManager se borran después de esta llamada.
VolkA
5
Oh, sí, lo tengo, estoy usando el mismo flujo de entrada dos veces, así que necesito reposicionarlo usando configFile.reset (); de lo contrario, la llamada a loadConfiguration () no tendrá nada para leer. Por cierto. el) fue solo un error de copia de mi código de trabajo.
VolkA
1
No estoy muy seguro de cuál es la respuesta aquí.
Ondra Žižka
@ OndraŽižka la respuesta es "su código no funcionó debido a un error de sintaxis".
Charlie Martin
101

puede configurar su archivo de configuración de registro a través de la línea de comando:

$ java -Djava.util.logging.config.file=/path/to/app.properties MainClass

de esta manera parece más limpio y más fácil de mantener.

cd1
fuente
1
Sí, probablemente agregaré una verificación si esta propiedad está configurada y dejaré que sobrescriba mi configuración; sin embargo, tener todo esto en un archivo de configuración que funciona de manera inmediata sería bueno. ¡Gracias!
VolkA
12

Probé su código en el código anterior, no use la declaración [ferences.load (configFile);] y funcionará. Aquí se está ejecutando un código de muestra

public static void main(String[]s)
{

    Logger log = Logger.getLogger("MyClass");
    try {
    FileInputStream fis =  new FileInputStream("p.properties");
    LogManager.getLogManager().readConfiguration(fis);
    log.setLevel(Level.FINE);
    log.addHandler(new java.util.logging.ConsoleHandler());
    log.setUseParentHandlers(false);

    log.info("starting myApp");
    fis.close();

    } 
    catch(IOException e) {
    e.printStackTrace();
    }
}
Rana
fuente
1
¿Dónde deberían estar las p.properties en relación con la clase principal?
Luís Soares
9
Logger log = Logger.getLogger("myApp");
log.setLevel(Level.ALL);
log.info("initializing - trying to load configuration file ...");

//Properties preferences = new Properties();
try {
    //FileInputStream configFile = new //FileInputStream("/path/to/app.properties");
    //preferences.load(configFile);
    InputStream configFile = myApp.class.getResourceAsStream("app.properties");
    LogManager.getLogManager().readConfiguration(configFile);
} catch (IOException ex)
{
    System.out.println("WARNING: Could not open configuration file");
    System.out.println("WARNING: Logging not configured (console output only)");
}
log.info("starting myApp");

esto está funcionando .. :) tienes que pasar InputStream en readConfiguration ().

Vikky Kumar
fuente
3

¿Está buscando el archivo de registro en la ruta correcta:% h / one% u.log

Aquí% h se resuelve en su casa: En Windows, este valor predeterminado es: C: \ Documents and Settings (nombre de usuario).

He probado el código de muestra que ha publicado y funciona bien después de especificar la ruta del archivo de configuración (logging.properties a través del código o de los argumentos de Java).

Techzen
fuente
Señor, ¿puedo saber dónde está la documentación en línea que dice que% h resuelve en mi hogar,% u resuelve en otra cosa, etc.?
Luk Aron