提问者:小点点

extendsjava.util.logging.Logger不工作


我想扩展java.util.logging.Logger类。

我有以下代码。我在我们的应用程序中“强制出错”,并且我创建的类没有被调用。

这是我故意生成的错误,但它不在我编写的代码中:

//Generate error to test the logger
String[] myStringArray = new String[3];
String test;
test = myStringArray[5];    

我也尝试过这个,但即使我有相同的函数定义,它仍然没有进入我的代码:

logger.log(Level.FINE, "test my logger");

这是我的记录器扩展。当“引发”未处理的异常时,是否有可能触发此操作。

import java.util.logging.Level;
import java.util.logging.LogRecord;

public class MyLogger extends java.util.logging.Logger
{

    public MyLogger(String name, String resourceBundleName)
    {
        super(name, resourceBundleName);
        runMyLog();
    }


    public void log(Level level, String msg) {
        runMyLog();
    }   

    public void error(String msg)
    {
        super.log(Level.SEVERE, msg);
        runMyLog();
    }

    public void log(LogRecord record)
    {
        super.log(Level.SEVERE, record.getMessage());
        runMyLog();
    }

    public void severe(String msg) {
        log(Level.SEVERE, msg);
        runMyLog();
    }

    public void runMyLog(){
        String str = "lll";

        str="fdsafasdfdasfasd";
    }
}

共1个答案

匿名用户

正如@leonbloy和@E-Riz所指出的,根据文件:

因此,Logger的任何子类(除非它们与新的LogManager类一起实现)都应该注意从LogManager类中获取Logger实例,并且应该将诸如“isLoggable”和“log(LogRecord)”之类的操作委托给该实例。注意,为了截取所有日志输出,子类只需要覆盖log(LogRecord)方法。所有其他日志记录方法都是作为对这个log(LogRecord)方法的调用来实现的。

下面是一个必须使用< code >-DJ ava . util . logging . manager = bad . idea . odiouslogmanager 运行的示例,因此JVM使用新的日志管理器:

package bad.idea;

import java.awt.Toolkit;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.LogRecord;
import java.util.logging.Logger;

public class OdiousLogManager extends LogManager {

    @Override
    public synchronized Logger getLogger(String name) {
        Logger l = super.getLogger(name);
        if (l == null) {
            l = new AbhorentLogger(name, null);
            super.addLogger(l);
        }
        return l;
    }


    private static class AbhorentLogger extends Logger {

        AbhorentLogger(String name, String resourceBundleName) {
            super(name, resourceBundleName);
        }

        @Override
        public void log(LogRecord record) {
            super.log(record);
            mightyCatHearMeRoar(record);
        }

        private void mightyCatHearMeRoar(LogRecord record) {
            if (super.isLoggable(record.getLevel())) {
                Toolkit.getDefaultToolkit().beep();
            }
        }
    }


    //...
    private static final Logger logger = Logger.getLogger("godaweful");
    public static void main(String[] args) {
        logger.severe(logger.getClass().getName());
    }
}

如果您只想监听事件,那么您应该简单地实现一个自定义处理程序,并避免扩展logger。