首页 > 解决方案 > Java - 控制台上的记录器出现问题

问题描述

我正在用 Java 开发 Connect4 游戏,但我遇到了 Logger 问题。我不知道为什么在其他类型的印刷品之间印刷在不同的地方广告。

public void setPlacement(Move lastMove){
    Logger.getGlobal().info("Player" + lastMove.getPlayerIndex() + " placed a checker in position : " + lastMove.toString());
    display();
}

display() 方法只是打印游戏的网格。这是上述方法的输出:

| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| - | - | - | - | - | - | - |
| - | - | - | - | - | - | - |
| - ago 01, 2019 6:10:24 PM it.unicam.cs.pa.connectFour.GameViewsetPlacement
INFO: Player1 placed a checker in position : column 4, row 5
| - | - | - | - | - | - |
| - | - | - | - | - | - | - |
| - | O | O | O | - | - | - |
| O | X | X | X | - | - | - |

*****************************

有人可以解释一下为什么记录器会这样吗?

标签: javaeclipse

解决方案


对有关 System::out 和 System::err 的问题的回答可能会对您有所帮助具体来说,您的控制台同时显示两个输出流,发送到不同流的消息之间没有顺序保证。

使 Logger 能够写入标准输出流的一种方法是创建您自己的StreamHandler并将您的 Logger 配置为将输入发送到处理程序。您可能还必须禁用父处理程序以避免重复输出。您可能还希望确保将输出主动发送到所需的输出流,如下所示:

Handler h = new StreamHandler(System.out, formatter)
    {
        public void publish(LogRecord record)
        {
            if(record == null)
                return;
            super.publish(record);
            super.flush();
        }
    };

推荐阅读