我想扩展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)
@leonbloy和@ E-Riz根据documentation指出:
因此,Logger的任何子类(除非它们与新的LogManager类一起实现)都应该注意从LogManager类获取Logger实例,并且应该委托诸如“isLoggable”和“log(LogRecord)”之类的操作。那个例子。请注意,为了拦截所有日志记录输出,子类只需要覆盖日志(LogRecord)方法。所有其他日志记录方法都实现为对此日志(LogRecord)方法的调用。
所以这里是一个必须与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());
}
}
一起运行的示例,以便JVM使用新的LogManager:
temp_oil
如果您只想听事件,那么您应该只执行custom handler并避免扩展记录器。