Java util 在覆盖格式化程序后记录了错误的格式

Java util logging wrong format after overriding the formatter

我想更改日志的格式,但在我覆盖格式化程序后,它仍然以旧方式输出。

private void initializeLogger() {
        logger = Logger.getLogger("gameLogger");
        try {
            Handler handler = new FileHandler("/home/bobby/IdeaProjects/GoFishBobby/src/logs/log1.txt");
            MyFormatter myFormatter = new MyFormatter();
            handler.setFormatter(myFormatter);
            logger.addHandler(handler);
            for (Handler parentHandler : logger.getParent().getHandlers())
                logger.removeHandler(parentHandler);

        }catch(IOException e){
            System.out.println("IO exception");
        }

        logger.info("Game starting : ");
    }

我覆盖了默认的 loggerFormatter

public class MyFormatter extends Formatter{
    public String format(LogRecord record){
        return record.getMessage();
    }
}

并且输出仍然包含包含我不需要的信息的信息行

SEVERE: NativePlayer : 0 Scored A Book of rank 3
Mar 05, 2017 1:15:44 PM Game logAfterPlay
INFO: The transfer hand is:
 4D 4H 4S 

编辑

刚刚发现文件里的日志是正确的,但是为什么控制台还是这样?我如何在控制台上摆脱它。我已经删除了所有父记录器。

您可以使用以下方法遍历所有当前创建的记录器来定位所有处理程序。

public static void printLoggerTree() {
    final LogManager manager = LogManager.getLogManager();
    synchronized (manager) {
        final Enumeration<String> e = manager.getLoggerNames();
        while (e.hasMoreElements()) {
            final Logger l = manager.getLogger(e.nextElement());
            if (l != null) {
                for (Handler h : l.getHandlers()) {
                    System.out.println(l.getName() + "=" + h);
                }
            }
        }
    }
}

当您的代码的不同部分请求新的记录器时,记录器树会随着时间而改变。所以调用这个方法很重要。

更好的做法是使用以下命令在命令行上设置您自己的 logging.properties file and configure your project to use that on startup. You also don't need to create your own formatter as you can change the format pattern of the SimpleFormater

-Djava.util.logging.SimpleFormatter.format="%5$s%n"