我創建了一個具有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