gpt4 book ai didi

java - 如何从另一个jar逐行打印日志?

转载 作者:行者123 更新时间:2023-12-02 07:34:19 24 4
gpt4 key购买 nike

我创建了一个具有 2 个 Jar 文件的 Java 应用程序。 Jar1 用于初始化并运行 Jar2,使用以下代码:

Process process = runtime.exec( "java -jar Jar2.jar" );
printLogs( process );
.
.
.
private static boolean printLogs( Process process ) {
try {
BufferedInputStream logStream = new BufferedInputStream( process.getInputStream() );
String logs = "";
int buffer = 0;

while ( ( buffer = logStream.read() ) != -1 ) {
logs += (char)buffer;
}

if( !logs.isEmpty() ) logger.debug( logs );
} catch (IOException e) {}

return true;
}

我使用 Log4J 从 Jar2 打印许多日志,即

logger.debug( "..." );

但是 Jar2 中的日志都没有打印到控制台。我发现这是因为日志返回到 Jar1 而不是控制台,所以我使用上面的代码打印了返回流。现在日志打印正常,但在所有 Jar2 进程结束后,所有日志都会立即打印在 Jar1 中。

问题是:我可以及时打印 Jar2 中的每个日志行,而不是等待所有 Jar2 进程结束吗?

因为 Jar2 是一个漫长的过程,因此在应用程序处理时能够看到这些日志非常重要。

最佳答案

整个事情很困惑。您不需要两个单独的存档和 Runtime.exec()

但是,通常使用 BufferedReader.readLines 来读取文本行。请注意,如果您在阅读每一行时记录它,问题就会消失:

BufferedReader input = new BufferedReader(
new InputStreamReader(process.getInputStream())
);
String line = null;

while ((line = input.readLine()) != null) {
System.out.println(line);
}

您的代码等待子进程完成,因为您在流结束后(即子进程终止后)记录了该行

这是一个演示程序,它使用长时间运行的 Ruby 程序作为监视进程

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Subprocess {

static final String[] program = new String[] {
"ruby",
"-e" ,
"(1..5).each{|i|sleep 1;puts i;STDOUT.flush}"
};

public static void main(String[] args) throws IOException {
ProcessBuilder builder = new ProcessBuilder(program);
builder.redirectErrorStream();

Process child = builder.start();

String line = null;
BufferedReader in = new BufferedReader(
new InputStreamReader(child.getInputStream()));

while ((line = in.readLine()) != null)
System.out.println(line);
}

}

关于java - 如何从另一个jar逐行打印日志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12476786/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com