【问题标题】:extends java.util.logging.Logger not working扩展 java.util.logging.Logger 不工作
【发布时间】:2016-06-22 19:38:20
【问题描述】:

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

【问题讨论】:

  • 您在哪里创建记录器类的实例?
  • 它是为我们拥有的每个班级创建的。这是一个示例code public class AuthModel implements Serializable { ... private static final Logger logger = Logger.getLogger(AuthModel.class.getName()); ... public String part1() throws IOException { logger.log(Level.FINE, "in part1"); //---我的扩展类没有被调用code
  • 您希望 getLogger() 如何知道您的子类以及它的返回和实例?
  • 对不起,我按 Shift+Enter 但输出似乎没有生效!甚至尝试将代码包装在 mini-markdown 中,但它似乎不起作用..对不起,这个网站的新手
  • 定义一个子类和获取该子类的实例是两件不同的事情。老实说,这是一个非常基本的 Java 和面向对象编程主题,根本不特定于日志记录。

标签: java exception-handling java.util.logging


【解决方案1】:

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

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

如果您只想监听事件,那么您应该简单地实现 custom handler 并避免扩展记录器。

【讨论】:

  • 谢谢错过了@override。
  • 这似乎是对 JUL 实现进行子类化的唯一设计方法,而且有点麻烦。这样做的主要缺点是它不允许您做我需要的事情,即使用其他方法(例如,一些辅助方法)扩展Logger API。
  • @Guss 如果您想将您的应用程序绑定到 LogManager 和 Logger 子类,您始终可以转换 getLogger 的结果。 private static final AbhorentLogger logger = (AbhorentLogger) Logger.getLogger("logger.name");
  • 是的,如果人们被锁定在一个糟糕的 API 中,向下转换是最后的避难所...... :-( 我的经验法则 - 如果你正在做向下转换,你就是使用了错误的 API。
猜你喜欢
  • 2015-05-27
  • 2015-12-01
  • 2013-03-08
  • 2013-02-18
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多