2016-06-22 73 views
1

我想扩展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"); 

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

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

你在哪里创建记录类的实例? –

+0

它是为我们每个班级创建的。这里是一个示例 '代码' public class AuthModel implements Serializable {private static final Logger logger = Logger.getLogger(AuthModel.class.getName()); ... public String part1()throws IOException {0} {0128} // ---我的扩展类没有被调用 '代码' – SomeGuy

+0

你如何期望getLogger()知道你的子类并返回它的实例? –

回答

0

由于@leonbloy和@ E-里兹指出,每documentation

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

所以这里将是必须-Djava.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()); 
    } 
} 

如果你只想要听的事件,那么你应该简单地实现custom handler和避免扩展记录器。

+0

由于缺少@override。 – SomeGuy

+0

这似乎是继承JUL实现的唯一设计方法,并且它有点麻烦。这样做的主要缺点是它不允许你做我需要的,也就是用其他方法(例如,一些辅助方法)来扩展'Logger' API。 – Guss

+0

@Guss如果您想将应用程序绑定到LogManager和Logger子类,则始终可以投射getLogger的结果。 '私人静态最终AbhorentLogger记录器=(AbhorentLogger)Logger.getLogger(“logger.name”);' – jmehrens