我基本上做了以下事情:
Process process = new ProcessBuilder().command( ... ).start();
InputStream stdout = process.getInputStream();
LoggerFactory.getLogger( this.class ).debug...?
有没有办法将InputStream
写入记录器,以便我的记录设置管理它?或者我应该采取另一种方法来捕获过程输出?
更新:我已经重写了这一点,因为我刚刚意识到我已经阅读了Process/ProcessBuilder
API错误且getInputStream()
是STDOUT
更新2 理想情况下,实现这一目标的方式将允许我处理stdout / stderr(一次一行)而不是一段时间。
答案 0 :(得分:1)
以下是我使用的类的已编辑片段
public class CommandLineLogger {
private static final Logger logger = LoggerFactory.getLogger(CommandLineLogger.class);
public void logStandardOutput(InputStream inputStream) {
display("stdout", inputStream);
}
private void display(String identifier, InputStream inputStream) {
logger.debug("Printing output from {}", identifier);
try {
String formattedIdentifier = identifier + ":";
logInputStream(formattedIdentifier, inputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
private void logInputStream(String outputType, InputStream inputStream) throws Exception {
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferReader = new BufferedReader(inputStreamReader);
while (true) {
String line = bufferReader.readLine();
if (line != null) {
logger.debug(outputType + ": " + line);
} else {
break;
}
}
}
}
答案 1 :(得分:0)
如果您愿意使用库,zt-exec非常方便,可以将进程的stdout和stderr重定向到SLF4J。
例如,要将stdout重定向到调用类的记录器的信息级别并将stderr重定向到错误级别:
new ProcessExecutor().command("java", "-version")
.redirectOutput(Slf4jStream.ofCaller().asInfo())
.redirectError(Slf4jStream.ofCaller().asError())
.execute();