2009-06-06 20 views
68

Tengo un problema estúpido de registro 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) lo encontrará en la red a excepción de la configuración de la aplicación adicional; eliminar esto tampoco ayuda). La línea de registro "inicializando ..." parece estar bien, pero la "aplicación de inicio" y cualquier mensaje adicional no se registran en la consola, ni se crea el archivo de registro. ¿Que me estoy perdiendo aqui?¿Cómo configurar el registro Java usando un archivo de propiedades? (java.util.logging)

El código Logger es 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 fichero 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 

Respuesta

23

Vale, primera intuición es aquí:

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

El archivo puntal de Java el analizador no es tan inteligente, no estoy seguro de que lo haga. Pero voy a ir a buscar a los documentos de nuevo ....

Por el momento, trato:

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

actualización

No, duh, se necesita más café. No importa.

Mientras pienso más, tenga en cuenta que puede usar los métodos en Properties para cargar e imprimir un archivo prop: podría valer la pena escribir un programa mínimo para ver lo que java piensa que lee en ese archivo.


Otra actualización

Esta línea:

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

tiene un extremo-paren adicional. No compilará Asegúrate de estar trabajando con el archivo de clase que crees que eres.

+0

Bueno, tiene sentido tener 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 loadConfiguration() no tendrá nada que leer. Por cierto. el) fue solo un error de copiado de mi código de trabajo. – VolkA

80

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

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

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

+0

Sí, probablemente añadiré un cheque si esta propiedad está configurada y dejaré que sobrescriba mi configuración; sin embargo, tener este archivo de configuración todo en uno que funciona bien es bueno. ¡Gracias! – VolkA

3

¿Está buscando el archivo de registro en el camino correcto: % h/uno u.log%

Aquí% h resuelve a su casa: En Windows Este defecto es: C : \ Documents and Settings (nombre_usuario).

He intentado con 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 de código o java args).

12

He intentado su código en el código anterior no uso [preferences.load (configFile);] declaración y funcionará.aquí se está ejecutando código de ejemplo

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(); 
    } 
} 
+0

¿dónde deberían estar las propiedades de p p en relación con la clase principal? –

4
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 .. :) usted tiene que pasar InputStream en readConfiguration().

Cuestiones relacionadas