简体   繁体   English

扩展java.util.logging.Logger无法正常工作

[英]extends java.util.logging.Logger not working

I want to extend the java.util.logging.Logger class. 我想扩展java.util.logging.Logger类。

I have the following code. 我有以下代码。 I am "forcing an error" in our app and the class I created is not being called. 我在我们的应用程序中“强制出错”并且我创建的类没有被调用。

Here is the error I am generating on purpose but it doesn't go in the code I wrote: 这是我故意生成的错误,但它不包含在我写的代码中:

//Generate error to test the logger
String[] myStringArray = new String[3];
String test;
test = myStringArray[5];    

I also tried this but it still doesn't go in my code even if I have the same function definition: 我也试过这个,但即使我有相同的函数定义,它仍然没有进入我的代码:

logger.log(Level.FINE, "test my logger");

Here is my logger extension. 这是我的记录器扩展。 Is it possible for this to get triggered when an unhandled exception is "raised". 当未提出的异常被“引发”时,是否可能触发此操作。

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

As @leonbloy and @E-Riz pointed out, per the documentation : 正如@leonbloy和@ E-Riz指出的那样,根据文档

Therefore, any subclasses of Logger (unless they are implemented in conjunction with a new LogManager class) should take care to obtain a Logger instance from the LogManager class and should delegate operations such as "isLoggable" and "log(LogRecord)" to that instance. 因此,Logger的任何子类(除非它们与新的LogManager类一起实现)应该注意从LogManager类获取Logger实例,并且应该将诸如“isLoggable”和“log(LogRecord)”的操作委托给该实例。 。 Note that in order to intercept all logging output, subclasses need only override the log(LogRecord) method. 请注意,为了拦截所有日志记录输出,子类只需要覆盖日志(LogRecord)方法。 All the other logging methods are implemented as calls on this log(LogRecord) method. 所有其他日志记录方法都实现为此日志(LogRecord)方法上的调用。

So here would be an example that must be run with -Djava.util.logging.manager=bad.idea.OdiousLogManager so the JVM uses the new LogManager: 所以这是一个必须使用-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());
    }
}

If you only want to listen to events then you should simply implement a custom handler and avoid extending logger. 如果您只想听事件,那么您应该只是实现自定义处理程序并避免扩展记录器。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM