扩展java.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"); 

这是我的记录器扩展。 当“未提出”exception被“引发”时,是否可能触发此操作。

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

正如@leonbloy和@ E-Riz指出的那样,根据文档 :

因此,Logger的任何子类(除非它们与新的LogManager类一起实现)都应该注意从LogManager类获取Logger实例,并且应该将诸如“isLoggable”和“log(LogRecord)”之类的操作委托给该实例。 。 请注意,为了拦截所有日志记录输出,子类只需要覆盖日志(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()); } } 

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