为什么java.util.logging在我记录消息时显示错误的类

时间:2015-04-10 16:22:55

标签: java java.util.logging

我正在测试java.util.logging,当我记录消息时它显示错误的类。这是我的代码:

我有一个界面 MyLogger

package ptest2;

public interface MyLogger {
    public void info(String message);
}

我有一个实现类 MyLoggerImpl ,它使用MyLogger实现接口java.util.logging

package ptest2;

import java.util.logging.Logger;

public class MyLoggerImpl implements MyLogger { 
    private Logger logger;

    public MyLoggerImpl(String name) {
        logger = Logger.getLogger(name);
    }   

    @Override
    public void info(String message) {
        logger.info(message);
    }
}

我有一个 MyLoggerFactory 类,它有一个静态方法,可以接受String name参数并提供MyLogger

package ptest2;

public class MyLoggerFactory {
    public static MyLogger getMyLogger(String name) {
        MyLogger myLogger = new MyLoggerImpl(name);
        return myLogger;
    }
}

现在我创建一个使用日志记录的类 ClientClass2 。它有一个显示INFO级别消息的方法:

package ptest2;

public class ClientClass2 {
    private static MyLogger LOGGER = MyLoggerFactory.getMyLogger("ClientClass2");

    public void method2() {
        LOGGER.info("This is INFO level message");
    }
}

为了测试它,我创建了一个类 TestLoggingClientClass2

package ptest2;

public class TestLoggingClientClass2 {
    public static void main(String[] args) {
        ClientClass2 clientClass2 = new ClientClass2();

        clientClass2.method2();
    }
}

我跑了,这就是我得到的:

  

2015年4月10日下午12:17:18 ptest2.MyLoggerImpl info
INFO:这是INFO   等级消息

但这是我应该得到的:

  

2015年4月10日下午12:17:18 ptest2.ClientClass2信息
信息:这是INFO   等级消息

我没有看到代码有任何问题。我做错了什么?如何获得所需的结果?

更新

其他问题是格式化邮件。但我对消息的格式没问题。我关心的是消息显示错误的类的原因。

我查看了java.util.logging的源代码(谢谢Oracle)。

邮件采用public synchronized String format(LogRecord record)SimpleFormatter方法格式化。对于类名,此方法使用相关sourceClassName的{​​{1}}属性;并且只有当该属性为null时,它才使用相关LogRecord

loggerName属性

LogRecord类中,当调用Logger方法时,它会设置相关public void info(String msg)的{​​{1}}属性。

loggerName类中,当调用LogRecord方法时,它会设置相关Logger的{​​{1}}属性。

所以在 MyLoggerImpl 类而不是我调用

public void logp(Level level, String sourceClass, String sourceMethod, String msg)

我改为

sourceClassName

它有效。奇怪。你们是怎么做到的?

1 个答案:

答案 0 :(得分:1)

java.util.logging.Logger调用

MyLoggerImpl,这就是打印其名称的原因。要检查这一点,您可以直接从ClientClass2进行测试,然后(仅在此时)它会打印ptest2.ClientClass2

BTW我不知道你为什么要创建自己的Logger API,看看slf2j或logback,重新发明轮子没什么意义。

更新:您已更新记录器以使用logger name class name作为logp方法的参数,以便根据当前的日志模式。您可以按照此方法或更改模式。在前一种情况下,您可以将MyLoggerFactory更改为接受Class<?>参数:

public static MyLogger getMyLogger(Class<?> clazz) {
    return new MyLoggerImpl(clazz.getSimpleName());
}