我创建了一个具有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是一个漫长的过程,在应用程序处理过程中我可以看到这些日志非常重要。
+1被搞砸了。另外,如果你直接使用System.out.println而不是'debug',那么日志会更简单:否则你最终会在两行中产生两个时间戳等等,以及其他日志记录。 – artbristol
良好的捕捉:)我没想到除非他使用“空白”布局来摆脱第二次日志调用的格式化(这很奇怪),并且使用了其他一些appender来调试'debug()'而不是'System.out' – Raffaele
主要想法是我想使用“Runtime.exec()”。我确实执行了一些必须在Jar1中的代码。我已经试过你的代码,但它仍然在Jar2过程完成后打印所有日志,这是合乎逻辑的。如你所说;因为“代码等待子流程完成,因为您在流结束后登录了该行”! – Brad