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 楼答案
该输出直接发送到系统。通过Thread::getUncaughtExceptionHandler出错
根据OpenJDK ThreadGroup::uncaughtException
这段代码绕过了日志框架,直接打印到系统中。抛出未捕获异常并转义当前线程的run方法时出错
如果希望代码包含时间戳,则必须执行以下操作之一: