我正在测试java.util.logging
,当我记录消息时它显示错误的类。这是我的代码:
我有一个界面MyLogger:
package ptest2;
public interface MyLogger {
public void info(String message);
}
我有一个实现类MyLoggerImpl,它使用java.util.logging
实现接口(interface)MyLogger
:
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();
}
}
我运行它,这就是我得到的:
10-Apr-2015 12:17:18 PM ptest2.MyLoggerImpl info
INFO: This is INFO level message
但这就是我应该得到的:
10-Apr-2015 12:17:18 PM ptest2.ClientClass2 info
INFO: This is INFO level message
我没有发现代码有任何问题。我做错了什么?我怎样才能得到所需的结果?
更新
其他问题是关于格式化消息的。但我对消息的格式很满意。我担心的是为什么该消息显示错误的类别。
我已经查看了java.util.logging
的源代码(谢谢Oracle)。
消息通过SimpleFormatter
类的public同步字符串格式(LogRecord record)
方法进行格式化。对于类名,此方法使用相关 LogRecord
的 sourceClassName
属性;并且仅当该属性为 null 时,它才会使用相关 LogRecord
loggerName
属性
在Logger
类中,当调用public void info(String msg)
方法时,它会设置相关的loggerName
属性日志记录
。
在 Logger
类中,当调用 public void logp(Level level, String sourceClass, String sourceMethod, String msg)
方法时,它会设置 相关
属性。 LogRecord
的sourceClassName
所以在MyLoggerImpl类中而不是我调用
@Override
public void info(String message) {
logger.info(message);
}
我改为
@Override
public void info(String message) {
logger.logp(Level.INFO, logger.getName(), "info", message);
}
并且它有效。奇怪的。大家对此有何看法?
最佳答案
java.util.logging.Logger
从 MyLoggerImpl
调用,这就是打印它的名字的原因。要检查这一点,您可以使用 ClientClass2
进行测试。直接然后(并且只有那时)它才会打印 ptest2.ClientClass2
.
顺便说一句,我不知道你为什么要创建自己的 Logger API,看看 slf2j 或 logback,没有必要重新发明轮子。
更新:您已将记录器更新为使用 logger name
其中 class name
预计作为 logp
的参数方法,因此它会根据当前的日志记录模式进行打印。您可以遵循此方法或更改模式。在前一种情况下,您可以更改 MyLoggerFactory
接受Class<?>
参数:
public static MyLogger getMyLogger(Class<?> clazz) {
return new MyLoggerImpl(clazz.getSimpleName());
}
关于java - 为什么当我记录消息时 java.util.logging 显示错误的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29566249/