如何向Google App Engine添加自定义日志处理程序?

时间:2012-03-23 14:40:54

标签: java google-app-engine java.util.logging

我正在尝试向我的java应用程序添加自定义日志处理程序。我已经实现了一个扩展java.util.Logging.Handler类的InnerLogger类。在我的logging.properties中声明为处理程序:

handlers:com.mycompany.util.InnerLogger

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

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

我可以逐个将自定义处理程序添加到记录器中,但我只是想知道是否有办法将其添加到所有记录器中。

由于

3 个答案:

答案 0 :(得分:3)

我的应用初始化时,我能够向根Handler添加Logger。您可以将此代码放在预热任务或servlet过滤器中。

private static Logger LOG;

...

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

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

答案 1 :(得分:2)

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

答案 2 :(得分: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;
            }
        }
    }
}