2012-03-23 9 views
5

Estoy tratando de agregar un controlador de registro personalizado a mi aplicación java. Implementé una clase InnerLogger que amplía la clase java.util.Logging.Handler. Y en mis logging.properties declarado como un controlador:Cómo agregar un controlador de registro personalizado a Google App Engine?

handlers:com.mycompany.util.InnerLogger 

Pero cuando inicio el desarrollo Sever, tengo el siguiente error:

Can't load log handler "com.mycompany.util.InnerLogger" 
java.lang.ClassNotFoundException: com.mycompany.util.InnerLogger 

puedo añadir mi controlador personalizado a los registradores de uno a uno , pero me pregunto si hay alguna forma de agregarlo a todos los registradores.

Gracias

+0

relacionadas: [11499 Issue: Permitir madereros personalizados para AppEngine Java] (https://code.google.com/p/googleappengine/issues/detail?id=11499) – jmehrens

Respuesta

3

Pude agregar un Handler a la raíz Logger cuando mi aplicación se inicializa. Puede poner este código en una tarea de preparación o filtro de servlet.

private static Logger LOG; 

... 

LOG = Logger.getLogger(""); 
LOG.addHandler(myCustomHandler); 

No es tan elegante como el uso de logging.properties, pero es una solución adecuada cuando se ejecuta en GAE.

+0

Esto funcionó para mí, aunque terminó creando instrucciones de registro duplicadas porque simplemente llamé a LOG.addHandler (myCustomHandler). Para solucionarlo, puede eliminar los controladores existentes devueltos desde LOG.getHandlers() y luego agregar su controlador personalizado. – sappenin

+0

+1 ¿Todavía es necesario solucionar el problema a partir de GAE 1.9.1 y conocemos la razón técnica por la cual se ignora la configuración en logging.properties? – Drux

2

tal vez no la solución que estabas buscando, pero ¿ha considerado el uso de Simple Logging Facade for Java (SLF4J) en su aplicación en lugar de utilizar directamente julio?

+0

Esto es lo que termino haciendo , usando SLF4J con Log4J y un appender personalizado. – aimless

1
public static void addStreamHandler(){ 

    // TODO check if appCode has X length 
    CustomHandler handler = new CustomHandler(); 
    LogManager manager = LogManager.getLogManager(); 
    Enumeration<String> e = manager.getLoggerNames(); 
    while (e.hasMoreElements()){ 

     Logger logger = manager.getLogger(e.nextElement()); 
     if (logger.getName().startsWith("com.google"))continue; 
     logger.addHandler(handler); 
     System.out.println(logger.getName()); 
    } 
    System.out.println("***finished*****"); 
} 

public static void removeStreamHandlers(){ 

    LogManager manager = LogManager.getLogManager(); 
    Enumeration<String> e = manager.getLoggerNames(); 
    while (e.hasMoreElements()){ 

     Logger logger = manager.getLogger(e.nextElement()); 
     Handler[] handlers = logger.getHandlers(); 
     for (int i = 0; i < handlers.length; i++){ 
      Handler h = handlers[i]; 
      if (h instanceof CustomHandler){ 
       logger.removeHandler(h); 
       break; 
      } 
     } 
    } 
}