我正在测试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
它有效。奇怪。你们是怎么做到的?
答案 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());
}