【问题标题】:Java - Problem with the logger on consoleJava - 控制台上的记录器出现问题
【发布时间】:2019-08-01 16:24:23
【问题描述】:

我正在用 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 | - | - | - |

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

谁能解释一下为什么记录器会这样?

【问题讨论】:

    标签: java eclipse


    【解决方案1】:

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

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

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

    【讨论】:

    • 由于问题提到了 Eclipse,我想补充一点,下一个版本(4.13)计划添加一个选项来保证控制台输出顺序。见eclipse.org/eclipse/news/4.13/…
    猜你喜欢
    • 2020-02-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    相关资源
    最近更新 更多