2011-11-23 26 views
20

Tengo una pregunta sobre la configuración de registro jdk. Tengo un EJB (implementado en glassfish) que usa JDK Logging para enviar mensajes. para ello utilizo un registrador de llamada con un código como el siguiente:Registro de Java: ¿cómo redirigir la salida a un archivo de registro personalizado para un registrador?

private static Logger logger = Logger.getLogger("org.imixs.workflow"); 
..... 
     logger.fine(" some info..."); 
.... 

Sé que puedo configurar el nivel de registro para mi registrador añadiendo la siguiente línea en el archivo de logging.properties de Glassfish:

..... 
org.imixs.workflow.level=FINE 

Pero, ¿cómo puedo especificar el archivo de salida para mi registrador? Me gustaría poner todos los mensajes del registrador llamado 'org.imixs.workflow' en un archivo separado. es posible?

Gracias por cualquier ayuda

Respuesta

28

la propiedad patrón ligeramente confuso de FileHandler se puede utilizar para este

handlers=java.util.logging.FileHandler 
# Default global logging level. 
.level=INFO 

#logging level for the foo.bar package 
foo.bar.level=CONFIG 
java.util.logging.FileHandler.pattern=%h/java%u.log 

Un patrón consiste en una cadena que incluye los siguientes componentes especiales que serán reemplazadas en tiempo de ejecución:

"/" la nombre de ruta local de separador

"% t" el sistema de directorio temporal

"% h" el valor de la "user.home" prop sistema Erty

"% g" el número de generación para distinguir los registros rotados

"% u" un número único para resolver conflictos

"%%" se traduce a un único signo de porcentaje "%"

Si desea conectarse a varios archivos a continuación, puede hacerlo por establecer varios controladores para múltiples registradores llamado

#FileHandler for file1  
java.util.logging.FileHandler.pattern = logging_property_test.log 
java.util.logging.FileHandler.limit = 50000 
java.util.logging.FileHandler.count = 1 
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter 

#FileHandler for file2 
logging.FileHandler2.pattern = logging_property_test2.log 
logging.FileHandler2.limit = 50000 
FileHandler.count = 1 
logging.FileHandler2.formatter = java.util.logging.SimpleFormatter 


#setting handler for logger1 
logging.PropertyTestingLogger.handlers=java.util.logging.FileHandler 

#setting handler for logger2 
logging.PropertyTestingLogger2.handlers=logging.FileHandler2 

como se puede ver el truco es que no hay un logging.FileHandler2 que es una clase personalizada y no hace nada sino que se extiende al FileHandler

package logging; 

import java.io.IOException; 
import java.util.logging.FileHandler; 

public class FileHandler2 extends FileHandler { 

    public FileHandler2() throws IOException, SecurityException { 
     super(); 
    } 

} 

Antecedentes: lamentablemente los creadores de Java no esperaban a nadie para iniciar sesión en varios archivos. Si nos fijamos en la fuente de java.util.logging.FileHandler se dará cuenta, que la propiedad patrón se carga por el nombre de la clase:

public class FileHandler extends StreamHandler { 

    private String pattern; 

    private void configure() { 

     String cname = getClass().getName(); 
     pattern = manager.getStringProperty(cname + ".pattern", "%h/java%u.log"); 
+0

¿Pero cómo puedo usar estos patrones para especificar que solo tiene efecto para mi logger nombrado (org.imixs.workflow)? No deseo redirigir los mensajes generales del servidor a mi archivo de registro específico de la aplicación. – Ralph

+0

Actualicé mi publicación en consecuencia. En el ejemplo, el nivel de registro predeterminado se establece en información, pero el paquete foo.bar para configurar –

+0

sí, pero mi pregunta es: ¿es posible establecer un archivo de salida separado para el registrador 'foo.bar'. Sé que puede especificar un nivel de registro separado para cada paquete. ¿Pero cómo definir archivos de registro separados? – Ralph

10

Debe utilizar un FileHandler.

FileHandler fileHandler = new FileHandler("myLogFile"); 
logger.addHandler(fileHandler); 

Ver Example Depot para algunos ejemplos claros configuración de los madereros.

Y puede encontrar these answers útil, para establecer desde el archivo de propiedades.

+3

pero también es posible hacerlo a través del archivo de configuración, de modo que no tuve que especificar un nombre de archivo codificado para el archivo de registro en mi código fuente? – Ralph

3

Con java.util.logging, que NO ES posible simplemente modificando el archivo de configuración.Lamentablemente, debe extender FileHandler y configurar ese controlador para filtrar lo que desea registrar.

Cuestiones relacionadas