2012-03-23 25 views
5

Sto cercando di aggiungere un gestore di log personalizzato alla mia applicazione java. Ho implementato una classe di InnerLogger che estende la classe java.util.Logging.Handler. E nei miei logging.properties dichiarato come un gestore:Come aggiungere gestore di registri personalizzato a Google App Engine?

handlers:com.mycompany.util.InnerLogger 

Ma quando lancio il sever di sviluppo, ho ottenuto il seguente errore:

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

posso aggiungere il mio gestore personalizzato per logger uno per uno , ma mi chiedo solo se c'è un modo per aggiungerlo a tutti i logger.

Grazie

+0

correlati: [Issue 11499: Consentire logger personalizzate per Java AppEngine] (https://code.google.com/p/googleappengine/issues/detail?id=11499) – jmehrens

risposta

3

Sono stato in grado di aggiungere un Handler alla radice Logger all'avvio dell'applicazione. È possibile inserire questo codice in un'attività di riscaldamento o in un filtro servlet.

private static Logger LOG; 

... 

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

La sua non è la grazia di utilizzare logging.properties, ma si tratta di una soluzione adeguata durante il funzionamento a GAE.

+0

Questo ha funzionato per me, anche se ha finito per creare istruzioni di registrazione duplicate perché ho chiamato semplicemente LOG.addHandler (myCustomHandler). Per risolvere il problema, è possibile rimuovere i gestori esistenti restituiti da LOG.getHandlers(), quindi aggiungere il gestore personalizzato. – sappenin

+0

+1 La soluzione è ancora necessaria a partire da GAE 1.9.1 e conosciamo il motivo tecnico per cui l'impostazione in logging.properties viene ignorata? – Drux

2

Potrebbe non la soluzione che stavate cercando, ma avete pensato di utilizzare Simple Logging Facade for Java (SLF4J) nell'applicazione invece di usare direttamente luglio?

+0

Questo è quello che finisce per fare , utilizzando SLF4J con Log4J e un appender personalizzato. – 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; 
      } 
     } 
    } 
}