我遇到了一个让我感到困惑的问题。我想尝试使用JUL日志记录(JDK日志记录)进行一些操作。我从以下简单程序开始:

package biz.ple;

import java.util.logging.LogManager;
import java.util.logging.Logger;

public class Application {

    public static void main(String[] args)
    {
        Logger logA = LogManager.getLogManager().getLogger("LoggerA");
        Logger logB = LogManager.getLogManager().getLogger("LoggerB");
        if (logA == null) {
            System.out.println("LoggerA is null!");
        }
        if (logB == null) {
            System.out.println("LoggerB is null!");
        }

        String normalMsg = "Message without cookie prefix.";
        String cookieMsg = "[Cookie] Message with a cookie prefix.";

        logA.info(normalMsg);
        logA.info(cookieMsg);
        logB.info(normalMsg);
        logB.info(cookieMsg);
    }
}

令人惊讶的是,记录器logA和logB始终为null。我在文档中读到,该应用程序没有任何强引用的记录器随时都可以被GC,但是在我看来,变量logA和logB确实是强引用,不是吗?

我真的不明白这一点,将不胜感激。

最佳答案

我的理解是,这只会获得现有的记录器,而不会创建该名称的新记录器。要创建新的记录器,您需要使用静态Logger.getLogger("myLogger");命令

public static void main(String[] args){
    Logger log=Logger.getLogger("myLogger");

    Logger logA = LogManager.getLogManager().getLogger("myLogger"); //exists
    Logger logB = LogManager.getLogManager().getLogger("nonExistantLogger"); //is null

}

Logger.getLogger(“myLogger”)javadoc:

LogManager.getLogManager()。getLogger(“myLogger”)javadoc

10-01 08:34