java – 如何获取一个子类的记录器?
我有一个子类和一个超类.在超类中我有一种记录某些东西的方法.当我创建子类的实例时,记录器将为超类创建一个日志记录消息.为什么会发生这种情况?
代码示例: SuperClass.java import java.util.logging.Level; import java.util.logging.Logger; public abstract class SuperClass { public void logAndPrintClass(){ String name = this.getClass().getName(); System.out.println(name); Logger logger = Logger.getLogger(name); logger.log(Level.INFO,"Logmessage"); } } SubClass.java public class SubClass extends SuperClass { } TestLogBubClass.java public class TestLogBubClass { public static void main(String[] args){ SuperClass obj = new SubClass(); obj.logAndPrintClass(); } } 输出: SubClass Mar 15,2013 6:30:04 PM SuperClass logAndPrintClass INFO: Logmessage 正如您可以看到类的名称正确打印,但在日志消息中不正确地表示. 解决方法
这个原因是在JavaDoc for
LogRecord中:
在这种情况下,调用堆栈以SuperClass定义的方法结束,所以LogRecord假定它是被调用的类.如果要查看此操作,请执行以下代码: public class Example { public static class Superclass { public void foo() { new Exception().printStackTrace(); } } public static class Subclass extends Superclass { // nothing here } public static void main(String[] argv) throws Exception { Superclass s = new Subclass(); s.foo(); } } 编辑:我不使用j.u.l,但希望有一个简单的方法来配置输出(像其他所有的logger实现提供).看来你必须实现自己的Formatter类,并使用java.util.logging.ConsoleHandler.formatter属性指定它. 如果可能,我建议切换到SLF4J.您可以将所有现有的j.u.l代码通过SLF4J桥接到实际的记录器,从而可以更好地控制其输出(如Log4J或Logback). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |