2012-03-23 15 views
5

Próbuję dodać niestandardową obsługę dziennika do mojej aplikacji java. Zaimplementowałem klasę InnerLogger, która rozszerza klasę java.util.Logging.Handler. I w moich logging.properties zadeklarowana jako Handler:Jak dodać niestandardową obsługę dziennika do Google App Engine?

handlers:com.mycompany.util.InnerLogger 

Ale kiedy uruchomić sever rozwoju, mam następujący błąd:

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

mogę dodać moje niestandardowe do obsługi rejestratorów jeden po drugim , ale zastanawiam się, czy istnieje sposób na dodanie go do wszystkich rejestratorów.

Dzięki

+0

pokrewne: [Issue 11499: Pozwól niestandardowe rejestratory dla AppEngine Java] (https://code.google.com/p/googleappengine/issues/detail?id=11499) – jmehrens

Odpowiedz

3

Po uruchomieniu mojej aplikacji udało mi się dodać Handler do korzenia Logger. Możesz umieścić ten kod w zadaniu rozgrzewki lub filtrze serwletu.

private static Logger LOG; 

... 

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

Nie jest tak wdzięczny jak przy użyciu pliku logging.properties, ale stanowi odpowiednie obejście podczas działania na GAE.

+0

To działało dla mnie, chociaż skończyło się tworzeniem zduplikowanych instrukcji logowania, ponieważ nazwałem tylko LOG.addHandler (myCustomHandler). Aby to naprawić, można usunąć istniejące procedury obsługi zwrócone przez funkcję LOG.getHandlers(), a następnie dodać niestandardową procedurę obsługi. – sappenin

+0

+1 Czy nadal konieczne jest obejście problemu z GAE 1.9.1 i czy znamy techniczny powód, dla którego ustawienie w właściwości logging.properties jest ignorowane? – Drux

2

Może nie rozwiązanie, czego szukasz, ale czy bierzesz za pomocą Simple Logging Facade for Java (SLF4J) w aplikacji zamiast korzystać bezpośrednio lip?

+0

To właśnie kończy się robi , używając SLF4J z Log4J i niestandardowym aplikatorem. – 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; 
      } 
     } 
    } 
}