扩展java.util.logging.Logger不工作
我想扩展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
//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());
}
}