重写格式化程序

时间:2017-03-05 19:18:33

标签: java java.util.logging

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

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 

修改

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

1 个答案:

答案 0 :(得分:0)

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

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文件,并将项目配置为在启动时使用该文件。您也不需要在命令行上change the format pattern of the SimpleFormater创建自己的格式化程序,使用以下命令:

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