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

标签 java java.util.logging

我正在测试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)方法进行格式化。对于类名,此方法使用相关 LogRecordsourceClassName 属性;并且仅当该属性为 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.LoggerMyLoggerImpl 调用,这就是打印它的名字的原因。要检查这一点,您可以使用 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/

相关文章:

java - 如何在 jenkins 上启用调试日志记录?

java - 哪个 weblogic jar 文件包含 com.bea.logging.BaseLogRecord?

java - 无法捕获 servlet 中的主键异常

java - 将 Iterable<T> 转换为 T[] 的可重用方法?

java - 在 JVM 关闭时触发 AutoClosable

java - 如何在 spring mvc java 中自定义过滤器 302 状态代码和 response.redirect 到自定义页面?

java - Spring Boot 出现 NOT_FOUND 问题?

Java HttpClient 似乎在缓存内容

java - 精细日志记录 org.postgresql.jdbc.PgConnection setAutoCommit = false

java - 如何从 2 行 java.util.logging 输出中抑制日期行?