扩展java.util.logging.Logger不工作

扩展java.util.logging.Logger不工作,java,exception-handling,java.util.logging,Java,Exception Handling,Java.util.logging,我想扩展java.util.logging.Logger类 我有以下代码。我在我们的应用程序中“强制出错”,并且没有调用我创建的类 下面是我故意生成的错误,但它不在我编写的代码中: //Generate error to test the logger String[] myStringArray = new String[3]; String test; test = myStringArray[5]; 我也尝试过这一点,但即使我有相同的函数定义,代码中仍然没有: logger.lo

我想扩展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");
这是我的记录器分机。当“引发”未处理的异常时,是否可能触发此操作


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

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

下面是一个必须使用
-Djava.util.logging.manager=bad.idea.OdiousLogManager运行的示例,因此JVM使用新的LogManager:

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

如果您只想侦听事件,那么您应该简单地实现一个并避免扩展记录器。

您在哪里创建记录器类的实例?它是为我们拥有的每个类创建的。下面是一个示例
code
public类AuthModel实现了可序列化的{…私有静态最终记录器Logger=Logger.getLogger(AuthModel.class.getName());…public String part1()抛出IOException{Logger.log(Level.FINE,“in part1”);//--我的扩展类没有被调用
code
您期望getLogger如何()想知道你的子类、返回和它的实例吗?对不起,我确实使用Shift+Enter,但输出似乎没有效果!甚至试图用小减价来包装代码,但似乎不起作用..对不起,新到这个网站定义一个子类和获取该子类的实例是两件不同的事情。老实说,这是一个非常基本的Java和面向对象编程主题,一点也不特定于日志记录。感谢您缺少@override。这似乎是为JUL实现子类化设计的唯一方法,而且有点麻烦。其主要缺点是它不允许您完成我需要的操作,即使用额外的方法(例如,一些助手方法)。@Guss如果您想将应用程序绑定到LogManager和Logger子类,您可以始终强制转换getLogger的结果。
private static final AbhorentLogger=(AbhorentLogger)Logger.getLogger(“Logger.name”)
是的,如果人们被困在一个糟糕的API中,向下投射是最后的避难所…:-(我的经验法则-如果你在向下投射,你在使用一个糟糕的API。
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());
    }
}