2012-03-23 74 views
5

我想添加一个自定义日志处理程序到我的Java应用程序。我已经实现了一个扩展java.util.Logging.Handler类的InnerLogger类。而在我的logging.properties声明为处理程序:如何将自定义日志处理程序添加到Google App Engine?

handlers:com.mycompany.util.InnerLogger 

但是,当我启动开发服务器,我得到了以下错误:

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

我可以用一个我的自定义处理程序添加到一个伐木工人,但我只是想知道有没有办法将它添加到所有记录器。

感谢

+0

相关:[发行11499:针对Java AppEngine上允许自定义记录程序(https://code.google.com/p/googleappengine/issues/detail?id=11499) – jmehrens 2016-09-06 16:57:00

回答

3

当我的应用程序初始化时,我能够将Handler添加到根Logger。您可以将此代码放入热身任务或servlet过滤器中。

private static Logger LOG; 

... 

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

它不像使用logging.properties那样优雅,但它在GAE上运行时是一个适当的解决方法。

+0

这对我很有效,虽然它最终创建了重复的日志记录语句,因为我仅仅调用了LOG.addHandler(myCustomHandler)。 要解决这个问题,您可以删除从LOG.getHandlers()返回的现有处理程序,然后添加您的自定义处理程序。 – sappenin 2012-10-16 02:07:06

+0

+1 GAE 1.9.1是否仍需要变通,并且我们是否知道logging.properties中的设置被忽略的技术原因? – Drux 2014-04-30 10:26:06

2

它可能不是你要找的解决方案,但你有没有考虑在应用程序中使用Simple Logging Facade for Java (SLF4J),而不是直接使用JUL?

+0

这是我最终会做,使用SLF4J和Log4J以及一个自定义appender。 – aimless 2012-04-03 11:57:24

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; 
      } 
     } 
    } 
}