有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么日志中的stacktrace前面没有这一行?

亲爱的

我有以下代码:(Move.java)

public void execute(ArrayList<Move> performedMoves) {

    logger.debug(Thread.currentThread().getName() + " executing: from: " + from.getX() + ", " + from.getY() + " -> "
            + to.getX() + ", " + to.getY() + " p: " + piece.getShortDebug() + "->" + piece.executed + ", "
            + piece.rollbacked + ";" + "|" + piece.getCurrentPlace().getX() + ", "
            + piece.getCurrentPlace().getY());

    if (executed && !rollbacked) {

        throw new RuntimeException("this shouldn't be...");
    }

    //(more code)

    from.remove(piece); // line 111, throwing the exception

    to.setPiece(piece);

    piece.setCurrentPlace(to);

这是日志:

2021-03-07 11:12:57 DEBUG Move:195 - Thread-3 rollBack: from: 0, 2 -> 1, 2 p: t->true, false|0, 2
2021-03-07 11:12:57 DEBUG Move:148 - Thread-3 rollBack: from: 2, 1 -> 1, 2 p: p->true, false|1, 2
2021-03-07 11:12:57 DEBUG Move:156 - Thread-3 false, false|1, 2
2021-03-07 11:12:57 DEBUG Move:168 - Thread-3 false, false|1, 2
2021-03-07 11:12:57 DEBUG Move:195 - Thread-3 rollBack: from: 2, 1 -> 1, 2 p: p->true, false|2, 1
Exception in thread "Thread-3" org.bamboomy.c44.board.IllegalPlaceException: this piece wasn't here :-( -> 2, 0 == 2, 9=>t->true, true
        at org.bamboomy.c44.board.Place.remove(Place.java:190)
        at org.bamboomy.c44.board.Move.execute(Move.java:111)
        at org.bamboomy.c44.board.Robot$Agent.evaluate(Robot.java:753)
        at org.bamboomy.c44.board.Robot$Agent.evaluate(Robot.java:772)
        at org.bamboomy.c44.board.Robot$Agent.evaluate(Robot.java:772)
        at org.bamboomy.c44.board.Robot$Agent.evaluate(Robot.java:772)
        at org.bamboomy.c44.board.Robot$Agent.run(Robot.java:608)
        at java.base/java.lang.Thread.run(Thread.java:834)
2021-03-07 11:12:58 DEBUG Robot:374 - 0:-1.7976931348623157E308
2021-03-07 11:12:58 DEBUG Robot:374 - 1:-1.7976931348623157E308

为什么日志中的stacktrace前面有:

2021-03-07 11:12:57 DEBUG Move:195 - Thread-3 rollBack: from: 2, 1 -> 1, 2 p: p->true, false|2, 1

而不是像:

2021-03-07 11:12:57 DEBUG Move:195 - Thread-3 executing: from: 2, 1 -> 1, 2 p: p->true, false|2, 1

(引发异常之前的日志条目)

(在同一类中的另一个方法中完成“回滚”调试项)

此外:

如果由于某些同步问题,例如,该日志条目被吞没(我假设是这样的):我如何强制或刷新日志,以便获得该调试消息的输出

这是非常有价值的信息,它将在调试一个复杂的问题时帮助我很多

感谢阅读/指点

美国

编辑:我使用log4j1.2.17

记录器是这样初始化的:

final static Logger logger = Logger.getLogger(Move.class);

共 (1) 个答案

  1. # 1 楼答案

    该输出直接发送到系统。通过Thread::getUncaughtExceptionHandler出错

    根据OpenJDK ThreadGroup::uncaughtException

    public void uncaughtException(Thread t, Throwable e) {
        if (parent != null) {
            parent.uncaughtException(t, e);
        } else {
            Thread.UncaughtExceptionHandler ueh =
                Thread.getDefaultUncaughtExceptionHandler();
            if (ueh != null) {
                ueh.uncaughtException(t, e);
            } else if (!(e instanceof ThreadDeath)) {
                System.err.print("Exception in thread \""
                                 + t.getName() + "\" ");
                e.printStackTrace(System.err);
            }
        }
    }
    

    这段代码绕过了日志框架,直接打印到系统中。抛出未捕获异常并转义当前线程的run方法时出错

    如果希望代码包含时间戳,则必须执行以下操作之一:

    1. 实现一个Thread.UncaughtExceptionHandler来记录日志框架。然后在应用程序启动时将其附加到all threadssubset of threads。请记住,在具有复杂类加载器结构的环境中,此处理程序可能会锁定类加载器并导致内存泄漏。良好的代码卫生是在应用程序即将关闭时删除这些处理程序
    2. 在可运行或可调用的实现中,捕获Throwable并将其记录到日志框架中