如何在不从应用程序撕毁输出的情况下重定向JVM输出?

2022-09-02 21:19:09

最近我正在编写一些微基准测试代码,因此我必须打印出JVM行为以及我的基准测试信息。我使用

-XX:+PrintCompilation
-XX:+PrintGCDetails

和其他选项来获取 JVM 状态。对于基准测试信息,我只是使用方法。因为我需要知道我打印的消息的顺序和JVM输出。System.out.print()

当我只是在控制台中打印出来时,我可以得到好的结果,尽管JVM输出有时会撕裂我的消息,但由于它们位于不同的线程中,因此它是可以理解和接受的。

当我需要做一些批处理基准测试时,我想将输出重定向到一个文件中,并使用python从文件中获取结果并进行分析。pipe (> in Linux system)

这是问题所在:

JVM 输出总是与我在 Java 应用程序中打印的消息重叠。它破坏了消息的完成。

任何想法如何处理这种情况?我需要将 JVM 输出和应用程序输出放在同一位置,以便保留序列,因为它很重要。而且它们彼此不重叠,所以我不会丢失任何东西。


答案 1

我建议稍微绕一下弯路,看看使用Java Instrumentation API - 使用(编写)一个简单的Java代理来做到这一点。从您的基准测试角度来看,这也将为您提供更大的动力。您可以使用 Java 代理记录所有内容(因此不同记录器线程之间不会发生争用)。

您可以在 http://www.javabeat.net/2012/06/introduction-to-java-agents/ 或 http://today.java.net/pub/a/today/2008/04/24/add-logging-at-class-load-time-with-instrumentation.html 阅读更多内容


答案 2

请尝试使用 代替 。 强制在同步部分内刷新流,至少您的输出不会混合。System.out.println()System.out.print()System.out.println()